KNN算法的工作原理为:
存在一个样本数据的集合,也称作训练样本集合,并且样本集的每个数据都存在标签。输入没有标签的新数据后,将新数据的每个特征与样本集中数据对应的特征进行比较,然后算法提取样本集中特征最相似的分类标签,一般只选择样本集中前K个最相似的数据,前K个相似数据中出现次数最多的分类作为新数据的分类。
创建knn.py的文件,在pycharm的命令行窗口切换到该文件所在的目录,输入Python指令后进入Python命令行,输入下列命令来导入模块
K近邻算法源码:
from numpy import *
import operator
from os import listdir
def classify0(intX,dataSet,labels,k):
dataSetSize = dataSet.shape[0]#得到训练集的行数
#tile的第一个参数表示要复制的数组,第2参数表示复制后的矩阵规模,及行*要复制数组列的倍数
diffmat = tile(intX,(dataSetSize,1))-dataSet
sqDiffMat = diffmat**2
#对行求和,得到N*1的数组也即列向量,axis=0是对行求和
sqDistances = sqDiffMat.sum(axis=1)
distances = sqDistances**0.5
#对数组进行升序排序
sortedDistIndicies = distances.argsort()
classCount = {}
#对前K个距离较小的元素进行遍历
for i in range(k):
#对前k个值的label进行计数
voteIlabel = labels[sortedDistIndicies[i]]
classCount[voteIlabel] = classCount.get(voteIlabel,0)+1
#根据计数值的大小降序排列
sortedClassCount = sorted(classCount.items(),key=operator.itemgetter(1),reverse=True)
#返回计数值最多的label值
return sortedClassCount[0][0]
对未知类别属性的数据集中的每个点依次执行下列操作:
计算已知类别数据集中的点与当前点之间的距离;按照距离递增次序排列选取与当前点距离最小的k个点确定前k个点所在类别出现的频率返回前k个点出现频率最高的类别作为当前点的预测分类
待预测的输入向量:intX,训练样本集:dataSet,标签向量:labels,最近邻居的数目:K
上面的程序清单中使用了欧氏距离来计算两个向量点xA和xB之间的距离:
代码解析:
shape[0]方法用于获取样本集的个数
tile函数用行复制的方式将输入数据扩展为相应规模的矩阵。第二个参数为规模元组,元组的第一项表示行数,第二项表示列数相对于第一个参数扩展的倍数。如输入的参数为(0,0),扩展后的矩阵如下:
然后将该矩阵与训练集矩阵相减和平方后仍是4*2矩阵,利用sum函数,将axis参数设置成1,进行矩阵的行相加得到4*1的列向量,在开根号得到欧氏距离,再将距离进行升序排序。
classCount字典是用于统计前k个距离最近的邻居的标签及对应的个数。利用sorted函数根据item的数据项值进行降序排列,最后返回次数最多的项所对应的标签,作为预测结果。