原始代码:
程序清单0:
from numpy import *
import operator
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
执行:
>>>import knn
>>>group, labels = knn.createDataSet()
>>>group
array([[ 1. , 1.1],
[ 1. , 1. ],
[ 0. , 0. ],
[ 0. , 0.1]])
>>>labels
['A', 'A', 'B', 'B']
程序清单2-1:
程序清单2-1和上面的程序清单0是在一个.py文件里,是紧接着上面的代码写的
def classify0(inX, dataSet, labels, k):
#shape[0]获取行 shape[1] 获取列
dataSetSize = dataSet.shape[0]
#tile将inX扩充为dataSetSize行1倍inX列的矩阵
diffMat = tile(inX, (dataSetSize,1)) - dataSet
#下面三行代码计算距离
sqDiffMat = diffMat**2
sqDistances = sqDiffMat.sum(axis=1)
distances = sqDistances**0.5
#用argsort函数返回的是,数组每个元素从小到大排序后的索引值,即第1、2、3...的位置序号
sortedDistIndicies = distances.argsort()
#字典:key:label,value:前k个点中,该label的点的个数
classCount = {}
#投票并统计票数最多的label
for i in range(k):
#得到第i近的点的label,sortedDistIndicies[i]表示该点在DataSet中的序号
voteIlabel = labels[sortedDistIndicies[i]]
#在classCount中给key为voteIlabel的value +1
classCount[voteIlabel] = classCount.get(voteIlabel, 0) + 1
#将投票计距离最近的前k个点的label数的字典进行排序,返回值sortedClassCount
#类型为list[(label1,label1Count),(label2,label2Count)]每个括号内为tuple
sortedClassCount = sorted(classCount.iteritems(),
key = operator.itemgetter(1), reverse = True)
#返回sortedClassCount中第一个位置的tuple中的第一个位置的值,即得票最多的label
return sortedClassCount[0][0]
执行:
>>>knn.classify0([1,1], group, labels, 3)
>>>'A'