机器学习实战这本书比较适合像我一样的初学者学习。书中介绍了重要的机器学习算法及python实现代码。由于编程能力一般,我在学习过程中遇到很多不懂的代码。用心做了注释,希望能坚持写下去,自我提升并希望能帮到入门的学习者。笔者能力有限,有所错误的地方希望读者指出并理解~
第二章K~近邻算法
准备:
from numpy import *
import operator
def createDataSet():
group = array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]])#数据集,包含四个点坐标
labels = ['A','A','B','B']#标签
return group,labels
程序清单2-1
def classify0(inX,dataSet,labels,k):#inX:输入向量,dataSet:训练样本集,此处即CReatDataSet函数反回的group,labels:标签向量,k要选取的最近邻点的数目
dataSetSize = dataSet.shape[0]#这里返回矩阵的行数
diffMat = tile(inX,(dataSetSize,1)) - dataSet#tile函数有重复的功能,inX本来有一行一列,现在是datasetsize行,一列,与矩阵dataset相减即可得到坐标相减后的结果
sqDiffMat = diffMat**2#上面得到的坐标相减形成的矩阵,这里乘方是实现欧拉公式,配合下几步计算距离
sqDistances = sqDiffMat.sum(axis=1)#sum方法中axis为1将按行求和,自行脑补为0情况~
distances = sqDistances**0.5#开根号,这一步完成欧拉公式,距离就计算出来了
sortedDistIndicies = distances.argsort()#将上边得到的包含距离的数组从小到大排序(argsort方法),他返回的是值对应的键,然后赋值
classCount = {}
for i in range(k):
voteIlabel = labels[sortedDistIndicies[i]]#判断离目标点最近的K个点的类型,sorteddistindicies[i]返回的是group组里某个值的键,与labels里的标签一一对应
classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1#这里判断每个最近邻点的类型,然后相应的类型+1,get方法读取字典元素,若voteilabel不存在,就返回后面的0
sortedClassCount = sorted(classCount.iteritems(),key = operator.itemgetter(1),reverse = True)#sorted函数用于排序,当reverse为True时降序排列,operator模块的itemgetter方法,使按照第二个元素排列。这里书中的iteritems()在python3.0中已经废除了,故改为items(),将字典以列表形式返回
return sortedClassCount[0][0]#字典返回,第一个零指返回哪一组 第二个指返回键还是值
程序清单2-2#将文本记录转换为Numpy的解析程序
def file2matrix(filename):
fr = open(filename)#打开文件,当文件不在当前目录下时,需要指定路径,参考格式open('F:\\机器学习\\MLiA_SourceCode\\machinelearninginaction\\Ch02\\datingTestSet.txt')
arrayOLines = fr.readlines()#返回一个列表,每行文字为一个元素
numberOfLines = len(arrayOLines)#获取列表长度,即是文件的行数
returnMat = zeros((numberOfLines,3))#创建一个有numberOfLines行,3列的零矩阵
classLabelVector = []
index = 0
for line in arrayOLines:
line = line.strip()#strip方法截取掉所有回车字符
listFromLine = line.split('\t')#然后用tab('\t')将整行数据分隔成一个元素列表
returnMat[index,:] = listFromLine[0:3]#listFromLine[0:3]选取前三个元素,注意这里returnMat[index,:]有一个逗号,就是选取了第index行整行,将前三个元素存储到第index行中
classLabelVector.append(int(listFromLine[-1]))#负索引从-1开始,这里存储列表最后一列
index += 1
return returnMat,classLabelVector
希望自己能一直写下去,也希望能帮助到一些人,大家一起进步