机器学习实战(二)个人笔记

程序主体:

  • 以kNN算法为基础
  • 增加了文件数据导入函数
  • 增加了可视化操作
  • 增加了算法错误率判定
 1 # -*- coding:utf-8 -*-
 2 from numpy import *
 3 import operator
 4 import math
 5 import matplotlib
 6 import matplotlib.pyplot as plt
 7 import numpy as np
 8 import random
 9 import collections
10
11 def classify0(inX,dataSet,labels,k):
12      dataSetSize = dataSet.shape[0]
13      diffMat = tile(inX,(dataSetSize,1)) - dataSet
14      sqDiffMat = diffMat**2
15      print sqDiffMat
16      sqDistances = sqDiffMat.sum(axis = 1)
17      distances = sqDistances.argsort()
18     # sortedDistIndicies = distances.argsort()
19      classCount=collections.OrderedDict()
20      for i in range(k):
21          voteIlabel = labels[distances[i]]
22          classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1
23      print classCount
24      sortedClassCount = sorted(classCount.iteritems(),key = operator.itemgetter(1),reverse = True)
25      print sortedClassCount
26      return sortedClassCount[0][0]
27
28 def file2matrix(filename):
29     fr = open(filename)
30     arrayOLines = fr.readlines()
31     numberOfLines = len(arrayOLines)
32     returnMat = zeros((numberOfLines,3))
33     classLabelVector = []
34     index = 0
35     for line in arrayOLines:
36         line = line.strip()
37         listFromLine = line.split(‘ ‘)
38         returnMat[index,:] = listFromLine[0:3]
39         classLabelVector.append(int(listFromLine[0]))
40         index+=1
41     return returnMat,classLabelVector
42
43 def autoNorm(dataSet):
44     minVals = dataSet.min(0)
45     maxVals = dataSet.max(0)
46     ranges = maxVals - minVals
47     normDataSet = zeros(shape(dataSet))
48     m = dataSet.shape[0]
49     normDataSet = dataSet - tile(minVals,(m,1))
50     normDataSet = normDataSet/tile(ranges,(m,1))
51     return normDataSet,ranges,minVals
52
53 datingdataMat,datingLabels = file2matrix(‘/Users/tiemuer/PycharmProjects/kNN/data.txt‘)
54 fig = plt.figure()
55 ax = fig.add_subplot(111)
56 ax.scatter(datingdataMat[:,0],datingdataMat[:,1],15.0*array(datingLabels),15.0*array(datingLabels))
57 plt.show()
58
59 def datingClassTest():
60     hoRatio = 0.10
61     datingdataMat,datingLabels = file2matrix(‘/Users/tiemuer/PycharmProjects/kNN/data.txt‘)
62     normMat,ranges,minVals = autoNorm(datingdataMat)
63     m = normMat.shape[0]
64     numTestVecs = int(m*hoRatio)
65     errorCount = 0.0
66     n = []
67     for i in range(numTestVecs):
68        n.append(int(random.randint(0,m)))
69     for i in n:
70         classifierResult = classify0(normMat[i,:],normMat[:m,:],datingLabels[:m],3)
71         print "the classifier cameback with %d,the real answer is:%d"%(classifierResult,datingLabels[i])
72         if(classifierResult!=datingLabels[i]):errorCount+=1.0
73     print "the total error rate is %f"%(errorCount/float(numTestVecs))
74
75
76 datingClassTest()

算法改进

  • 由于需要不同,书籍上的代码并不能很好契合程序,故作出一些改进。
  • 文件数据导入函数中classLabelVector.append(int(listFromLine[0])),其中把listFromLine[-1]变为[0],因为本程序用每组数据第一个位置来做label,这样才能与后面寻找label契合。
  • 本程序选取数据集中随机10%的数据来与原数据集进行匹配,因为数据集不够,且数据集完全随机生成,进而发现问题:对于小数据来说很难做到错误率低。主要原因在于对于相近邻的数据统计次数过少,且普通字典是无序排放,导致不能选出最契合的label,本人针对此问题选用有序字典进行label存储,可以进一步改善算法准确率。
  • 上一篇文章的kNN算法需要改动,删掉本程序中注释掉的代码(多进行了一次排序导致程序混乱,得不到期望结果)。
  • 由于各个数据项特征值大小不同,而它们在程序中的地位同等,故用autoNorm()函数来调整大小:(data-mindata)/(maxdata-mindata)把特征值统一到0-1之间,更具参考性。

