此学习笔记是基于《机器学习实战》中的内容所写的,虽然不是什么大神,但是还是写出来和大家分享,希望能有帮助。如果文章中有什么错误,也敬请指正。此外,有些代码其实现在我也不太理解,所以没有写出来,如果有什么问题希望大家能一起讨论,一起进步。
更多内容见书2.1.2 实施kNN分类算法
1.kNN代码
import numpy as np
import operator
def classify0(inX,dataSet,labels,k):
dataSetSize=dataSet.shape[0]
diffMat=np.tile(inX,(dataSetSize,1))-dataSet
sqDiffMat=diffMat**2
sqDistances=sqDiffMat.sum(axis=1)
distances=sqDistances**0.5
sortedDistIndicies=distances.argsort()
classCount={}
for i in range(k):
votelIlabel=labels[sortedDistIndicies[i]]
classCount[votelIlabel]=classCount.get(votelIlabel,0)+1
sortedClassCount=sorted(classCount.iteritems(),key=operator.itemgetter(1),reverse=True)
return sortedClassCount[0][0]
def createDateSet():
group=np.array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]])
labels=['A','A','B','B']
return group,labels
以下是我在理解这段代码时的笔记
1.shape[0]返回的是行数(shape[1]返回列数)
在理解shape函数时,我参考了http://blog.csdn.net/by_study/article/details/67633593
在group中,是一个4*2矩阵,行数为4,即dataSetSize=4
group=np.array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]])
2.tile函数
参考文章https://jingyan.baidu.com/article/219f4bf7da4d8dde442d389e.html
假设输入向量inX为(x0,y0),那么tile函数做了这个工作,化为[[x0,y0],[x0,y0],[x0,y0],[x0,y0]]
diffMat=np.tile(inX,(dataSetSize,1))-dataSet
即为[[x0-1.0,y0-1.1],[x0-1.0,y0-1.0],[x0-0,y0-0],[x0-0,y0-0.1]]
3.sum函数
sqDistances=sqDiffMat.sum(axis=1)
anis=0表示按行求和,anis=1表示按列求和
>>> np.sum([[0, 1], [0, 5]], axis=0) array([0, 6]) >>> np.sum([[0, 1], [0, 5]], axis=1) array([1, 5])
因此此时执行的是(x0-1.0)^2+(y0-1.1)^2,……以此类推
4.argsort函数
sortedDistIndicies=distances.argsort()
该函数的作用是将数组中的各个元素从小到大排列,提取出索引值并输出新的数组
参考文章http://www.cnblogs.com/yyxf1413/p/6253995.html
到这一步位置,已经计算出当前点与所有数据点的距离并将这些距离从小到大排列出来
接下来
for i in range(k):
votelIlabel=labels[sortedDistIndicies[i]] #确定前k个点所对应的标签
classCount[votelIlabel]=classCount.get(votelIlabel,0)+1
sortedClassCount=sorted(classCount.iteritems(),key=operator.itemgetter(1),reverse=True)
return sortedClassCount[0][0] #返回发生频率最高的元素标签
参考文章1.http://www.cnblogs.com/100thMountain/p/4719503.html
参考文章2.http://www.cnblogs.com/zle1992/p/6271105.html
6.iteritems函数
参考文章http://www.cnblogs.com/huxi/archive/2011/07/01/2095931.html
最后在python开发环境中输入下列命令:
>>> import kNN
>>>
group
, labels = kNN.createDataSet()