【有监督分类】k-NearestNeighbor (kNN)

KNN算法思路

kNN是通过测量不同样本之间的距离进行分类,认为样本可以最接近它的k个邻居来代表。
在这里插入图片描述

思路

 如果一个样本在特征空间中的k个邻居样本中的大多数属于某一个类别,则该样本也属于这个类别,通常k20k\leqslant20kNN算法中,所选择的邻居都是已经正确分类的对象。

算法过程

InputXtrainYtrainXtestInput:X_{train},Y_{train},X_{test}
Output:YtestOutput: Y_{test}

  1. 计算当前测试样本XtestX_{test}每个训练样本XtrainX_{train}之间的距离
  2. 按照距离的递增关系进行排序
  3. 选取距离最小k个点
  4. 确定前k个点的类别频率
  5. 返回前k个点中出现频率最高的类别作为YtestY_{test}

优点

  1. 简单,易实现,无需估计参数,无需训练
  2. 适合稀有事件分类问题(例如当流失率很低时,比如低于0.5%,构造流失预测模型)
  3. 适合多分类问题,例如根据基因特征来判断其功能分类,kNN比SVM的表现要好

缺点

  1. 懒惰算法,对测试样本分类时的计算量大,内存开销大,评分慢
  2. 可解释性较差,无法给出决策树那样的规则

常见问题

k值的选取对分类的结果影响至关重要

k值较小,则模型复杂度较高,容易发生过拟合,分类结果易受噪声点影响,学习的估计误差会增大,预测结果对近邻的实例点非常敏感。
k值较大,导致分类模糊,可以减少学习的估计误差,但是学习的近似误差会增大,与输入实例较远的训练实例也会对预测起作用,使预测发生错误。此外,k值增大,模型的复杂度会下降。
 在应用中,k值一般取一个比较小的值(经验规则:低于训练样本数的平方根),通常采用交叉验证法来选取最优的k值,还可以用贝叶斯、bootstrap。
对距离加权,可以降低k值设定的影响。

近似误差:模型估计值与实际值之间的差距,训练误差。最小化近似误差容易过拟合。
估计误差:模型的估计系数与实际系数之间的差距,测试/泛化误差。最小化估计误差,模型的泛化能力好。

距离/相似度:常用欧式距离,夹角余弦

(1)高维度:变量数越多,欧式距离的区分能力就越差。
(2)变量值域:值域越大的变量常常会在距离计算中占据主导作用,因此应先对变量进行标准化

《模式分类》中指出欧式距离对平移是敏感的,这点严重影响了判定的结果。在此必须选用一个对已知的变换(比如平移、旋转、尺度变换等)不敏感的距离度量。书中提出了采用切空间距离(tangent distance) 来替代传统的欧氏距离。

在这里插入图片描述

类别判定:加权投票法

投票法没有考虑近邻的距离的远近,距离更近的近邻也许更应该决定最终的分类,所以加权投票法更好。

训练样本权重

在训练集中,有些样本可能是更值得依赖的。可以给不同的样本施加不同的权重,加强依赖样本的权重,降低不可信赖样本的影响。

性能

模型很简单,计算开销大(因为要扫描全部训练样本并计算距离)。
提高计算效率的方法:压缩训练样本量等。

减少训练样本量,同时保持精度

浓缩技术(condensing)
编辑技术(editing)

应用:推荐系统

为每个内容寻找k个与其最相似的内容,并推荐给用户。

参考

https://blog.csdn.net/jmydream/article/details/8644004
https://www.cnblogs.com/lzida9223/p/8368048.html
https://scikit-learn.org/stable/modules/neighbors.html#classification
https://www.cnblogs.com/ybjourney/p/4702562.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章