python中的kNN calssification的投票程序(array.argsort)

时间:2017-06-30 18:13:30

标签: python sorting numpy knn

我几乎是一个初学者,但我很难过,我觉得我不应该。

我正在学习使用numpy的kNN算法。代码如下:

    def kNN_classify(query, dataset, labels, k):

dataSetSize = dataset.shape[0]
diffMat = tile(query, (dataSetSize,1)) - dataset
sqDiffMat = diffMat**2
sqDistances = sqDiffMat.sum(axis=1)
distances = sqDistances**0.5
sortedIndices = distances.argsort()
classCount = dict()
for i in range(k):
    voteIlabel = labels[sortedIndices[i]]
    classCount[voteIlabel] = classCount.get(voteIlabel, 0) + 1
sortedClassCount = sorted(classCount.items(), key = 
operator.itemgetter(1), reverse=True)
return sortedClassCount[0][0]

我首先使用基本的毕达哥拉斯来获取距离查询点的距离数组。在此数组中,距离的排序方式与原始数据中的点相同,与标签相同。然后我使用argsort得到一个数组,它给出了距离的排序顺序。然后我迭代这个数组并投票给标签,该标签具有distances.argsort的第k个元素的索引。

我明白它有效,我已经测试了但我无法理解。我错过了什么?

1 个答案:

答案 0 :(得分:0)

请尝试这个。 看一下代码sqDiffMat = diffMat**2的这一部分。 然后,您可能在python3中,因此使用classCount.items()而不是classCount.iteritems()iteritems()已在python3中删除。

def classify0(inX, dataSet, labels, k):
dataSetSize = dataSet.shape[0]
diffMat = 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):
    voteIlabel = labels[sortedDistIndicies[i]]
    classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1
sortedClassCount = sorted(classCount.items(), 
                          key=operator.itemgetter(1), 
                          reverse=True)
return sortedClassCount[0][0]