此文是对机器学习实践P19页的代码分析
1,建立一个group组,每行有两个特征(或称属性),建立一个标签labels,存放组对于的目标变量。
from numpy import *
import operator
from os import listdir
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计算要输入的值(或矢量vector)与group组中的每个值之间的距离
我们以取classify0([0,0],group,labels,3)为例为例
def classify0(inX, dataSet, labels, k):#取classify0([0,0],group,labels,3)为例
dataSetSize = dataSet.shape[0] #dataSet是4x2矩阵,shape[0]获取行数=4
diffMat = tile(inX, (dataSetSize,1)) - dataSet
'''
建立一个4x2的零矩阵,并用此矩阵减group矩阵
>>> diffMat
array([[-1. , -1.1],
[-1. , -1. ],
[ 0. , 0. ],
[ 0. , -0.1]])
'''
sqDiffMat = diffMat**2
'''
矩阵取平方
>>> diffMat**2
array([[ 1. , 1.21],
[ 1. , 1. ],
[ 0. , 0. ],
[ 0. , 0.01]])
'''
sqDistances = sqDiffMat.sum(axis=1)
'''
每个矩阵的行分别求和(axis=0则列相加)
>>> sqDistances
array([ 2.21, 2. , 0. , 0.01])
'''
distances = sqDistances**0.5
'''
求平方根得到距离
>>> distances
array([ 1.48660687, 1.41421356, 0. , 0.1 ])
3,以上已经得到输入的数[0,0]与group的距离,kNN算法即要找出这些距离中最小的那些数
sortedDistIndicies = distances.argsort()
'''
从小到大将对应的索引值排序:
>>> sortedDistIndicies
array([2, 3, 1, 0], dtype=int32)
'''
classCount={}
for i in range(k):
voteIlabel = labels[sortedDistIndicies[i]]
'''
因为k=3,即取出了前三个距离最小的数对应的索引值
e.g.如取i==0时,则,sortedDistIndicies[0]==2,labels[2]=='B'
so, voteIlabel == 'B'
'''
classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1
'''
get可以获取键对应的值,这里key==voteIlabel== 'B',因为classCount是空字典
所以'B'没有对应的值,返回默认值0,因此:
>>> classCount[voteIlabel]
1
值得注意的是voteIlabel已经变成B,所以上面的含义是classCount('B')==1
然后循环i=1,voteIlabel==labels[3]==B;classCount['B']==classCount.get(B,0)+1==1+1==2
因为此时classCount已经有值,即,classCount={'B':1}
i==2,voteIlabel==labels[1]==A;classCount['A']==0+1==1
so:
>>> classCount
{'B': 2, 'A': 1}
>>>
这里实际上Count就是计数的意思,也就是说距离最小的这三个数中,有两个的目标变量是'B',
目标变量是'A'的有一个,因此显然我们输入的这个数的目标变量选'B'会更好
'''
sortedClassCount = sorted(classCount.items(), key=operator.itemgetter(1), reverse=True)
'''
以第二个域逆向排序,即以目标变量的数量来从大到小排序
>>> sortedClassCount
[('B', 2), ('A', 1)]
'''
return sortedClassCount[0][0]
'''
返回sortedClassCount矩阵中的第一行第一列(或者说第一个元组中的第一个值)