统计学习方法——k近邻法

来源:互联网 发布:蓝牙控制小车app源码 编辑:程序博客网 时间:2024/05/21 09:44

k近邻法(k-nearest neighbors,k-NN),假设给定一个训练数据集,其中的实例类别是确定的。对于新的实例,根据其k个最近邻的训练实例的类别,通过多数表决等方式进行预测。因此,k近邻不具有显式的学习过程。k近邻实际上是利用训练数据集对特征向量空间进行划分,并作为其分类的模型。k近邻法有三个基本要素:k值的选取距离的度量以及分类决策规则

1 k近邻算法

首先介绍k近邻算法:

k近邻算法

k近邻法的特殊情况是,当k=1时,称之为最近邻算法。k近邻法没有显式的学习过程。

2 k近邻模型的三要素

2.1 k值的选取

k值的选择对k近邻法的结果有比较大的影响。
选取较小的k值,预测结果会对近邻的实例点非常敏感,容易被临近的噪声影响,从而发成过拟合。选取较大的k值,较远的实例点会对预测结果产生一定影响,使预测结果出现错误。
一般情况下,将k取一个较小的数值,而后使用交叉验证的方式来选取最优的k值。

2.2 距离的度量

特征向量空间中的两个实例点的距离是两个实例点相似度的反映。k近邻模型的特征空间一般是n维实数向量空间。常用的距离有:欧氏距离、曼哈顿距离、切比雪夫距离等(关于距离,有机会再总结一篇文章)。
上述三种距离的定义如下:

距离

需要注意的是:当选取不同的距离度量时,最近邻点也是不同的。

2.3 分类决策规则

k近邻法中的分类决策规则一般是多数表决,就是由输入实例的k个近邻的训练实例中多数类来决定输入实例的类别。

3 k近邻法的实现:kd树

k近邻法最简单的实现方法是线性扫描,也就是在计算某一个输入实例的类别是,需要计算它与训练集中所有实例点的距离。当训练集非常大时,计算非常耗时,是我们无法接受的。因此在实现k近邻法时,所要考虑的最主要的问题是:如何对训练数据集进行快速k近邻搜索
这里介绍kd树(K-dimension tree),kd树是一种对k维空间中的实例点进行存储以便对其进行快速检索的树形数据结构。它是对实例点在k维空间中进行划分的一种数据结构,本质上它是一种平衡二叉树。需要注意的是,平衡的kd树搜索时的效率未必是最优的。

3.1 构造kd树

构造kd树1

构造kd树2

注意事项 1:上述算法在选取划分坐标轴时,是按照坐标轴的位置顺序选取的。另外一种常用方式是,计算k维坐标轴上数据的方差,选择方差最大的坐标轴作为划分坐标轴。
注意事项 2:在构造kd树时,不可避免的会出现落在切分超平面上的实例点不止有一个。按照上述算法的描述,算法将这些落在切分超平面上的实例点都保存在了当前的结点中。
也可以使用如下方式处理上述问题,在使用中位数结点划分当前去区域时,左子结点对应划分坐标小于等于切分点的子区域;右子结点对应划分坐标大于切分点的子区域。

3.2 搜索kd树

最近邻搜索算法:

kd树最近邻搜索1

kd树最近邻搜索2

上述算法中的步骤(b)中,关于如何确定另一子结点对应的区域是否与以目标点为球心、以目标点与“当前最近点”间的距离为半径的超球体相交?
判断方法如下:当前结点的父结点保存有划分当前结点与另一子节点的超平面的相关信息(该超平面的法向量以及该超平面上的一点),只要“当前最近点”到该超平面的距离小于上述超球体的半径,即可判断另一子结点对应的区域与超球体相交。

3.3 kd树实例

3.3.1 构造kd树实例

