一文搞定k-近邻算法
一. k-邻近算法的基本概念
k-邻近算法是一种基本的分类和回归方法。本章只讨论k-邻近算法在分类问题中的应用。
k-邻近算法,即给定一个训练集,对新输入的实例,在训练数据集中找到与该实例最邻近的k个实例,然在这k个实例中,看看那个类别包含的实例比较多,则这个测试集就属于哪一个类别。
如上图所示,有两类不同的样本数据,分别用蓝色的小正方形和红色的三角形来表示。当确定一个k后,也就是确定一个距离,在这个距离范围内,包含一个蓝色的正形和一两个红色的三角形,因此将绿色的测试数据归类为红色三角形的那一类。如果K增大后,范围变大(虚线部分),那绿色的测试数据所属的类别也会发生变化。
从上面的例子中我们可以看到k-邻近算法的思想是很简单的,总结一下原理就是找到距离为k的所有实例,然后看看在这些实例中哪些类别包含的实例比较多。
虽然算法的思想很简单,但是想要用算法来解决实际问题还有许多需要我们注意的地方。
二. k-邻近算法中k的选取以及特征归一化的重要性
1.选取k值以及它的影响
如果k值选的比较小,可能会出现过拟合现象,这就会导致噪点对于模型的训练产生影响。比如下面这个图:
当我们选取的k值比较小的时候,算法很容易将红色的测试数据归为黑色一类,但是实际上x轴以上部分的黑点是一个噪点。
但是如果k值太大的话,又会出现恰拟合的现象。这是因为当k值变大的时候,无论测试数据在二维坐标系的那个位置(在二维坐标里面相当于有两个特征,一个轴对应一个特征,构成一个二维的特征向量),最终预测的类别都是一样的,因为在k取值的范围内包含了所有的实例。这样训练出来的模型就非常简单,相当于压根就没有训练模型。
所以,k值过大过小都会对算法的性能产生影响,那么如何确定k值呢,这就是在深度学习以及机器学习中一个比较常见的问题,就是如何调整参数。 这是一个比较复杂的问题,一个算法可能会包含许多的参数,参数的种类也有很多,在调节的过程中需要用到很多的数学知识。
本文单单就这个算法来说,可以采用李航博士书上讲到,一般选取一个较小的数值,然后采取交叉验证法来选取最优的k值。
2.距离的度量
在上文中说到,k近邻算法是在训练数据集中找到与该实例最邻近的K个实例,这K个实例的多数属于某个类,我们就说预测点属于哪个类。
定义中所说的最邻近是如何度量呢?我们怎么知道谁跟测试点最邻近。这里就会引出我们几种度量俩个点之间距离的标准。
我们可以有以下几种度量方式:
其中当p=2的时候,就是我们最常见的欧式距离,我们也一般都用欧式距离来衡量我们高维空间中俩点的距离。在实际应用中,距离函数的选择应该根据数据的特性和分析的需要而定,一般选取p=2欧式距离表示,这不是本文的重点。
3.特征的归一化处理
因为一个类别有多个的特征,(在二维坐标系里面相当于)但是不同特征对于类别的影响的权重是不一样的。但是k-邻近算法在计算距离的时候是综合考虑了所有的特征,可能有的特征对距离的影响比较大,我们可以举一个例子,如下:
我用一个人身高(cm)与脚码(尺码)大小来作为特征值,类别为男性或者女性。我们现在如果有5个训练样本,分布如下:
A [(179,42),男] B [(178,43),男] C [(165,36)女] D [(177,42),男] E [(160,35),女]
通过上述训练样本,我们看出问题了吗?
很容易看到第一维身高特征是第二维脚码特征的4倍左右,那么在进行距离度量的时候,我们就会偏向于第一维特征。这样造成俩个特征并不是等价重要的,最终可能会导致距离计算错误,从而导致预测错误。口说无凭,举例如下:
现在我来了一个测试样本 F(167,43),让我们来预测他是男性还是女性,我们采取k=3来预测。
下面我们用欧式距离分别算出F离训练样本的欧式距离,然后选取最近的3个,多数类别就是我们最终的结果,计算如下:
由计算可以得到,最近的前三个分别是C,D,E三个样本,那么由C,E为女性,D为男性,女性多于男性得到我们要预测的结果为女性。
这样问题就来了,一个女性的脚43码的可能性,远远小于男性脚43码的可能性,那么为什么算法还是会预测F为女性呢?那是因为由于各个特征量纲的不同,在这里导致了身高的重要性已经远远大于脚码了,这是不客观的。所以我们应该让每个特征都是同等重要的!这也是我们要归一化的原因!归一化公式如下:
参考文章:
https://zhuanlan.zhihu.com/p/25994179