K-近邻算法 KNN

 KNN算法是物以类聚人以群分的体现之一,按照样本之间距离的远近赋予待测样本对应的属性,样本之间距离的计算方法是核心。
 本文阐述了KNN算法流程、K值的选择、常用的距离公式、优化的距离算法kd树、k近邻算法优缺点汇总、交叉验证,网格搜索等内容。
关键字:KNN 距离公式 k值 kd树

1.什么是KNN算法

核心概念:根据你的“邻居”来推断出你的类别,即物以类聚人以群分,相近的人必然会存在类似的属性


定义:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别。


距离公式.挨得越近,类似属性重合度越高,属于同一类型别的概率越大,准确率越高,可靠性越强。距离公式就是一个很好的测量距离远近的尺子,常用的距离公式是欧氏距离

2.机器学习中常见的距离计算公式

2.1欧氏距离(Euclidean Distance) 即 两点之间距离 -- 直线直达的“位移”

定义:两点间距离公式常用于函数图形内求两点之间距离、求点的坐标的基本公式


常见的欧氏距离计算公式

2.2曼哈顿距离(Manhattan Distance) 即 曲折的道路 -- 两点之间实际走过的“路程”

曼哈顿距离计算公式

3.KNN算法流程

1)计算已知类别数据集中的点与当前点之间的距离
2)按距离递增次序排序
3)选取与当前点距离最小的k个点
4)统计前k个点所在的类别出现的频率
5)返回前k个点出现频率最高的类别作为当前点的预测分类

4.k值的选择

k值的大小决定了邻域的大小,进而影响计算强度和模型的鲁棒性

  • K值过小:容易受到异常点的影响
  • k值过大:受到样本均衡的问题

K值选择问题,李航博士的一书「统计学习方法」上所说:

  1. 选择较小的K值,就相当于用较小的领域中的训练实例进行预测,
    “学习”近似误差会减小,只有与输入实例较近或相似的训练实例才会对预测结果起作用,与此同时带来的问题是“学习”的估计误差会增大,
    换句话说,K值的减小就意味着整体模型变得复杂,容易发生过拟合;train loss 低,但test loss 容易高

  1. 选择较大的K值,就相当于用较大领域中的训练实例进行预测,
    其优点是可以减少学习的估计误差,但缺点是学习的近似误差会增大。这时候,与输入实例较远(不相似的)训练实例也会对预测器作用,使预测发生错误。
    且K值的增大就意味着整体的模型变得简单。train loss 高,test loss 高

  1. K=N(N为训练样本个数),则完全不足取,
    因为此时无论输入实例是什么,都只是简单的预测它属于在训练实例中最多的类,模型过于简单,忽略了训练实例中大量有用信息。

近似误差(train loss):

1.对现有训练集的训练误差,关注训练集,
2.如果近似误差过小可能会出现过拟合的现象,对现有的训练集能有很好的预测,但是对未知的测试样本将会出现较大偏差的预测。
3.模型本身不是最接近最佳模型。

估计误差(test loss):

1.可以理解为对测试集的测试误差,关注测试集,
2.估计误差小说明对未知数据的预测能力好。
3.模型本身最接近最佳模型,鲁棒性强,泛化能力强

 在实际应用中,K值一般取一个比较小的数值,例如采用交叉验证法(简单来说,就是把训练数据在分成两组:训练集和验证集)来选择最优的K值。

数据集的划分

交叉验证,网格搜索(补充)

交叉验证:将拿到的训练数据(train datasets),分为训练数据(train data)和验证数据(test data)。


网格搜索:通常情况下,有很多参数是需要手动指定的(如k-近邻算法中的K值),这种叫超参数。但是手动过程繁杂,所以需要对模型预设几种超参数组合。每组超参数都采用交叉验证来进行评估。最后选出最优参数组合建立模型。

 例如:将数据分成4份,其中一份作为验证集。然后经过4次(组)的测试,每次都更换不同的验证集。即得到4组模型的结果,取平均值作为最终结果。又称4折交叉验证。

交叉验证目的:为了让被评估的模型更加准确可信
网格搜索:选择或者调优参数

5.kd树构建和搜索过程

5.1 k近邻算法实现问题:

1.实现k近邻算法时,主要考虑的问题是如何对训练数据进行快速k近邻搜索。这在特征空间的维数大及训练数据容量大时尤其必要。


2.k近邻法最简单的实现是线性扫描(穷举搜索),即要计算输入实例与每一个训练实例的距离。计算并存储好以后,再查找K近邻。

KNN的最简单朴素的方法即直接线性扫描,大致步骤如下:

  • 计算待预测数据与各训练样本之间的距离
  • 按照距离递增排序
  • 选择距离最小的k个点
  • 计算这k个点类别的频率,最高的即为待预测数据的类别。

3.当训练集很大时,计算非常耗时。为了提高kNN搜索的效率,可以考虑使用特殊的结构存储训练数据,以减小计算距离的次数。

 据KNN每次需要预测一个点时,我们都需要计算训练数据集里每个点到这个点的距离,然后选出距离最近的k个点进行投票。当数据集很大时,这个计算成本非常高,针对N个样本,D个特征的数据集,其算法复杂度为O(DN2)。

