1 算法描述
K近邻模型是个十分通俗易懂的模型,给定一个点,我们只要找到和他在空间中最近的K个点,这K个点中出现次数最多的类别,就是这个点的分类,具体算法如下:
如果了解其他机器学习模型朋友肯定会发现,这个模型和我们以往学到的机器学习模型有些区别,其没有决策函数也没有条件概率分布, 只有一个决策规则:
这个规则就是选择实例中最多的那一类。
K近邻算法是一类基于实例的学习方法,基于实例的方法顾名思义,所有的分类是来自与实例的,而非某个确定的决策函数,所以我们也不需要对数据进行训练,只需等待待分类的数据来了加进实例就行。
同时K近邻算法也是**消极学习(lazy learning)**方法,消极学习一般不会建立决策函数或是条件概率分布,而只是把实例储存起来,直到有需要分类的新的实例时,才分析其与存储的样例之间的关系,据此确定新实例的目标函数值。例如局部加权回归也是消极学习。
2 K近邻算法相关问题
从上面的算法中我们可以看出,有两类问题是亟待解决的。
- 一是距离的度量,如何衡量两个点的远近,特别是在高纬空间中;
- 二是K值的选取,到底选择多少个邻近值合适;
- 三是对于高维的数据,假如有很多不相关的属性怎么办?
- 四是如何在样本点中快速找到与待分类点最近的点;
2.1 距离的度量
在特征空间中,两个实例点之间的距离是连个实例点相似程度的反应,我们在机器学习中一般使用的是Lp距离
更多的距离度量可以参考《矩阵论》的范数章节。但P的取值不同时,所对应的距离也是不同的,以至于求得的最近邻的点也是不同的,在不同的请情况可以选择不同的度量,对于距离的选择是一个值得研究的问题,看过一篇KNN距离度量选择的论文,文中这么写道:
The distance function effect on k-nearest neighbor classification for medical datasets
’‘By using four different distance functions, which are Euclidean, cosine, Chi square, and Minkowsky, our experimental results show that k-NN by the Chi square distance function can make the k-NN classifier perform the best over the three different types of datasets. On the other hand, using the Euclidean distance function performs reasonably well over the categorical and numerical datasets, but not for the mixed type of datasets.’'
在他的实验中,卡方距离表现的最为出色,同时欧氏距离也表现的较好,但是对于混合型的数据集就不太行了。具体的选择,还是在实际操作中,灵活的变换。
2.2 K值的选择
对于不同的K值,模型的性能也会不一样。
- 当K为N时,无论输入什么实例,都是当前实例中最多的类,过于简单,性能也是很差;
- 当K不断的减小,只有那些与待分类实例相近的点才会影响实例的分类,性能也会逐渐变好;
- 当K过小的时候,只有最近的几个点会影响实例的分类,假如遇到噪声,就很容易被误分类,也就降低的模型的性能
模型的性能会随着k的减小而不断增大,到一定的点又回降低分类的性能。这是我们在机器学习模型优化过程中常见的问题。一般的解决方案就是利用交叉验证法,利用不同的K值在验证集上进行测试,而选择表现最好的K值
2.3 不相关属性值的处理
假如待分类的数据有20维,而影响分类的属性只有2个,那么其余18个属性都是无用的,就会造成维度灾难。解决这个问题最好的办法是属性加权法。
对于每一个属性分类时都增加一个权值,对分类影响较大的属性基于较大的权值,反之则给予较小的权值,这样就能很好的避免维度灾难的问题。
但是问题又来了,怎么能找到最合适的权值呢?又需要用到我们的交叉验证法,选取一些数据作为验证集,在验证集上不断的调节权值,直至能够有最高的分类精度。
2.4 快速进行K近邻搜索(kd-tree)
在大量的数据中,找到与待分类数据最近的K个点并不是一件容易的事情。我们肯定会首先想到线性的比较方法,逐一的对数据进行比较。但是对于大量的数据,特别是维度较高的数据,计算量会非常大。于是我们思考,能不能用一种更加合适的办法存储数据。
一种方法是kd-tree,它把实例储存在树的叶节点内,邻近的实例储存在同一个或附近的节点内。在需要分类时,把实例放入树的节点中,并查询节点及节点附近的实例并进行分类。
具体的kd-tree算法可以参考李航的《统计学习方法》一书,或者其他博文。
3 总结
K近邻(KNN)模型是很基本的分类与回归方法,他的最大优点是无需进行复杂的训练,只需要在分类阶段找到与之相近的节点即可。
但是怎么找到最近的节点,找多少个又是需要多多思考和探索的问题。特别是如何建立索引快速找到邻近实例的问题,目前已经有很多方法对存储的样例进行索引,大家可以查阅相关的资料。