3 k近邻法

早过忘川 提交于 2020-02-29 22:05:55

k近邻法


 

给定一个训练数据集,对新的输入实例,在训练数据集中找到跟它最近的k个实例,根据这k个实例的类判断它自己的类(一般采用多数表决的方法)。

 

k近邻模型


 

模型由三个基本要素——距离度量、k值的选择和分类决策规则决定。

 

距离度量

特征空间中两个实例点的距离是两个实例点相似程度的反映。一般使用欧氏距离,但也可以是 Lp距离(Lp distance)或 Minkowski距离(Minkowski distance)。

xi,xj的Lp距离定义为:

 

这里p≥1。当p=2时,称为欧氏距离(Euclidean distance),即:

 

当p=1时,称为曼哈顿距离(Manhattan distance),即:

当p=∞时,它是各个坐标距离的最大值,即:

下图给出了二维空间中p取不同值时,与原点的 L距离为1(Lp=1)的点的图形

 

可以看出由不同的距离度量所确定的最近邻点是不同的。

 

k值的选择

k值的选择会对k近邻法的结果产生重大影响。如果选择较小的k值,就相当于用较小的邻域中的训练实例进行预测,“学习”的近似误差(approximation error)会减小,但“学习”的估计误差(estimation error)会增大。如果选择较大的k值,则相反。

近似误差:可以理解为对现有训练集的训练误差。只管眼前训练,不管未来预测,模型本身并不是最接近真实分布,可能会发生过拟合现象。

估计误差:可以理解为对测试集的预测误差。最小化估计误差是使估计系数尽量接近真实系数,但对训练样本得到的估计值不一定最接近真实值;对模型本身来说,它能适应更多的问题(测试样本)。

换句话说,k 值的减小就意味着训练集的减小,参数相对较多,整体模型变得复杂,容易发生过拟合。k 值的增大就意味着整体的模型变得简单。 

在应用中,k 值一般取一个比较小的数值。通常采用交叉验证法来选取最优的k值。
 

分类决策规则

k近邻法中的分类决策规则往往是多数表决,如果分类的损失函数为0-1损失函数,对给定的实例x∊x,其最近邻的k个训练实例点构成集合Nk(x)。如果涵盖Nk(x)的区域的类别是cj,那么误分类率是:

 

要使误分类率最小即经验风险最小,就要使 最大,所以多数表决规则等价于经验风险最小化。 
 

k近邻法的实现:kd树


 

 

算法核心在于怎么快速搜索k个近邻出来,朴素做法是线性扫描,当训练集很大时会非常耗时,不可取,这里介绍的方法是kd树。

 

构造kd树

kd树是一种对k维空间中的实例点进行存储以便对其进行快速检索的树形数据结构。kd树是二叉树,
构造kd树的方法如下:构造根结点,使根结点对应于k维空间中包含所有实例点的超
矩形区域;通过下面的递归方法,不断地对k维空间进行切分,生成子结点,
直到子区域内没有实例时终止。
 
例子:
给定一个二维空间的数据集:     构造一个平衡kd树
 
根结点对应包含数据集T的矩形,选择x(1)轴,6个数据点的x(1)坐标的中位数是7,以平面x(1)=7将空间分为左、右两个子矩形(子结点);接着,左矩形以x(2)=4分为两个子矩形,右矩形以x(2)=6分为两个子矩形,如此递归,最后得到特征空间划分和kd树。 
                        
 
 

搜索kd树

从上面可以看出,利用kd树可以省去对大部分数据点的搜索,从而减少搜索的计算量。
搜索跟二叉树一样,是一个递归的过程。先找到目标点的插入位置,然后递归向上回退,逐步用自己到目标点的距离画个超球体,用超球体圈住的点来更新最近邻(或k最近邻)。
例子:
给定一个如图所示的kd树,根结点为A,其子结点为B,C等。树上共存储7个实例点;另有一个输入目标实例点S,求S的最近邻。 
 
 
 
 
首先在kd树中找到包含点S的叶结点D(图中的右下区域),以点D作为近似最近邻。真正最近邻一定在以点S为中心通过点D的圆的内部。然后返回结点D的父结点B,在结点B的另一子结点F的区域内搜索最近邻。结点F的区域与圆不相交,不可能有最近邻点。继续返回上一级父结点A,在结点A的另一子结点C的区域内搜索最近邻。结点C的区域与圆相交;该区域在圆内的实例点有点E,点E比点D更近,成为新的近似最近邻。最后得到点E是点S的最近邻。 
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!