最近在看《机器学习实战》这本书,这本书的讲的第一个算法就是k近邻算法,以前也有看过k近邻算法的介绍,这次是自己编写实现,感觉对k近邻算法的计算过程熟悉了很多。
K近邻算法是通过测量不同特征之间的距离来进行分类的一种分类算法,是属于监督学习中一种比较基本的分类算法,它的计算原理如下:
(1)准备好样本训练数据,每个训练数据对应一个分类标签,训练数据越完善,分类的效果越好,但是计算量也越大
(2)计算测试数据到训练数据中每一个样本的距离,假设训练数据共有n个,那么距离就是一个n维向量
(3)将上述的n维向量进行排序,选择与测试样本最近的k的训练数据,取出这k个训练数据的类别,返回这k个点出现频率最高的类别作为当前测试数据的类别
在计算距离时,我这里采用的是欧式距离的计算公式,欧式距离认为每一个元素对距离的贡献都是相同的,有一定的局限性,在实际分类中,也可以采用马氏距离来计算距离。
k近邻分类的python代码如下:
#KNN分类函数
#inx-->输入向量
#DataSet-->训练数据
#Labels-->标签向量
def classify(inx,DataSet,Labels,k):
DataSize=DataSet.shape[0]
DiffMat=np.tile(inx,(DataSize,1))-DataSet #复制测试数据
SQDiffMat=DiffMat**2 #这里采用距离的平方作为判断标准
Distance=SQDiffMat.sum(axis=1)
SortedDisIndices=Distance.argsort() #提取排序后的下标
ClassCount={}
#选取最靠近测试数据的前k个训练数据,对类别进行累加
for i in range(k):
Vote=Labels[SortedDisIndices[i]]
ClassCount[Vote]=ClassCount.get(Vote,0)+1
SortedClassCount=sorted(ClassCount.iteritems(),key=operator.itemgetter(1),reverse=True)
return SortedClassCount[0][0]
这里有一个有趣的例子可以用k近邻算法进行分析。
海伦使用约会网站寻找自己合适的约会对象,经过一番总结,她发现曾交往过三种类型的人
1.不喜欢的人 标记类别为1
2.魅力一般 的人 标记类别为2
3.极具魅力的人 标记类别为3
此外,海伦还收集了一些约会网站未曾记录的数据信息,通过对每一个人(样本)的某些特征进行收集,放在了文本文件datingTestSet2.txt文件中,文件中每一行为一个样本。收集的特征如下:
(1)每年飞行的里程数
(2)玩视频游戏所耗时间百分比