《统计学习方法》笔记--k近邻算法

k近邻算法(k-nearest neighbor,k-NN)是一种基本分类与回归方法。对新的输入实例,在给定的训练数据集中找到与这实例最邻近的k个实例。然后根据决策规则(如多数服从少数)决定这新输入实例点的类别。

本k临近模型的三个基本要素--距离度量k值的选择分类决策规则的决定。

1. 距离度量

在特征空间中两个实例点的距离是它们相似程度的反映,定义实例点之间的距离

一般p的取值为2,即我们熟知的欧氏距离,如,

当然,不用的距离度量所确定的最邻近点是不同的。

例如,已知二维空间中的3个点,x1和x2的点只有第一维度的值不同,则不管p的取值为多少,它们的距离L总是一样的,。而。于是能得到:当p 等于1或2时,x1和x2是最邻近点;当p大于等于3时,x3和x1是最邻近点。

2. k值的选择

k值的选择对k近邻算法的结果有着重大的影响。

k值选得较小的话,会使整体模型变得复杂,容易发生过拟合;而k值选得较大的话,又会使整体模型变得简单,无法对新实例做出准确的分类。在实际应用中,k值一般会选取一个较小的值,然后应用交叉验证法来选择最优的k值。

3. 分类决策规则

多数表决往往是k近邻算法的分类决策规则。在这种规则下,新实例点x被误分的概率为

那么要是误分类率最小即经验风险最小,就要使最大。

因此,多数表决规则也等价于经验风险最小化。

 

k近邻算法的实现--kd树

 

构造kd树

输入:k维空间数据集

  1. 开始:构造根结点,选择为坐标轴,取所有实例在该坐标轴的中位数为切分点,将根结点对应的超矩形区域切分为两个子区域,并形成深度为1 的宽度树。左子区域中的实例对应该坐标轴的值小于根结点,右子区域则大于根结点。
  2. 重复:对深度为j的结点,选择为切分的坐标轴,以该结点区域所有实例的坐标的中位数为切分点,将对应的超矩形区域切分为两个子区域。
  3. 直到两个子区域没有实例存在为止。

    例如给定二维空间的数据集:,构造一棵平衡的kd树。

     

     

     

     

    图1-1 kd树示例

    搜索kd树

    寻找给定的点x的最近邻。

  4. 从kd树的根节点出发,递归地向下访问,若目标点x的当前维的坐标小于切分点,则向左子树递归,否则往右子树,直到叶结点。

    (2)设当前到达的叶子节点为目前的最近邻(注意:可能并非真正的最近邻),并且记录目前的最近邻距离。沿着来时的路向前回溯,让目前的最近邻距离与查找点与当前叶子节点的父节点形成的分割超平面的距离进行比较,若当前最近邻比较小,则不用遍历当前叶子节点的父节点的另一边,否则需要遍历查找以更新最近邻距离和最近邻节点。

    (3)按照(2)中所说依次遍历,直到到达根节点为止,查询结束。

     

    搜索kd树的改进算法BBF(best bin first)

    对于上述的kd树的搜索算法比较适合于维度数较小的数据或数据量远大于维度数的时候,而对于具有维度数较高的数据则BBF算法的利用,能较好的提升搜索的性能。

    (1)若kd树为空,则设定两者距离为无穷大,返回;如果kd树非空,则将kd树的根节点加入到优先级队列中;

    (2)从优先级队列中出队当前优先级最大的结点,计算当前的该点到查找点的距离是否比最近邻距离小,如果是则更新最近邻点和最近邻距离。如果查找点在切分维坐标小于当前点的切分维坐标,则把他的右孩子加入到队列中,同时检索它的左孩子,否则就把他的左孩子加入到队列中,同时检索它的右孩子。这样一直重复检索,并加入队列,直到检索到叶子节点。然后在从优先级队列中出队优先级最大的结点;

    (3)重复(1)和(2)中的操作,直到优先级队列为空,或者超出规定的重复次数时,返回当前的最近邻结点和距离。

     

     

     

     

     

     

     

     

     

     

posted @ 2019-11-03 23:09  lincoding`  阅读(483)  评论(0编辑  收藏  举报