初学python,记录学习笔记

  • 字典访问需要key,而key的获取可以用dic.keys()来得到一个list
  • 对字典进行排序时,利用迭代器方法sortedClassCount = sorted(classCount.iteritems(),key = operator.itemgetter(1),reverse = True),reverse = True 进行升序排序,返回的不是字典,而可以通过下标访问
  • open(filename)打开文件,读文件用readlines(),下面记录下read(),readline(),readlines()函数的区别:
  1. read():读取整个文件,文件内容存放于字符串变量中
  2. readline():读取文件一行,存放于字符串对象中,比readlines()慢许多
  3. readlines():读取整个文件,自动把文件分成一个行的列表
  • 普通字典是无序的,故不能利用存放次序来寻找字典元素,可以借助collections库中的collections.OrderedDict()来创建一个有序字典。
  • strip() 方法用于移除字符串头尾指定的字符(默认为空格)。例如:str.strip([chars])
  • split()通过指定分隔符对字符串进行切片,如果参数num 有指定值,则仅分隔 num 个子字符串。例如:split(‘ ‘,1)仅对于空格分割一次。
  • 这里不整理可视化作图操作,回头找个时间专门做个整理。
时间: 2024-10-20 05:35:04

机器学习实战(二)个人笔记的相关文章

《机器学习实战》读书笔记2:K-近邻(kNN)算法

声明:文章是读书笔记,所以必然有大部分内容出自<机器学习实战>.外加个人的理解,另外修改了部分代码,并添加了注释 1.什么是K-近邻算法? 简单地说,k-近邻算法采用测量不同特征值之间距离的方法进行分类.不恰当但是形象地可以表述为近朱者赤,近墨者黑.它有如下特点: 优点:精度高.对异常值不敏感.无数据输入假定 缺点:计算复杂度高.空间复杂度高 适用数据范围:数值型和标称型 2.K-近邻算法的工作原理: 存在一个样本数据集合,也称作训练样本集,并且样本集中的每个数据都存在标签,即我们知道样本集中

Python机器学习实战&lt;二&gt;:机器学习概述

1.机器学习的真实含义是利用数据来彰显数据背后的真实含义. 2.机器学习的一般用例:人脸识别.手写数字识别.垃圾邮件过滤.产品推荐等等. 3.机器学习的主要任务是分类,即将实例数据划分到合适的分类中.另一项任务是回归,主要用于预测数值型数据.分类和回归属于监督学习,之所以称为监督学习,是因为这类算法必须知道预测什么,即目标的分类信息.另一种机器学习方式是无监督学习,此时数据没有类别信息,也没有给定的目标.在无监督学习中,将数据集合分成由类似对象组成的多个类成为聚类,将寻找数据统计值的过程称为密度

《机器学习实战》学习笔记:支持向量机

