【问题标题】:voting procedure for kNN calssification in python(array.argsort)python中kNN分类的投票程序(array.argsort)
【发布时间】:2017-12-04 18:40:11
【问题描述】:

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

我正在学习使用 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 个元素的索引。

我知道它有效,我已经对其进行了测试,但我不知道如何。我错过了什么?

【问题讨论】:

  • 你能修复你的缩进吗?
  • 是否有特定的代码你不明白?
  • 是的,argsort 和对结果数组的迭代如何导致对 k 个最近点进行投票。

标签: python sorting numpy knn


【解决方案1】:

请试试这个。 看看这部分代码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]

【讨论】:

    猜你喜欢
    • 2011-06-05
    • 2021-12-26
    • 2015-06-28
    • 2019-03-23
    • 1970-01-01
    • 2012-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多