1. KNN概述

  k近邻法(K-Nearest neighbor,kNN)是一种常用的监督学习方法,其工作机制为:给定测试样本,基于某种距离度量找出训练集中与其最靠近的k个训练样本,然后基于这k个“邻居”的信息来进行预测。通常,在分类任务中使用投票法计算最终预测结果,在回归任务中使用平均法,还可基于距离远近进行加权平均或加权投票。

  kNN是懒惰学习(lazy learning)的典型代表,不具有显式的学习过程。懒惰学习技术在训练阶段仅仅将样本保存起来,训练开销为0,等收到测试样本时再进行处理,相应的,那些在训练阶段就怼样本进行学习处理的方法,称为“急切学习(eager learning)”。

2. K近邻模型三要素

  kNN使用的模型实际上对应于对特征空间的划分。kNN模型由三个及基本要素组成:

  1. 距离度量;
  2. k值的选择;
  3. 决策规则。

2.1 距离度量

  kNN中使用的距离度量可以是欧式距离、曼哈顿距离、切比雪夫距离或者一般的闵可夫斯基距离。具体定义可参见上一篇博客【机器学习】LP距离、欧氏距离、曼哈顿距离、切比雪夫距离

2.2 k值选择

  如果k值较小,则训练误差减少,只有与输入实例相似的训练实例才会对于预测结果起作用,但泛化误差提高了,预测结果会对近邻实例点非常敏感。k值较小意味着模型变得复杂,容易发生过拟合。

  如果k值较大,可以减少泛化误差,但训练误差会增加,这时与输入实例相差较远的训练实例也会对预测结果起作用。k值较大意味着模型变得简单,容易发生欠拟合。

  当k=1k=1k=1时,k近邻算法就是最近邻算法。k值一般采用交叉验证法选取最优值。

2.3 决策规则

   通常,在分类任务中使用投票法计算最终预测结果,在回归任务中使用平均法,还可基于距离远近进行加权平均或加权投票。

3. KNN算法描述

   下面以分类任务为例,介绍KNN算法,回归任务与此类似,区别不大。

   输入:训练数据集D={(xi,yi)}i=1mD = \\left\\{ \\left( x _ { i } , y _ { i } \\right) \\right\\} _ { i = 1 } ^ { m }D={(xi,yi)}i=1m,其中,xiXRnx _ { i } \\in \\mathcal { X } \\subseteq \\mathbf { R } ^ { n }xiXRnyiY={c1,c2, ,cK}y _ { i } \\in \\mathcal { Y } = \\left\\{ c _ { 1 } , c _ { 2 } , \\cdots , c _ { K } \\right\\}yiY={c1,c2,,cK}是实例的类别。
   过程:
      (1)根据给定的距离度量,在训练集DDD中找出与xxx最邻近的kkk个点,涵盖着kkk个点的领域记为Nk(x)N _ { k } ( x )Nk(x)

      (2)在Nk(x)N _ { k } ( x )Nk(x)中根据分类决策规则决定xxx的类别yyy
y=argmaxcjxiNk(x)I(yi=cj),i=1,2, ,N;j=1,2, ,K y = \\arg \\max _ { c _ { j } } \\sum _ { x _ { i } \\in N _ { k } ( x ) } I \\left( y _ { i } = c _ { j } \\right) , \\quad i = 1,2 , \\cdots , N ; \\quad j = 1,2 , \\cdots , K y=argcjmaxxiNk(x)I(yi=cj),i=1,2,,N;j=1,2,,K
   输出:测试样本xxx所属的类别yyy

4. KNN实现之kd树

  KNN最简单的实现方法是线性扫描,这是一种暴力实现方法,然而当训练集很大时,搜索k个最近邻居的计算非常耗时。

  在实现kNN时,主要考虑的问题就是如何对训练数据进行快速k近邻搜索。这样的方法有kd树和球树,本文只讨论kd树,入对球树感兴趣,可参见参考文献2

  kd树使用了特殊的结构存储训练数据,减少计算目标值与训练实例的距离的次数。

  kd树算法包括两个主要步骤:

  1. 构造kd树;
  2. 搜索最近邻;

  下面介绍kd树算法的原理,可结合参考文献3的案例来理解。

4.1 构造kd树

  kd树是一种对k维空间中的实例点进行存储,以便对其进行快速检索的二叉树结构。构造kd树相当于不断地用垂直于坐标轴的超平面将k维空间切分,构成一系列的k维超矩形区域,kd树的每个结点对应一个k维超矩形区域。如图1所示:

\"\"
收藏 打印
您的足迹: