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
group,labels=createDataSet()
def classify0(inX,dataSet,labels,k):
dataSetSize = dataSet.shape[0] #获取数据集的行数,即数据集样本个数。
diffMat = tile(inX,(dataSetSize,1)) - dataSet #测试样本与数据集中的每个样本做差。
sqDiffMat = diffMat**2
sqDistances = sqDiffMat.sum(axis=1) #计算列表中以第1轴为一个单位的所有元素之和。
distances = sqDistances**0.5
sortedDistIndicies = distances.argsort() # argsort()函数返回的是数组值从小到大的索引值。
classCount = {} #创建一个字典
for i in range(k): #当k=3时,i的取值只有0,1,2.
voteIlabel = labels[sortedDistIndicies[i]] #获取sortedDistIndicies列表中的元素所对应的标签。
classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1 #将获取到的标签存入字典classCount中去,依此累加。
sortedClassCount = sorted(classCount.items(),key=operator.itemgetter(1),reverse=True) #对字典中的信息按照降序排列。
#个人认为其中key=operator.itemgetter(1)是对字典进行items()操作之后的对象的操作,即是对一个新列表的操作,该列表格式如下:
#[('B', 2), ('A', 1)]。itemgetter(1)表示对列表中元组元素的操作,即0代表‘B’/‘A’,1代表‘2’/‘1’.最后就是对提取的元素进行排序。
return sortedClassCount[0][0] #第一个[0]表示[('B', 2), ('A', 1)]中的('B', 2)。第二个[0]表示('B', 2)中的B。
print(classify0([0,0],group,labels,3))
结果:
B
附图一张: