KNN的基本原理及应用

K nearest neighbor

KNN,全名k近邻算法。

KNN的核心思想是先计算每个样本与单个特征空间上的距离(距离可有欧式距离、曼哈顿距离、马氏距离等,详见附录一),再找出与每个样本距离最近的k个点,最后将其归类为k个邻居中类别最多的那一类;

适用场景:一般多用于分类任务,也可用来处理回归任务。

优点:

  • 原理简单,易于理解;
  • 对异常值不敏感;
  • 对数据的特征类型没有明确的要求;

缺点:

  • 样本不平衡问题,容易将样本分入类别中样本较多的那一类;
  • 特征较多时,计算复杂度高,空间复杂度高;
  • 相比决策树,KNN的可解释性不强;

关键点:

  • k值的选取,k值为10以内的奇数(奇数是为了避免出现打成平手的情况),也可以通过交叉验证的方式来选取得到合适的k值。

 进阶:

  • 在上面介绍到KNN可以通过一一计算新样本与原有样本的距离可以将其分类,但是在新样本量较大的情况下就会面临较大的计算量的问题,所以有了kd树,本质上主要是为了降低计算的复杂度而提出的,具体原理我自己也不是很清楚。

本文探讨性问题:

  1. KNN主要多用于解决分类问题,但是目前流行的是用XGB、lightgbm这种集成学习模型,那么现在KNN是否还有它独特的使用场景?
  2. 关于处理回归问题,如何计算其最终的预测值?根据得到的k个近邻样本,计算这k个近邻的均值作为其预测值。(参考文章:经典算法之K近邻(回归部分))
  3. 欢迎大家积极讨论补充

 参考文章:

  1. 《统计学方法》李航,p37-45;
  2. 《机器学习实战》李锐等译,p15-31:主要是手撕代码,个人认为没有必要,确实可以提高coding能力,但是与时间的消耗不成正比;
  3. CNN RNN fast-RNN BP DNN KNN各自的适用场景和优缺点,主要是看到了该博主介绍原理的思路框架,有所启发;

  4. KNN算法优缺点;

附录 

由于KNN的原理比较简单,所以还是简单补充一下计算距离的方法:

1、 较为通用的公式L_p distance(也可以认为前提假设是:各特征间相互独立)

公式为:L_p(x_i,x_j) = (\sum_{l=1}^{n}\left | x_i^{(l)}- x_j^{(l)}\right |^p)^{\frac{1}{p}},是\left | x_i^{(l)}- x_j^{(l)}\right |的p范数;

①当p=1时,为曼哈顿距离,只计算水平和垂直的距离;

②当p=2时,就是常见的欧式距离

③当p=\infty时,公式退化为L_\infty (x_i,x_j) = max \left | x_i^{(l)}- x_j^{(l)}\right |;

2、马氏距离

马氏距离主要是考虑额各特征间的相关性,具体公式如下:

d(\vec{x}, \vec{y})=\sqrt(\vec{x}-\vec{y})\times \mho ^{-1}\times (\vec{x}-\vec{y})^{T}其中\mho ^{-1}为协方差阵。

 3、余弦距离等其他距离

你可能感兴趣的:(机器学习,ml,机器学习)