2.1 KNN算法理论
2.1.1 KNN算法简介
最近邻(k-Nearest Neighbor,KNN)分类算法是1967年由Cover T和Hart P提出的一种基本分类与回归方法,是一个理论上比较成熟的方法,也是最简单的机器学习算法之一。 该方法的思路是:如果一个样本在特征空间中的个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别。 KNN算法中,所选择的邻居都是已经正确分类的对象。该方法在定类决策上只依据最邻近的一个或者几个样本的类别来决定待分样本所属的类别。KNN方法虽然从原理上也依赖于极限定理,但在类别决策时,只与极少量的相邻样本有关。由于KNN方法主要靠周围有限的邻近的样本,而不是靠判别类域的方法来确定所属类别的,因此对于类域的交叉或重叠较多的待分样本集来说,KNN方法较其他方法更为适合。
KNN算法不仅可以用于分类,还可以用于回归。通过找出一个样本的k个最近邻居,将这些邻居的属性的平均值赋给该样本,就可以得到该样本的属性。更有用的方法是将不同距离的邻居对该样本产生的影响给予不同的权值(weight),如权值与距离成正比(组合函数)。
简单来说,KNN可以看成:有那么一堆你已经知道分类的数据,然后当一个新数据进入的时候,就开始跟训练数据里的每个点求距离,然后挑离这个训练数据最近的K个点看看这几个点属于什么类型,然后用少数服从多数的原则,给新数据归类。
举个简单的例子,我们可以使用k-近邻算法分类一个电影是爱情片还是动作片。
| 电影名称 | 打斗次数 | 接吻次数 | 电影类型 |
| 电影1 | 3 | 104 | Romance |
| 电影2 | 2 | 100 | Romance |
| 电影3 | 1 | 81 | Romance |
| 电影4 | 101 | 10 | Action |
| 电影5 | 99 | 5 | Action |
| 电影6 | 88 | 2 | Action |
| 电影7 | 18 | 90 | 未知 |
2.1.2 KNN算法核心-距离度量
我们已经知道k-近邻算法根据特征比较,然后提取样本集中特征最相似数据(最邻近)的分类标签。那么,如何进行比较呢?比如,我们还是以表1为例,怎么判断黄色圆点标记的电影所属的类别呢?如图1所示。
我们可以从散点图大致推断,这个黄色圆点标记的电影属于爱情片,因为距离已知的那三个爱情片的圆点更近。k-近邻算法用什么方法进行判断呢?没错,就是距离度量。这个电影分类的例子有2个特征,也就是在2维实数向量空间,可以使用我们高中学过的两点距离公式计算距离,也就是欧式距离,这是最常用的距离,当然也可是其他距离。
设特征空间是维实数向量空间 , , , ,$x_i ,x_j $ 的 距离定义为
当 时,成为曼哈顿距离(Manhattan distance),即是
当 时,成为欧式距离(Euclidean distance),即是
【注】其他距离衡量:余弦值(cos), 相关度 (correlation)。
通过计算,我们可以得到如下结果:
(18,90)-> 爱情片(3,105)的距离约为20.51
(18,90)-> 爱情片(2,100)的距离约为18.86
(18,90)-> 爱情片(1,81)的距离约为19.23
(18,90)-> 动作片(101,10)的距离约为115.27
(18,90)-> 动作片(99,5)的距离约为117.41
(18,90)-> 动作片(88,12)的距离约为104.80
【参考代码2.KNN-dis】
通过计算可知,黄色圆点标记的电影到爱情片(18,90)的距离最近。如果算法直接根据这个结果,判断该红色圆点标记的电影为动作片,这个算法就是最近邻算法,而非k-近邻算法。那么k-邻近算法是什么呢?k-近邻算法步骤如下:
算法(k-近邻算法)
- step.1—初始化距离为最大值;
- step.2—计算未知样本和每个训练样本的距离dist;
- step.3—得到目前K个最临近样本中的最大距离maxdist;
- step.4—如果dist小于maxdist,则将该训练样本作为K-最近邻样本;
- step.5—重复步骤2、3、4,直到未知样本和所有训练样本的距离都算完;
- step.6—统计K-最近邻样本中每个类标号出现的次数;
- step.7—选择出现频率最大的类标号作为未知样本的类标号;
接下来优化以上前面的代码
【参考代码3.KNN】
结果如下所示。
根据图所示,将k值取4,那么在电影例子中,按距离依次排序的三个点分别是爱情片(3,105)、爱情片(2,100)、爱情片(1,81)、动作片(101,10),在这四个点中,爱情片出现的频率为四分之三,动作片出现的频率为四分之一,所以该黄色圆点标记的电影为爱情片。这个判别过程就是k-近邻算法。
通过以上的分析,我们可以总结一下k近邻算法的一般主要流程:
1)算距离:给定测试对象,计算它与训练集中的每个对象的距离;
2)找邻居:圈定距离最近的k个训练对象,作为测试对象的近邻;
3)做分类:根据这k个近邻归属的主要类别,来对测试对象分类。
2.1.3 KNN算法优缺点
KNN算法优点
简单;
易于理解;
容易实现;
通过对K的选择可具备丢噪音数据的健壮性。
KNN算法缺点
需要大量空间储存所有已知实例;
算法复杂度高(需要比较所有已知实例与要分类的实例);
当其样本分布不平衡时,比如其中一类样本过大(实例数量过多)占主导的时候,新的未知实例容易被归类为这个主导样本,因为这类样本实例的数量过大,但这个新的未知实例实际并木接近目标样本。
改进版本
考虑距离,根据距离加上权重;
比如: (d: 距离)。
参考文献
Nearest Neighbor Pattern Classification-1967
本章附件
点击进入