我几乎是一个初学者,但我很难过,我觉得我不应该。
我正在学习使用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个元素的索引。
我明白它有效,我已经测试了但我无法理解。我错过了什么?
答案 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]