第2章 K近邻算法 代码code2-1 解析
def classify0( inX, dataSet, labels, k ):
''' 1、inX :类别未知的样本的特征向量(行向量),即自变量向量
2、dataSet:训练样本集
3、labels : 标签向量
4、k :用于选择最近邻的数 '''
dataSetSize = dataSet.shape[0]
''' dataSetSize为dataSet中的样本量 '''
diffMat = tile(inX, (dataSetSize,1)) - dataSet
''' numpy中的tile函数将行向量inX重复dataSize次,排成一列(每行完全
相同),这样得到与dataSet行数和列数相同的数组,可以与dataSet
做差运算,diffMat的第i行为inX与dataSet的第i行的对应元素的差值
'''
sqDiffMat = diffMat**2
''' 将diffMat中的每一个元素求平方 '''
sqDistances = sqDiffMat.sum(axis=1)
''' 将数组sqDiffMat按行求和 '''
distances = sqDistances**0.5
sortedDistIndicies = distances.argsort()
''' 返回distances排序(升序)后的序号。sortedDistIndices的第i个
元素为distances中的元素排序(升序)后的第i个元素在distances中的序位号 '''
classCount={}
for i in range(k):
voteIlabel = labels[sortedDistIndicies[i]]
''' voteIlabel为距离inX第i近的训练样本的类别标签 '''
classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1
''' 若classCount中没有voteIlabel这个键,则字典方法“get”返回0,
否则返回键voteIlabel的值 '''
sortedClassCount = sorted(classCount.iteritems(), key=operator.itemgetter(1), reverse=True)
''' Dict.iteritems() 用于返回一个键值对“迭代项”,如:
D = {'y': 7, 'x': 3, 's': 6, 'z': 5}
Item = D.iteritems()
Item.next()
Item.next()的运行
结果为('y', 7),('x', 3).
key=operator.itemgetter(1) 表示安照返回的“迭代项”的第1个元素排序,如
L = [('a',2,'F'),('d',1,'E'),('c',3,'O'),('e',8,'W'),('b',6,'P')]
sorted(L,key = operator.itemgetter(2))
结果:[('d', 1, 'E'), ('a', 2, 'F'), ('c', 3, 'O'), ('b', 6, 'P'), ('e', 8, 'W')]
'''
return sortedClassCount[0][0]