伪代码:
对未知类别属性的数据集中的每个点依次执行以下操作:
(1)计算已知类别数据集中的点与当前点之间的距离;
(2)按照距离递增次序排序;
(3)选取与当前点距离最小的k个点;
(4)确定前k个点所在类别的出现频率;
(5)返回前k个点出现频率最高的类别作为当前点的预测分类。
实际的python代码:
def classify0(inX,dataSet,labels,k):
dataSetSize=dataSet.shape[0]
diffMat=tile(inX,(dataSetSize,1))-dataSet #将输入向量转化为二维数组,重复次数为dataSetSize
sqDiffMat=diffMat**2 #距离计算
sqDistances=sqDiffMat.sum(axis=1) #按列相加
distances=sqDistances**0.5 #开根号
sortedDistIndices=distances.argsort()
classCount={} # 字典
for i in range(k): # 选择距离最小的k个点
voteIlabel=labels[sortedDistIndices[i]]
classCount[voteIlabel]=classCount.get(voteIlabel,0)+1 #统计前k个点所在类别的出现次数
sortedClassCount=sorted(classCount.iteritems(),key=operator.itemgetter(1),reverse=True) #按出现次数降序
return sortedClassCount[0][0] #返回出现次数最多的类别
代码解释:
classify0()函数有4个输入参数:用于分类的输入向量是inX,输入的训练样本集为dataSet,标签向量为labels,最后的参数k表示用于选择最近邻居的数目,其中标签向量的元素数目和矩阵dataSet的行数相同。
计算完所有点之间的距离后,可以对数据按照从小到大的次序排序。然后没确定前k个距离最小元素所在的主要分类,输入k总是正整数;最后,将classCount字典分解为元组列表,然后使用程序第二行导入运算符模块的itemgetter方法,按照第二个元素的次序对元组进行排序。此处的排序为逆序,即按照从大到小次序排序,最后返回发生频率最高的元素标签。