《人工智能》机器学习 - 第2章 KNN算法 (一 理论讲解)

2.1 KNN算法理论

2.1.1 KNN算法简介

K K K最近邻(k-Nearest Neighbor,KNN)分类算法是1967年由Cover T和Hart P提出的一种基本分类与回归方法,是一个理论上比较成熟的方法,也是最简单的机器学习算法之一。 该方法的思路是:如果一个样本在特征空间中的 k k k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别。 KNN算法中,所选择的邻居都是已经正确分类的对象。该方法在定类决策上只依据最邻近的一个或者几个样本的类别来决定待分样本所属的类别。KNN方法虽然从原理上也依赖于极限定理,但在类别决策时,只与极少量的相邻样本有关。由于KNN方法主要靠周围有限的邻近的样本,而不是靠判别类域的方法来确定所属类别的,因此对于类域的交叉或重叠较多的待分样本集来说,KNN方法较其他方法更为适合。

KNN算法不仅可以用于分类,还可以用于回归。通过找出一个样本的k个最近邻居,将这些邻居的属性的平均值赋给该样本,就可以得到该样本的属性。更有用的方法是将不同距离的邻居对该样本产生的影响给予不同的权值(weight),如权值与距离成正比(组合函数)。
  
简单来说,KNN可以看成:有那么一堆你已经知道分类的数据,然后当一个新数据进入的时候,就开始跟训练数据里的每个点求距离,然后挑离这个训练数据最近的K个点看看这几个点属于什么类型,然后用少数服从多数的原则,给新数据归类。
举个简单的例子,我们可以使用k-近邻算法分类一个电影是爱情片还是动作片。

表1 每部电影的打斗镜头数、接吻镜头数以及电影类型
电影名称打斗次数 接吻次数 电影类型
电影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 未知

表1就是我们已有的数据集合,也就是训练样本集。这个数据集有两个特征,即打斗镜头数和接吻镜头数。除此之外,我们也知道每个电影的所属类型,即分类标签。用肉眼粗略地观察,接吻镜头多的,是爱情片。打斗镜头多的,是动作片。以我们多年的看片经验,这个分类还算合理。如果现在给我一部电影,你告诉我这个电影打斗镜头数和接吻镜头数。不告诉我这个电影类型,我可以根据你给我的信息进行判断,这个电影是属于爱情片还是动作片。而k-近邻算法也可以像我们人一样做到这一点,不同的地方在于,我们的经验更”牛逼”,而k-邻近算法是靠已有的数据。比如,你告诉我这个电影打斗镜头数为2,接吻镜头数为102,我的经验会告诉你这个是爱情片,k-近邻算法也会告诉你这个是爱情片。你又告诉我另一个电影打斗镜头数为49,接吻镜头数为51,我”邪恶”的经验可能会告诉你,这有可能是个”爱情动作片”,画面太美,我不敢想象。 (如果说,你不知道”爱情动作片”是什么?请评论留言与我联系,我需要你这样像我一样纯洁的朋友。) 但是k-近邻算法不会告诉你这些,因为在它的眼里,电影类型只有爱情片和动作片,它会提取样本集中特征最相似数据(最邻近)的分类标签,得到的结果可能是爱情片,也可能是动作片,但绝不会是”爱情动作片”。当然,这些取决于数据集的大小以及最近邻的判断标准等因素。

2.1.2 KNN算法核心-距离度量

我们已经知道k-近邻算法根据特征比较,然后提取样本集中特征最相似数据(最邻近)的分类标签。那么,如何进行比较呢?比如,我们还是以表1为例,怎么判断黄色圆点标记的电影所属的类别呢?如图1所示。

在这里插入图片描述

图1电影分类

【参考代码1.KNN-showdata】

我们可以从散点图大致推断,这个黄色圆点标记的电影属于爱情片,因为距离已知的那三个爱情片的圆点更近。k-近邻算法用什么方法进行判断呢?没错,就是距离度量。这个电影分类的例子有2个特征,也就是在2维实数向量空间,可以使用我们高中学过的两点距离公式计算距离,也就是欧式距离,这是最常用的距离,当然也可是其他距离。

设特征空间 X X X n n n维实数向量空间 R n R^n Rn x i , x j ∈ R n x_i ,x_j \in R^n xi,xjRn x i = ( x i 1 , x i 2 , . . . , x i n ) T x_i = (x_i^1,x_i^2,...,x_i^n)^T xi=(xi1,xi2,...,xin)T x j = ( x j 1 , x j 2 , . . . , x j n ) T x_j = (x_j^1,x_j^2,...,x_j^n)^T xj=(xj1,xj2,...,xjn)T,$x_i ,x_j $ 的 L p L_p Lp 距离定义为

这里写图片描述
p = 1 p=1 p=1时,成为曼哈顿距离(Manhattan distance),即是

这里写图片描述
p = 2 p=2 p=2时,成为欧式距离(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】
结果如下所示。

这里写图片描述

图2电影分类

根据图所示,将k值取4,那么在电影例子中,按距离依次排序的三个点分别是爱情片(3,105)、爱情片(2,100)、爱情片(1,81)、动作片(101,10),在这四个点中,爱情片出现的频率为四分之三,动作片出现的频率为四分之一,所以该黄色圆点标记的电影为爱情片。这个判别过程就是k-近邻算法。

通过以上的分析,我们可以总结一下k近邻算法的一般主要流程:

1)算距离:给定测试对象,计算它与训练集中的每个对象的距离;
2)找邻居:圈定距离最近的k个训练对象,作为测试对象的近邻;
3)做分类:根据这k个近邻归属的主要类别,来对测试对象分类。

2.1.3 KNN算法优缺点

 KNN算法优点

简单;
易于理解;
容易实现;
通过对K的选择可具备丢噪音数据的健壮性。

 KNN算法缺点

需要大量空间储存所有已知实例;
算法复杂度高(需要比较所有已知实例与要分类的实例);
当其样本分布不平衡时,比如其中一类样本过大(实例数量过多)占主导的时候,新的未知实例容易被归类为这个主导样本,因为这类样本实例的数量过大,但这个新的未知实例实际并木接近目标样本。

 改进版本

考虑距离,根据距离加上权重;
比如: 1 / d 1/d 1/d (d: 距离)。

参考文献
Nearest Neighbor Pattern Classification-1967

本章附件
点击进入

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Bruceoxl

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值