机器学习实战--K近邻算法实现(一)

xiaoxiao2021-04-18  98

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的数据项值进行降序排列,最后返回次数最多的项所对应的标签,作为预测结果。

 

 

 

 

转载请注明原文地址: https://www.6miu.com/read-4820148.html

最新回复(0)