邻近算法,或者说 K 最近邻 (kNN,k-NearestNeighbor) 分类算法是数据挖掘分类技术中最简单的方法之一。所谓 K 最近邻,就是 k 个最近的邻居的意思,说的是每个样本都可以用它最接近的 k 个邻居来代表。这也是为什么它被叫做k-Nearest Neighbor。

原理

假设我们有一些数据样本,存在某些特定的分类。然后,我们又被给了一个新的样本,我们的任务是预测出新的样本所属的分类,这时就可以用到k-近邻算法。k-近邻算法的原理就是,计算出这个给的样本与已知所有样本的距离。然后从这些距离中选取k个最近的距离来进行分类。
比如我们要确定绿点属于哪个颜色(红色或者蓝色),要做的就是选出距离目标点距离最近的 k 个点,看这 k 个点的大多数颜色是什么颜色。当 k 取 3 的时候,我们可以看出距离最近的三个,分别是红色、红色、蓝色,因此得到目标点为红色。

KNN - 1

算法的优缺点

优点:准确度较高,对噪声有一定的容忍度
缺点:空间复杂度和时间复杂度都较高(时间复杂度为 O (n)——每一次都要计算新的数据与所有数据的距离并且把距离存储在内存中)

k值

很明显,当k值过大时,模型的偏差就会变大,对噪声(可以简单理解为干扰值)的容忍性也会变差,从而造成欠拟合的现象。
当k值过小时,模型的偏差较小,但会造成过拟合的现象。
所以k值我们一般取一个较小的值,在实际操作过程中,我们会用交叉验证法(简单来说,就是一部分样本做训练集,一部分做测试集)来选择最优的 K 值。

算法变种

k-近邻算法有一些变种,有一种变种就是可以增加邻居的权重。默认情况下,在计算距离时,都是使用相同权重。实际上,我们可以针对不同的邻居指定不同的距离权重,一般是距离越近权重越高。因为有一些时候,样本会比较不均衡,所以当选取的k较大时,很容易就会导致模型错误分类。因此,我们才会给较近的点较大的权重。

KNN中的距离

[1]

常见的距离有以下几种:

1. 欧式距离

二维:

d12=(x1x2)2+(y1y2)2\text{d}_{12}^{}=\sqrt{\left( \text{x}_{1}^{}-\text{x}_{2}^{} \right) _{}^{2}+\left(\text{y}_{1}^{}-\text{y}_{2}^{} \right) _{}^{2}}

三维:

d12=(x1x2)2+(y1y2)2+(z1z2)2\text{d}_{12}^{}=\sqrt{\left( \text{x}_{1}^{}-\text{x}_{2}^{} \right) _{}^{2}+\left(\text{y}_{1}^{}-\text{y}_{2}^{} \right) _{}^{2}+\left(\text{z}_{1}^{}-\text{z}_{2}^{} \right) _{}^{2}}

2. 曼哈顿距离

顾名思义,在曼哈顿街区要从一个十字路口开车到另一个十字路口,驾驶距离显然不是两点间的直线距离。这个实际驾驶距离就是 “曼哈顿距离”。曼哈顿距离也称为 “城市街区距离”(City Block distance)。

d12=x1x2+y1y2\text{d}_{12}^{}=\left| \text{x}_{1}^{}-\text{x}_{2}^{} \right|+\left| \text{y}_{1}^{}-\text{y}_{2}^{} \right|

3. 切比雪夫距离

国际象棋中,国王可以直行、横行、斜行,所以国王走一步可以移动到相邻 8 个方格中的任意一个。国王从格子 (x1,y1) 走到格子 (x2,y2) 最少需要多少步?这个距离就叫切比雪夫距离。

KNN - Chebyshev Distance

d12=max(x1x2,y1y2)\text{d}_{12}^{}=\max \left( \left| \text{x}_{1}^{}-\text{x}_{2}^{} \right|,\left| \text{y}_{1}^{}-\text{y}_{2}^{} \right| \right)

注:为什么取Max是因为国王是可以斜走的

4. 余弦距离

几何中,夹角余弦可用来衡量两个向量方向的差异;机器学习中,借用这一概念来衡量样本向量之间的差异。
二维空间中向量 A (x1,y1) 与向量 B (x2,y2) 的夹角余弦公式:

KNN - Cosine Distance

5. 汉明距离

定义:两个等长字符串 s1 与 s2 的汉明距离为:将其中一个变为另外一个所需要作的最小字符替换次数。
也就是两个数据按位做[2]后得到的1的个数。
比如2024和1034:
两者做异或运算得到——1010,有两个1,所以这两个字符串的汉明距离为2。


注:如果文中有什么问题,欢迎在评论区指出;有不懂的也可以在评论区提问哦!


  1. oschina - Distance in KNN↩︎

  2. 百度百科 - 异或运算↩︎