该节的内容是支持向量机(SVM, support vectormachine). 这里首先要推荐一下July的SVM三层境界(http://blog.csdn.net/v_july_v/article/details/7624837)由于<机器学习实战>关于SVM一章的内容很多,本节先简单归纳一下关于支持向量机的基础. 一.概念描述 支持向量机,就是通过最大化支持向量到分类超平面之间的分类间隔.分类超平面就是我们想要得到的决策曲面:支持向量就是离分类超平面最近的点,而间隔即为支持向量到分类超平

《机器学习实战》知识点笔记目录

从今天起,开始学习<机器学习实战>,并记录学习到的知识点. -- 2017-12-31 1,第2章KNN算法笔记_函数classify0 原文地址:https://www.cnblogs.com/wang7/p/8158225.html

《机器学习实战》学习笔记:k-近邻算法实现

上一学期主要的学习和研究任务是模式识别.信号理论和图像处理,实际上这些领域都与机器学习有或多或少的交集.因此,仍在继续深入阅读<机器学习>.观看斯坦福大学的机器学习课程.在此过程中因为未来课题组项目的要求,需要接触Python,因此选择了<机器学习实战>这本书,同时参考教材和视频一起学习.事实上该书的理论研究不够深入,只能算是练习Python并验证一些著名的机器学习算法的工具书了. 在介绍k-近邻算法之前,对机器学习算法进行简单的分类和梳理:简单来说,机器学习主要分为两大类,有监督

Python3《机器学习实战》学习笔记

运行平台: Windows Python版本: Python3.x IDE: Sublime text3 一 简单k-近邻算法 1 k-近邻法简介 2 距离度量 3 Python3代码实现 31 准备数据集 32 k-近邻算法 33 整体代码 二 k-近邻算法实战之约会网站配对效果判定 1 实战背景 2 准备数据数据解析 3 分析数据数据可视化 4 准备数据数据归一化 5 测试算法验证分类器 6 使用算法构建完整可用系统 三 k-近邻算法实战之sklearn手写数字识别 1 实战背景 2 Skl

《机器学习实战》学习笔记:利用Adaboost元算法提高分类性能

一. 关于boosting算法的起源 boost 算法系列的起源来自于PAC Learnability(直译过来称为:PAC 可学习性).这套理论主要研究的是什么时候一个问题是可被学习的. 我们知道,可计算性在计算理论中已经有定义,而可学习性正是PAC Learnability理论所要定义的内容.另外,在计算理论中还有很大一部分精力花在研究问题是可计算的时候,其复杂度又是什么样的.因此,在计算学习理论中,也有研究可学习的问题的复杂度的内容,主要是样本复杂度 (Sample Complexity)

《机器学习实战》学习笔记:基于朴素贝叶斯的分类方法

概率是许多机器学习算法的基础,在前面生成决策树的过程中使用了一小部分关于概率的知识,即统计特征在数据集中取某个特定值的次数,然后除以数据集的实例总数,得到特征取该值的概率. 目录: 一.基于贝叶斯理论的分类方法 二.关于朴素贝叶斯的应用场景 三.基于Python和朴素贝叶斯的文本分类 1.准备数据 2.训练算法 3.测试算法 四.小结 以下进入正文: 一.基于贝叶斯理论的分类方法 假设有两类数据组成的数据集如下: 其中,假设两个概率分布的参数已知,并用p1(x,y)表示当前数据点(x,y)属于类

《机器学习实战》学习笔记:决策树的实现

决策树是个极其易懂的算法,也是最常用的数据挖掘算法,决策树允许机器根据数据集创造规则,其实这就是机器学习的过程.专家系统中经常会使用到决策树及其变种,而且决策树给出的结果往往可以匹敌在当前领域具有几十年工作经验的专家. 优点:决策树的计算复杂度不高,输出结果易于理解,对中间值的缺失不敏感,可以处理不相关特征数据: 缺点:可能会产生过度匹配的问题: 适用数据类型:数值型和标称型. 这一章节的主要任务是讨论决策树的方法,以及编写构造决策树的python代码,使用递归调用建立分类器,最后可使用Matp

《机器学习实战》学习笔记:Logistic回归&amp;预测疝气病证的死亡率

前言: 生活中,人们经常会遇到各种最优化问题,比如如何在最短时间从一个地点到另外一个地点?如何在投入最少的资金而却能得到最高的受益?如何设计一款芯片使其功耗最低而性能最好?这一节就要学习一种最优化算法--Logistic回归,设计最优化算法的目的依然是用于分类.在这里,Logistic回归的主要思想是根据现有的数据对分类边界线建立回归公式,达到分类的目的.假设我们有一堆数据,需要划一条线(最佳直线)对其分类,这就是Logistic回归的目的. 而"Logistic回归"中的"