- 概述
Knn算法是相对来说比较简单的一个算法,也是比价容易理解的。他是一种用距离衡量样本间关系的一种算法,由于样本点的分类是已知的,所以用需要测试的点,找到与其距离相近的k个点(一般用欧式距离),我们就把这个测试的点归类为这k个点中占比重较大的分类。
- 模型
K近邻算法,没有显式的学习过程,每次运算都要用到所有的点,即计算到所有点的距离,一般是用欧式距离进行衡量。这里和聚类分析算法过程的衡量方法比较相似,聚类分析是通过距离运算找到一堆距离比较近的点,knn也是找到距离相近的点。感觉都有一些人以类聚,物以群分的感觉,就是将属性相近的点聚在一起,从这个层面来说,knn也是适用于多分类,多特征值的问题。
Knn算法有三大要素:距离度量,k值选择,分类决策选择。
- 距离度量
常见的距离有Lp
距离,Minkowski(闵可夫斯基)距离,欧氏距离,在knn中常用的是欧式距离,也是我们最好理解的距离,即我们常见的点与点的之间的距离。
- k值的选择
k值的选择对分类结果的准确性有十分重要的影响。
如果k值选择较小的值,就相当于用更少的邻域值去预测,这样的话抗噪性就比较差,对选择的邻域内的值就比较敏感。举个极限的例子,假设k取1,如果最后取到的值正好是个噪声点,那么分类结果就不准确了。
如果k值取较大的值,那么就是需要用更多的邻域值去做预测,那么就可以在一定程度上减小噪声点的影响,就可以减小估计误差,但是会增大近似误差,就是距离较远的点也会有预测作用,有可能是不相似的点。想一下极限情况,当k为N就是所有实例点都要参与预测,也就是说好多不相干的点也起了作用。
一般情况下,我们选择较小的k值,但是这个k值需要用交叉验证法去找到合理的k值。
- 分类策略
分类策略就是找到k个点之后,如何利用这些点去分类。常见的方法就是多数表决法。误分的概率为:
![]()
其具体的计算方式如下,其损失函数为0-1损失:

c是x的分类,I(yi ≠ cj) = 1表示损失为1,I(yi = cj) = 0损失为0。所以我们的目标就是要使上式最下,也就是经验风险最小化。
其实除了多数表决法,我们也可以为不同的点增加权重,就是把所有的点的距离乘以一个系数,距离越近,系数越大,在分类模型中起到的作用也越大。
- kd树
knn算法的缺点之一,就是计算复杂,每次都需要计算所有的点的距离,找出距离最近的k个点。kd树的作用就是事先将样本点做处理,将其按照一定规则构建成一棵树,从而可以快速找到距离最近的点。具体的树的构建过程以及遍历规则,这里不做介绍,有兴趣的可以自己查阅相关资料。
2242



被折叠的 条评论
为什么被折叠?