5.2 解决方案 -- kd树

1.kd树:为了避免每次都重新计算一遍距离,算法会把距离信息保存在一棵树里,这样在计算之前从树里查询距离信息,尽量避免重新计算,这就是算法优化。


2.基本原理:如果A和B距离很远,B和C距离很近,那么A和C的距离也很远。有了这个信息,就可以在合适的时候跳过距离远的点。


3.这样优化后的算法复杂度可降低到O(DNlog(N))。

5.3 构建kd树

在构建kd树时,有2个关键问题:
(1)选择向量的哪一维进行划分? 随机选择某一维或按顺序选择,但是更好的方法应该是在数据比较分散的那一维进行划分(分散的程度可以根据方差来衡量)。
(2)如何划分数据? 好的划分方法可以使构建的树比较平衡,可以每次选择中位数来进行划分。
构造方法

(1)构造根结点,使根结点对应于K维空间中包含所有实例点的超矩形区域;切分维度选择方差小的那一维,切分处选择该维度的中位数


(2)切分区域(以中位数为临界点将区域划分为左右两部分,左小右大小于中位数的区域划分到左边,大于中位数的区域划分到右边)

通过递归的方法,不断地对k维空间进行切分,生成子结点。


在超矩形区域上选择一个坐标轴和在此坐标轴上的一个切分点,确定一个超平面切分处


这个超平面通过选定的切分点并垂直于选定的坐标轴,将当前超矩形区域切分为左右两个子区域(子结点);``


这时,实例被分到两个子区域。


(3)上述过程直到子区域内没有实例时终止(终止时的结点为叶结点)。在此过程中,将实例保存在相应的结点上。


(4)通常,循环的选择坐标轴对空间切分,选择训练实例点在坐标轴上的中位数为切分点,这样得到的kd树是平衡的(平衡二叉树:它是一棵空树,或其左子树和右子树的深度之差的绝对值不超过1,且它的左子树和右子树都是平衡二叉树)。

5.4 案例

给定一个二维空间数据集:T={(2,3),(5,4),(9,6),(4,7),(8,1),(7,2)},构造一个平衡kd树。

1.确定切分维度和切分处

1.这是个二维空间数据集,可以设为有x维和y维两个维度
2.计算两个维度的方差和中位数。

x维数据:2,5,9,4,8,7
x维均值:(2+5+9+4+8+7)/ 5 = 7
x维方差:(25 + 4 + 4 + 1 + 0) / 5 = 6.8
x维中位数:6


y维数据:3,4,6,7,1,2
y维均值:(3+4+6+7+1+2)/5=4.6
y维方差:(2.56+0.36+1.96+5.76+12.96+6.76) / 5 = 6.072
y维的中位数:3.5

2.在y维循环切分

切分结果

3.kd树已经成功构建,测试一番,查找距(2.1,3.1),(2,4.5)最近的好友

查找距(2.1,3.1)最近的点,取k=2,即查看最近的两个点

  • 查找距离3.1最近的点,查找路径:(5,4) --> (7,2) --> (2,3),
  • min(|3.1-3| < |4-3.1|) , 返回0.1,对应的是3.1
  • (2.1,3.1)距离最近的好友是(2,3)

查找距离4.5最近的点,取k=2,即查看最近的两个点

  • 查找距离4.5最近的点,查找路径:(5,4)
  • min(|4.5 - 4| < |6 - 4|),返回0.5,对应的是4.5
  • (2,4.5)距离最近的好友是(5,4)

6.k近邻算法优缺点汇总

 优点:

  • 简单有效
  • 重新训练的代价低
  • 适合类域交叉样本
  • KNN方法主要靠周围有限的邻近的样本,而不是靠判别类域的方法来确定所属类别的,因此对于类域的交叉或重叠较多的待分样本集来说,KNN方法较其他方法更为适合。
  • 适合大样本自动分类
  • 该算法比较适用于样本容量比较大的类域的自动分类,而那些样本容量较小的类域采用这种算法比较容易产生误分。

 缺点:

  • 惰性学习。KNN算法是懒散学习方法(lazy learning,基本上不学习),一些积极学习的算法要快很多。
  • 类别评分不是规格化。不像一些通过概率评分的分类。
  • 输出可解释性不强。例如决策树的输出可解释性就较强
  • 对不均衡的样本不擅长。当样本不平衡时,如一个类的样本容量很大,而其他类样本容量很小时,有可能导致当输入一个新样本时,该样本的K个邻居中大容量类的样本占多数。该算法只计算“最近的”邻居样本,某一类的样本数量很大,那么或者这类样本并不接近目标样本,或者这类样本很靠近目标样本。无论怎样,数量并不能影响运行结果。可以采用权值的方法(和该样本距离小的邻居权值大)来改进。
  • 计算量较大。目前常用的解决方法是事先对已知样本点进行剪辑,事先去除对分类作用不大的样本

你可能感兴趣的:(K-近邻算法 KNN)