这里的重点是几个python的用法:
1.获得排序索引值。 sortedDistIndicies = distances.argsort()
2.是创建字典来计数。 classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1
3.根据不同域来排序。 sortedClassCount = sorted(classCount.iteritems(), key=operator.itemgetter(1), reverse=True)
4.第2和第3点可以组合在一起构成一个多数表决器
详细程序如下:
inX是输入向量[0,0],dataSet是训练数据[[0,0],[9,9],[0,1]],labels是对应标签[a,b,a],k是取前几个高频率出现的类别这里取2。
def classify0(inX, dataSet, labels, k):
dataSetSize = dataSet.shape[0]
diffMat = tile(inX, (dataSetSize,1)) - dataSet
PS:tile(A,reps)把数据重复多少遍的意思。
tile(inX, (dataSetSize,1))=tile([0,0], (3,1))=[[0,0],[0,0],[0,0]]
sqDiffMat = diffMat**2
sqDistances = sqDiffMat.sum(axis=1) PS:axis=1是行相加的意思
distances = sqDistances**0.5 PS:到这步骤完成了欧式距离的计算
sortedDistIndicies = distances.argsort()
PS:这边argsort()是从小打到排列,不打乱原本顺序,只取出它的索引值。
一开始原本数据就就对应标签,现在数据还是对应标签。
classCount={}
for i in range(k):
voteIlabel = labels[sortedDistIndicies[i]]
classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1
PS:这里get(voteIlabel,0) + 1 是获得字典key对应的value。
如果字典没有对应key就创建一个key初始为0然后+1,如果有就+1。
比如一开始k=0(相当于1),inX[0,0]对应距离最小的是dataSet中的[0,0]对应标签为a。这里classCount[]={a:1}。
接下来k=1(相当于2),inX距离dataSet第二小的点是[0,1]对应标签是a。这里classCount[]={a:2}。
这里的k就是选取多少个最近的点,把他们对应的标签个数统计出来,下面做多数表决。
sortedClassCount = sorted(classCount.iteritems(), key=operator.itemgetter(1), reverse=True)
PS:这里是按域排序operator.itemgetter(1)对应的就是字典里面value的域。(0对应的是key的域)。这里排序完就相当于多数表决。
return sortedClassCount[0][0]