【机器学习实战】学习代码分析(1)
今天开始学习《机器学习实战》这本书,以下为第二章开始的相关代码分析以及自己的注释,为了方便以后阅读回顾。
个人为python小白,决定从这本书开始一点点学习掌握python,如果有人看到这个系列的博文,欢迎评论指正交流。
# -*- coding: cp936 -*-
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
def classify0(inX, dataSet,labels, k):
#inX:输入向量 dataSet:训练集 label:分类标签 k:选择近邻数
dataSetSize=dataSet.shape[0]
#知道数据集里有几行,每行为一个元素
diffMat=tile(inX,(dataSetSize,1)) - dataSet
#让输入向量和训练集的元素个数相同,相当于把输入向量复制为训练集的个数
#如训练集为([[a],[b],c]]),输入向量也为([[i],[i],[i]])
#再让输入向量与训练集作差形成矩阵([[i-a],[i-b],[i-c]])
#记为[[Xc1,Yc1],[Xc2,Yc2],[Xc3,Yc3]]
sqDiffMat = diffMat**2
#把diffMat里的每个元素都平方,记为[[Xc1^2,Yc1^2],[Xc2^2,Yc2^2],[Xc3^2,Yc3^2]]
sqDistances=sqDiffMat.sum(axis=1)
#将sqDiffMat中的元素按行相加,就是把每个元素的横坐标相加,纵坐标相加
#[[Xc1^2+Yc1^2],[Xc2^2+Yc2^2],[Xc3^2+Yc3^2]]
distances=sqDistances**0.5
#把diffMat里的每个元素都开根号
#此时相当于求出输入向量与训练集每点之间的距离√(Xi-Xa)^2+(Yi-Ya)^2
sortedDistIndicies = distances.argsort()
#把距离从大到小排序后输出对应数据的在distances里的位置
classCount={} #建立一个dictionary
for i in range(k):
voteIlabel = labels[sortedDistIndicies[i]]
#将从i-k个离输入向量最近的训练集数据标签赋给voteIlabel
classCount[voteIlabel]=classCount.get(voteIlabel,0)+1
#统计相应标签的在k个里面出现的数目
sortedClassCount=sorted(classCount.iteritems(),key=operator.itemgetter(1),reverse=True)
#首先要排序的对象时classcount中的(训练集数据,标签)
#key=operator.itemgetter(1) key具有获取第1个域值的能力即获取标签
#从大到小排序
return sortedClassCount[0][0]
#返回发生频率最高的标签
注意!!!
2.7里classCount.iteritems()在3.6里要改成classCount.items()
我找错时简直令人窒息,就是调用不了一个函数,发现最后电脑卡住了,运行时没有自动保存默认没有加载那个函数。
2.1.2实施kNN算法