不过这一期,我们要讲的不是民主制度的历史。通过雅典的民主制度,我发现一个有趣的事:在机器学习的算法中,也有一种民主,叫做KNN。作为第10期系列文章,我们就来一起看看这个KNN是如何运作、如何民主吧。


什么是KNN?

KNN,全称是K-Nearest Neighbor,也就是最近邻算法。这个算法虽然没有雅典制度那么历史悠久,但也比我们想象的要古老。Cover 和 Hart 早在 1968 年就提出了最初的邻近算法,用于解决分类的问题。我们在前几期提到了分类问题的本质,大家可以回忆一下当作复习。

它是所有机器学习分类算法中最简单的方法之一,如果你已经回忆了前几期的文章,那么一定会反应过来,它同时也可以被用来做回归算法。所谓K最近邻,就是k个最近的邻居的意思,说的是每个样本都可以用它最接近的k个邻居来代表。

商业哲学家 Jim Rohn 说过一句话,

“你,就是你最常接触的五个人的平均。

意思是,在分析一个人时,我们不妨观察和他最亲密的几个人。同理的,在判定一个未知数据时,可以观察离它最近的几个样本,根据这几个样本的信息,来判断这个数据所属的类别,这就是 KNN(k最近邻)算法。

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


KNN算法步骤

  1. 计算测试数据与各个训练数据之间的距离;

  2. 按照距离的递增关系进行排序;

  3. 选取距离最小的K个点;

  4. 确定前K个点所在类别的出现频率;

  5. 返回前K个点中出现频率最高的类别作为测试数据的预测分类

为什么KNN是一种民主算法

KNN算法的总体流程可以概括为

  • 计算未知实例到所有已知实例的距离

  • 选择参数 K

  • 根据多数表决规则,将未知实例归类为样本中最多数的类别

第3步中的多数表决规则,就是KNN为什么被称为民主算法的原因,它非常直接的使用了这种多数表决制,是机器学习中的雅典城邦。在KNN算法提出后的几十年,一种叫做”集成算法“的利器横空出世,它借鉴了这种民主制度并且在决策树城邦中发扬光大。关于这种利器,在后面的几期文章中会详细为大家介绍。

 

K值的选择

我们知道,KNN中的K代表了附近邻居的个数,它不是一个给定或者可以被计算的值,需要我们预先指定。K值的选择会影响结果,有一个经典的图如下

民主投票法——KNN的秘密_knn

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

  • K = 3 时,范围内红色三角形多,这个待分类点属于红色三角形。

  • K = 5 时,范围内蓝色正方形多,这个待分类点属于蓝色正方形。

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

改进

在下面一种情况中:

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

 

举个例子

来看一个关于电影分类的例子

这个一个根据打斗次数和接吻次数作为特征来进行类型的分类。最后一条的记录就是待分类的数据。KNN分类过程之所以它不需要创建模型,也不需要进行训练,并且非常容易理解。

把例子中打斗次数和接吻次数看成是x轴和y轴,那么就很容易能建立一个二维坐标,每条记录都是坐标中的点。对于未知点来说,寻找其最近的几个点,哪种分类数较多,未知点就属于哪一类。


KNN的本质

简单来说,KNN是一种基于实例学习,或者所是将所有计算推迟到分类之后的惰性学习的一种算法,KNN是所有机器学习算法中最简单算法之一。很容易可以发现,KNN的本质就是基于度量的无模型实例学习。先来看看距离的选择:

距离的衡量方法

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

  1. 欧氏距离

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

民主投票法——KNN的秘密_knn_02

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

民主投票法——KNN的秘密_knn_03

 

曼哈顿距离

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

民主投票法——KNN的秘密_knn_04

 

 

虽然不太严谨,但我将KNN理解为一种度量学习。所谓度量学习,就是基于距离进行数据的分类、回归等模式识别。KNN有两个核心,一个是民主投票,还有一个就是距离。

距离(度量)决定了你如何判断哪几个样本离你最近,不同的距离会有不同的结果。我们最常用的距离(度量)就是欧几里得距离,也就是生活中常见的XY坐标系距离。关于其他更复杂的距离,在之后的文章中会单独介绍,这里先按下不表~


KNN适用场景

我们知道,KNN方法在确定分类决策上只依据最邻近的一个或者几个样本的类别来决定待分样本所属的类别。 KNN方法在类别决策时,只与极少量的相邻样本有关。由于KNN方法主要靠周围有限的邻近的样本,而不是靠判别类域的方法来确定所属类别的,因此对于类域的交叉或重叠较多的待分样本集来说,KNN方法较其他方法更为适合。

民主投票法——KNN的秘密_knn_05

平时,KNN算法的精度常常不如一些先进的模型,是不是说我们就不再使用它了呢?并不是。举个例子,我们现在拿到一个学习任务,需要去选择一个学习器去解决该问题,而且也没有任何对该问题研究的前车之鉴,那么,从何下手?通常,我们不需要上来就用一个神经网络模型或者强大的集成学习模型去做,而是可以先用一用简单模型做一下“试探”,比如KNN就是一个很好的选择,这样的“试探”的好处在哪里呢?

我们前面已经说过,KNN本质上属于懒惰学习的代表,也就是说它根本就没有用训练数据去拟合一个什么模型,而是直接用top-k个近邻的样本点做了个投票就完成了分类任务,那么如果这样一个懒惰模型在当前的问题上就已经能够得到一个较高的精度,则我们可以认为当前的学习任务是比较简单的,不同类别的样本点在特征空间中的分布较为清晰,无需采用复杂模型。

反之,若knn得到的精度很低,则传达给我们的信息是:该学习任务有点复杂。往往伴随着的消息就是,当前问题中不同类别样本点在特征空间中分布不是清晰,通常是非线性可分的,需要我们去调用更强大的学习器。

从而,一个简单的knn机器学习算法恰恰可以帮助建模者对问题的复杂度有一个大概的判断,协助我们接下来如何展开进一步的工作:继续挖掘特征工程、或者是更换复杂模型等。

 

KNN的优缺点

优点:

简单,易于理解,无需建模与训练,易于实现;

适合对稀有事件进行分类;

适合与多分类问题,例如根据基因特征来判断其功能分类,kNN比SVM的表现要好。

缺点:

惰性算法,内存开销大,对测试样本分类时计算量大,性能较低;

可解释性差,无法给出决策树那样的规则。

 

民主投票法——KNN的秘密_knn_06

 

民主投票法——KNN的秘密_knn_07

 

 

民主投票法——KNN的秘密_knn_08