分类算法之邻近算法:KNN(理论篇)
起步
今天介绍另一种分类算法,k邻近算法( k-nearest neighbors
),即 KNN 算法。
概述
Cover 和 Hart 在 1968 年提出了最初的邻近算法,用于解决分类( classification
)的问题。关于这个算法在维基百科中也有介绍:https://zh.wikipedia.org/wiki... 。
KNN是一种基于实例学习( instance-based learning
),或者所是将所有计算推迟到分类之后的惰性学习( lazy learning
)的一种算法,KNN是所有机器学习算法中最简单算法之一。
从案例中说起
一个有关电影分类的例子:
这个一个根据打斗次数和接吻次数作为特征来进行类型的分类。最后一条的记录就是待分类的数据。
KNN这个分类过程比较简单的一个原因是它不需要创建模型,也不需要进行训练,并且非常容易理解。把例子中打斗次数和接吻次数看成是x轴和y轴,那么就很容易能建立一个二维坐标,每条记录都是坐标中的点。对于未知点来说,寻找其最近的几个点,哪种分类数较多,未知点就属于哪一类。
算法说明
KNN算法的思路是: 如果一个样本在特征空间中的 k
个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别。通常 K 的取值比较小,不会超过 20。
算法步骤为:
- 计算未知实例到所有已知实例的距离;
- 选择参数 K;
- 根据多数表决(
majority-voting
)规则,将未知实例归类为样本中最多数的类别。
距离的衡量方法
关于距离的测量方式有多种,这里只介绍两种。
欧拉距离
这种测量方式就是简单的平面几何中两点之间的直线距离。
并且这种方法可以延伸至三维或更多维的情况。它的公式可以总结为:
$$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值的选择会影响结果,有一个经典的图如下:
图中的数据集是良好的数据,即都打好了 label
,一类是蓝色的正方形,一类是红色的三角形,那个绿色的圆形是待分类的数据。
- = 3 时,范围内红色三角形多,这个待分类点属于红色三角形。
- = 5 时,范围内蓝色正方形多,这个待分类点属于蓝色正方形。
如何选择一个最佳的K值取决于数据。一般情况下,在分类时较大的 K 值能够减小噪声的影响,但会使类别之间的界限变得模糊。因此 K 的取值一般比较小 ( K < 20
)。
改进
在下面一种情况中:
在点Y的预测中,改范围内三角形分类数量占优,因此将Y点归为三角形。但是从视觉上观测,应该是分为圆形分类更为合理。根据这种情况就在距离测量中加上权重,比如 1/d
(d: 距离)。
KNN 的优缺点
优点:
- 简单,易于理解,无需建模与训练,易于实现;
- 适合对稀有事件进行分类;
- 适合与多分类问题,例如根据基因特征来判断其功能分类,kNN比SVM的表现要好。
缺点:
- 惰性算法,内存开销大,对测试样本分类时计算量大,性能较低;
- 可解释性差,无法给出决策树那样的规则。