K-近邻学习(KNN)

KNN 分类学习算法

K近邻学习算法是一种基本的分类与回归学习算法,能力有限,简单介绍一下分类算法。K近邻学习算法是一种常用的监督学习算法。

算法机制

给定测试样本,基于某种距离度量找出训练集中的与其最靠近的K个训练样本,然后基于找到的K个近邻训练样本的类别信息来预测测试样本的类别。在分类任务中,一般采用投票法决定类别信息,根据K个近邻样本中出现最多的类别作为测试样本的类别。

算法特点

K-近邻算法没有明显的训练过程,是“懒惰学习”的著名代表。在训练阶段只保存训练样本的信息,并没有相关参数的训练。在测试时,将测试样本与每个训练样本进行比较,计算距离。算法中最重要的一个参数就是 K ,对于不同的K的选择,可能会有不同的结果,当 K = 1 时,称为最近邻算法。

K 值的选择

  1. 当 K 选择较小时,就相当于用较小的领域中的训练样本对测试样本进行预测,学习的“近似误差”会小,只有与测试样本较近的训练样本才会参与预测,但是,学习的“估计误差”会增大。预测结果会对近邻的实例很敏感,如果近邻的样本恰是噪声,则会引起误判。
    总之,K值越小,意味着整体模型越复杂,容易发生过拟合现象。
  2. 当 K 选择较大时,就相当于用较大的领域中的训练样本对测试样本进行预测,可以减小学习的“估计误差”,但是学习的“近似误差”会增大。这时,与输入样本相差较远的样本点也会参与预测的过程,使预测发生错误。
    K的增大,意味着整体模型变简单,但是模型过于简单会忽略大量的有用信息,是分类器的性能下降。

在实际应用中,K 一般取一个较小的值。通常采用交叉验证来选取最优的 K 值。

近似误差:可以理解为对现有训练集的训练误差
估计误差:可以理解为对测试集的测试误差
    近似误差关注训练集,近似误差过小会容易出现过拟合现象,估计误差关注测试集和泛化问题,估计误差小,说明对未知数据的预测能力较好。

K近邻的实现

  1. 线性扫描
    K 近邻最简单的实现方法就是线性扫描,即,计算测试样本与每一个训练样本的距离,易于实现,但是当训练样本很多的时候,则计算量大,计算耗时。

  2. kd树
    为了提高搜索效率,可以改变训练样本的存储方式,减少距离的计算次数。kd树则是一种简化的方法,kd树是一种对K维空间的实例点进行存储,以便于进行快速搜索的树形数据结构,kd树是二叉树,表示对k为空间的一个划分。

  3. 构造kd树
    构造根结点,使根结点对应于K维空间中包含所有实例的超矩形区域,通过递归方法不断的对K维空间进行划分,生成子结点。通常选择坐标做进行切分,选择训练样本中在选定的坐标轴上的中位数为切分点,所得的kd树是平衡的。

    平衡kd树,在搜索时效率未必是最优的
    
  4. 搜索kd树
    利用kd树可以省去大部分的数据点的搜索,从而减少计算量。
    给定一个目标,搜索其最近邻,首先找到包含目标点的叶结点,然后从该叶结点出发,依次回退到父结点,不断查找与目标结点最邻近的结点,当确定不可能存在更近的结点时终止。

    实现算法;
    输入:已构造的kd树,目标点 x ;
    输出: x 的最近邻;
    
    1、在kd树中找到包含目标点的叶结点,从根结点出发,递归的向下访问kd树,若目标点当前维的坐标小于切分点的坐标,则移动到左子结点,否则移动到右子结点,知道子结点为叶结点为止。
    2、以此叶结点为当前最近结点。
    3、递归向上回退,在每个结点进行以下操作:
        3.1、如果该结点保存的实例点比当前最近点距离目标点更近,则以该点为当前最近点
        3.2、当前最近点一定存在于该结点一个子结点对应的区域,检查该子结点的父结点的另一子结点对应的区域是否有更近的点
    4、当回退到根结点时,搜索结束,当前最近点成为最近邻点。
    

参考文献

  1. 李航,统计学习方法
  2. 周志华,机器学习
  3. 百度百科-kd树

能力有限,如有不足,望博友不吝告知,将不胜感激。

猜你喜欢

转载自blog.csdn.net/weixin_38111986/article/details/80159360