起步

今天介绍另一种分类算法,k邻近算法( k-nearest neighbors ),即 KNN 算法。

概述

Cover 和 Hart 在 1968 年提出了最初的邻近算法,用于解决分类( classification )的问题。关于这个算法在维基百科中也有介绍:https://zh.wikipedia.org/wiki...

KNN是一种基于实例学习( instance-based learning ),或者所是将所有计算推迟到分类之后的惰性学习( lazy learning )的一种算法,KNN是所有机器学习算法中最简单算法之一。

从案例中说起

一个有关电影分类的例子:

Image.png

这个一个根据打斗次数和接吻次数作为特征来进行类型的分类。最后一条的记录就是待分类的数据。

KNN这个分类过程比较简单的一个原因是它不需要创建模型,也不需要进行训练,并且非常容易理解。把例子中打斗次数和接吻次数看成是x轴和y轴,那么就很容易能建立一个二维坐标,每条记录都是坐标中的点。对于未知点来说,寻找其最近的几个点,哪种分类数较多,未知点就属于哪一类。

算法说明

KNN算法的思路是: 如果一个样本在特征空间中的 k 个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别。通常 K 的取值比较小,不会超过 20。

算法步骤为:

  • 计算未知实例到所有已知实例的距离;
  • 选择参数 K;
  • 根据多数表决( majority-voting )规则,将未知实例归类为样本中最多数的类别。

距离的衡量方法

关于距离的测量方式有多种,这里只介绍两种。

欧拉距离
这种测量方式就是简单的平面几何中两点之间的直线距离。

images.jpg

并且这种方法可以延伸至三维或更多维的情况。它的公式可以总结为:

$$ d(x,y) = \sqrt{\sum_{i=0}^n(x_i-y_i)^2} $$

曼哈顿距离
顾名思义,城市街区的距离就不能是点和点的直线距离,而是街区的距离。如棋盘上也会使用曼哈顿距离的计算方法:

$$ d(x,y) = \sqrt{\sum_{i=0}^n|x_i-y_i|} $$

K 值的选择

K值的选择会影响结果,有一个经典的图如下:

279px-KnnClassification.svg.png

图中的数据集是良好的数据,即都打好了 label ,一类是蓝色的正方形,一类是红色的三角形,那个绿色的圆形是待分类的数据。

    1. = 3 时,范围内红色三角形多,这个待分类点属于红色三角形。
    1. = 5 时,范围内蓝色正方形多,这个待分类点属于蓝色正方形。

如何选择一个最佳的K值取决于数据。一般情况下,在分类时较大的 K 值能够减小噪声的影响,但会使类别之间的界限变得模糊。因此 K 的取值一般比较小 ( K < 20 )。

改进

在下面一种情况中:

Image.png

在点Y的预测中,改范围内三角形分类数量占优,因此将Y点归为三角形。但是从视觉上观测,应该是分为圆形分类更为合理。根据这种情况就在距离测量中加上权重,比如 1/d (d: 距离)。

KNN 的优缺点

优点:

  • 简单,易于理解,无需建模与训练,易于实现;
  • 适合对稀有事件进行分类;
  • 适合与多分类问题,例如根据基因特征来判断其功能分类,kNN比SVM的表现要好。

缺点:

  • 惰性算法,内存开销大,对测试样本分类时计算量大,性能较低;
  • 可解释性差,无法给出决策树那样的规则。

陆安
3.2k 声望239 粉丝

宝可梦情怀粉;刀塔手残党;浴室麦霸王。