分类算法学习之KNN算法(一)理论基础

KNN算法

1、算法原理

属于监督学习。
KNN(K Nearest Neighbors)根据全称我们可以从字面上了解,K个最近的邻居。K个最近邻居,毫无疑问,K的取值肯定是至关重要的。
KNN算法的原理:预测一个新的值x,根据它距离最近的K个点是什么类别来判断x属于哪个类别。

分类算法学习之KNN算法(一)理论基础
如上图所示,有两类不同的样本数据,分别用蓝色的小正方形和红色的小三角形表示,而图正中间的那个绿色的圆所标示的数据则是待分类的数据。这也就是我们的目的,来了一个新的数据点,我要得到它的类别是什么?好的,下面我们根据k近邻的思想来给绿色圆点进行分类。

  • 如果K=3,绿色圆点的最邻近的3个点是2个红色小三角形和1个蓝色小正方形,少数从属于多数,基于统计的方法,判定绿色的这个待分类点属于红色的三角形一类。
  • 如果K=5,绿色圆点的最邻近的5个邻居是2个红色三角形和3个蓝色的正方形,还是少数从属于多数,基于统计的方法,判定绿色的这个待分类点属于蓝色的正方形一类。

从上面例子我们可以看出,k近邻的算法思想非常的简单,也非常的容易理解,那么我们是不是就到此结束了,**该算法的原理我们也已经懂了,也知道怎么给新来的点如何进行归类,只要找到离它最近的k个实例,哪个类别最多即可。**还没有结束,比如k怎么确定的,k为多少效果最好呢?所谓的最近邻又是如何来判断给定呢?看下文

2、算法流程

2.1、输入:

训练数据集T=(x1,y1),(x2,y2),…,(xN,yN)
(其中,xi∈X⊆Rn为实例的特征向量,yi∈Y={c1,c2,…,ck}为实例的类别,i=1,2,…,N;实例特征向量x)

2.2、输出:实例x所属的类y

1)根据给点的距离度量,在训练集中找出与x最邻近的k个点,涵盖着k个点的领域(分类),记为Nk(x)。
2)在Nk(x)中根据分类决策规则(如多数表决),决定x的类别y。
计算公式 y=arg maxcj∑xi∈Nk(x)I(yi=cj),i=1,2,…,N;

KNN算法最重要的是K值的选取和点距离的计算

2.3、K值的选取

2.3.1、选取k值以及它的影响

k临近的k值我们应该怎么选取呢?
如果我们选取较小的k值,那么就会意味着我们的整体模型会变得复杂,容易发生拟合!
假如我们有训练数据和待分类点如下图:
分类算法学习之KNN算法(一)理论基础
上图中有俩类,一个是黑色的圆点,一个是蓝色的长方形,现在我们的待分类点是红色的五边形。
根据我们的k近邻算法步骤来决定待分类点应该归为哪一类。我们由图中可以得到,很容易我们能够看出来五边形离黑色的圆点最近,k又等于1,我们最终判定待分类点是黑色的圆点。

这个处理过程我们很容易能够感觉出问题了,如果k太小了,比如等于1,那么模型就太复杂了,我们很容易学习到噪声,也就非常容易判定为噪声类别,而在上图,如果,k大一点,k等于8,把长方形都包括进来,我们很容易得到我们正确的分类应该是蓝色的长方形!如下图:
分类算法学习之KNN算法(一)理论基础
所谓的过拟合就是在训练集上准确率非常高,而在测试集上准确率低,经过上例,我们可以得到k太小会导致过拟合,很容易将一些噪声(如上图离五边形很近的黑色圆点)学习到模型中,而忽略了数据真实的分布。

如果我们选取较大的k,就相当于用较大邻域中的训练数据进行预测,这时与输入实例较远(不相似)训练实例也会对预测起作用,使预测发生错误,k值的增大意味着整体模型变得简单

为什么k值的增大意味着整体模型变得简单

我们想,如果k=N(N为训练样本的个数),那么无论输入实例是什么,都将简单地预测它属于在训练实例中最多的类。这时,模型是不是非常简单,这相当于你压根就没有训练模型呀!直接拿训练数据统计了一下各个数据的类别,找最大的而已!这好像下图所示:

分类算法学习之KNN算法(一)理论基础
我们统计了黑色圆形是8个,长方形个数是7个,那么哈哈,如果k=N,我就得出结论了,红色五边形是属于黑色圆形的(明显是错误的好不,捂脸!)
这个时候,模型过于简单,完全忽略训练数据实例中的大量有用信息,是不可取的。

恩,k值既不能过大,也不能过小,在我举的这个例子中,我们k值的选择,在下图红色圆边界之间这个范围是最好的,如下图:
分类算法学习之KNN算法(一)理论基础
(注:这里只是为了更好让大家理解,真实例子中不可能只有俩维特征,但是原理是一样的1,我们就是想找到较好的k值大小)

那么我们一般怎么选取呢?李航博士书上讲到,我们一般选取一个较小的数值,通常采取 交叉验证法来选取最优的k值。(也就是说,选取k值很重要的关键是实验调参,类似于神经网络选取多少层这种,通过调整超参数来得到一个较好的结果
在实际应用中,K值一般取一个比较小的数值,例如采用交叉验证法来选择最优的K值。经验规则:k一般低于训练样本数的平方根在实际应用中,K值一般取一个比较小的数值,例如采用交叉验证法来选择最优的K值。经验规则:k一般低于训练样本数的平方根

2.4、点距离的计算

我们可以有以下几种度量方式:
分类算法学习之KNN算法(一)理论基础

当p=2的时候,就是我们最常见的欧式距离,高中的时候我们就接触到了,其实就是计算(x1,y1)和(x2,y2)的距离,二维空间两点间距离的计算公式:
分类算法学习之KNN算法(一)理论基础
拓展到多维空间,则公式变成这样:
分类算法学习之KNN算法(一)理论基础

2.5、特征归一化的必要性

首先举例如下,我用一个人身高(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个,多数类别就是我们最终的结果,计算如下:
分类算法学习之KNN算法(一)理论基础
由计算可以得到,最近的前三个分别是C,D,E三个样本,那么由C,E为女性,D为男性,女性多于男性得到我们要预测的结果为女性。
这样问题就来了,一个女性的脚43码的可能性,远远小于男性脚43码的可能性,那么为什么算法还是会预测F为女性呢?那是因为由于各个特征量纲的不同,在这里导致了身高的重要性已经远远大于脚码了,这是不客观的。所以我们应该让每个特征都是同等重要的!这也是我们要归一化的原因!归一化公式如下:
分类算法学习之KNN算法(一)理论基础

3、KNN的决策过程

1、计算测试对象到训练集中每个对象的距离

2、按照距离的远近排序

3、选取与当前测试对象最近的k的训练对象,作为该测试对象的邻居

4、统计这k个邻居的类别频率

4、适用场景

文本分类

用户推荐

回归问题

5、优点不足

5.1、优点:

理论成熟,思想简单,既可以用来做分类也可以用来做回归;

可用于非线性分类;

训练时间复杂度为O(n);

对数据没有假设,准确度高,对outlie(异常值)r不敏感;

5.2、缺点

属于懒惰算法,时间复杂度较高,因为需要计算未知样本到所有已知样本的距离

样本平衡度依赖高,当出现极端情况样本不平衡时,分类绝对会出现偏差,可以调整样本权值改善

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

向量的维度越高,欧式距离的区分能力就越弱

样本空间太大不适合,因为计算量太大,预测缓慢

需要大量的内存;

参考博客地址:https://zhuanlan.zhihu.com/p/25994179
参考文献:《统计学习方法》李航