假设数据集是6个二维数据点:{(2, 3), (5, 4), (9, 6), (4, 7), (8, 1), (7, 2)},kd树构造过程如下:
1. 根结点对应包含数据集的矩形,这里按照坐标轴的顺序依次选取作为划分坐标轴,首先选取x轴
2. 6个数据点,在x轴上的中位数为7,数据集被平面x=7划分为左右两个子矩形,将数据点(7, 2)保存为当前结点
3. 确定左子空间以及右子空间,左子空间:{(2, 3), (5, 4), (4, 7)};右子空间:{ (9, 6), (8, 1)},如下图所示:
4. 递归处理左子空间以及右子空间,最后得到kd树如下图所示

构造kd树实例

3.3.2 搜索kd树实例

1 查询点(2.1, 3.1)

  1. 二叉树搜索:从根节点(7, 2)开始进行往下查询kd树,经过结点搜索路径<(7, 2), (5, 4), (2, 3)>,到达叶子结点(2, 3),以此结点为当前最近点,计算其与查询点(2.1, 3.1)的距离为0.1414,以(2.1, 3.1)为圆心,0.1414为半径画圆(即为”当前最小圆”)
  2. 回溯查找:按照之前的搜索路径向上回溯,首先到达结点(5, 4),该结点与(2.1, 3.1)的距离>0.1414,接下里埃判断当前结点的另一子区域是否可能存在更近的点,该结点确定的超平面为y=4,该平面与”当前最小圆”并不相交,继续向上回溯
  3. 回溯到达根结点(7, 2),该结点与(2.1, 3.1)的距离>0.1414,接下来判断当前结点的另一子区域是否可能存在更近的点,该结点确定的超平面为x=7,该平面与”当前最小圆”也不相交,同时已经到达根结点,回溯结束,搜索结束,返回最近邻结点为(2, 3)
    搜索kd树实例1

2 查询点(2, 4.5)

  1. 搜索二叉树:从根节点开始往下搜索kd树,经过路径<(7, 2), (5, 4), (4, 7)>,到达叶子结点(4, 7),依次为当前最近点,计算其与(2, 4.5)的距离为3.202,以(2, 4.5)为圆心,3.202为半径画圆(”当前最小圆”)
  2. 回溯查找:按照之前的搜索路径向上回溯,首先到达结点(5, 4),该结点与(2, 4.5)的距离为3.041,当前最近点变为(5, 4),并绘制”当前最小圆”,接下来判断当前结点的另一个子区域是否可能存在更近点,当前结点确定的超平面为y=4,”当前最小圆”与该超平面相交,说明另一个子区域可能存在更近的点。
  3. 注意:这时要做的是,针对这个子区域递归地进行最近邻搜索,并返回这个区域内所有的点中距离(2, 4.5)最近的点,因为这个区域只有一个点,所以返回点(2, 3)。点(2, 3)与查询点(2, 4.5)的距离为1.5,这样比当前最近点(5, 4)与(2, 4.5)的距离3.041要小,所以,将当前最近点修改为(2, 3),绘制”当前最小圆”(有些博客在这部分的操作应该是有问题的)
  4. 继续向上回溯,回溯到根节点(7, 2),该结点与(2, 4.5)的距离大于1.5,并且根节点确定的超平面x=7与”当前最小圆”不相交,回溯结束,搜索结束,返回最近邻点(2, 3)
    搜索kd树实例2

    搜索kd树实例3

3.4 kd树最近邻搜索算法缺陷

如果实例点是随机分布的,kd树搜索的平均计算复杂度是O(logN),N是训练实例树。kd树适用于训练实例数远大于空间维数,当空间维数与训练实例数差不多时,它的效率几乎同等于线性搜索。一般当N >> 2D时(D为数据维数),kd树搜索才会非常高效。

4 改进kd树

由于kd树最近邻搜索算法在高维空间上的搜索效率非常低,在此基础上进行改进的BBF算法,可以有效提高在高维空间上的搜索效率(待以后再研究)。
还有很多其他的类似kd树的高维数据存储结构,比如球树、M树、VP树、MVP树等(待以后再研究)

1 0