kNN算法应该是一个最简单的分类算法
首先,存在一个有标签的样本数据集,然后输入无标签数据,将新输入是数据对应的特征值进行比较,让背后算法提取样本集中特征最相似数据,即为最邻近的分类标签。一般我们取前k个最相似的数据,并且以其中出现次数最多的分类作为新数据的分类。
算法中有三个基本因素:k值、距离度量、分类决策规则,在这个算法中,我们一般以欧式距离作为判别的度量方式。
(内容来源于机器学习实战)
算法的具体过程可以表述为如下:
我们对未知类别属性的数据集中的每个点进行如下操作:
(1)计算距离
已知类别数据集中的点与当前点之间的距离。
a.向量之间作差
b.差值的平方(相加)
c.开二次根号
(0,0)与(0,1)之间的欧式距离为,(0,0)-(0,1) 得到(0,-1) 平方以后得(0,1) 然后相加开根号 根号下(0+1) 得欧式距离为1
(2)按照距离排序。递增顺序
(3)选取前k个点
(4)计算前k个点的类别出现频率
(5)返回前k个点中出现频率最高的类别作为当前未知数据的预测分类。
程序及其注释如下:``
def kNN_classify(X,dataSet,labels,k): #此处X和dataSet相当于一个矩阵
dataSetSize = data.shape[0] #计算矩阵dataSet中的行数,即计算数据集中的数据个数
Mat_diff = tile(X,(dataSetSize,1)) - dataSet #将X变成与dataSet相同的矩阵,相当于每一行都是一个X,X与每一行的dataSet作差,即得到输入数据与数据集中每个数据的差值,从而计算欧式距离。
sqMat_diff = Mat_diff**2
sqDistances = sqMat_diff.sum(axis = 1) #矩阵每一行计算求和,即X与数据集中每行数据的差值平方和
ouDistances = sqDistances**0.5
sortedDisIndex = ouDistances.argsort() #按距离从小到大排序后返回之前位置的index
class = {}
for i in range(k):
voteLabel = labels[sortedDisIndex[i]] #将label按距离大小排序
class[voteLabel] = classCount.get(voteLabel ,0) + 1 #实现对不同的便签label的计数功能。
sortedClass = sorted(class.items(),key=key = operator.itemgetter(1),reverse=True) #对新到的计数后字典(相当于矩阵)按从大到小排序,即得到k个相似数据中,出现次数最多的分类
return sortedClassCount[0][0] #返回第一个即为出现次数最多的分类 实现kNN
本程序来源于机器学习实战。且该程序只为算法模拟程序,一般不在实际中使用。