《统计学习方法(李航)》k近邻 学习笔记

作者:jliang

https://blog.csdn.net/jliang3

 

1.重点归纳

1)k近邻是一种基本分类与回归方法,不具有显式的学习过程。

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

3)k近邻法最简单的实现方法是线性扫描,当训练集很大时,计算非常耗时。为提高搜索效率,可以使用特殊的结构(kd树)存储训练数据,以减少计算距离的次数。

2.k近邻算法

1)k近邻是一种基本分类与回归方法。

  • 分类时,对新的实例,根据其k个最近邻的训练数据集,通过多数表决的方式进行预测。
  • 回归时,对新的实例,根据其k个最近邻的训练数据集,通过取平均值的方式进行预测。

2)k近邻法不具有显式的学习过程,k近邻法实际上利用训练数据集对特征向量空间进行划分,并作为其分类的“模型”。

3)k近邻的特殊情况是k=1时,称为最近邻算法。

3.k近邻模型

扫描二维码关注公众号,回复: 4645713 查看本文章

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

2)特征空间中两个实例点的距离是两个实例点相似程度的反映。

3)距离度量

  • 马氏距离/Lp距离(Lp distince)/Minkowski距离(Minkowski distance)

  • p=1时,曼哈顿距离:对应L1范数

  • p=2时,欧氏距离:对应L2范数

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

4)k值的选择会对k近邻法结果产生重大影响。

(1)较小的k值学习的近似误差会减少,只与输入实例较近的训练实例才会对预测结果产生作用。但缺点是学习的估计误差会增大,预测结果对近邻实例点非常敏感。如果邻近的实例是噪音就会导致预测错误。K值的减少意味着整体模型变得复杂,容易发生过拟合。

(2)较大的k值的优点是减少学习的估计误差,但缺点是学习的近似误差会增大。这是与输入实例较远的训练实例也会对预测产生影响,使预测发生错误。K值的增大意味着整体模型变得简单。

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

4.k近邻法的实现:kd

1)k近邻法最简单的实现方法是线性扫描,当训练集很大时,计算非常耗时。为提高搜索效率,可以使用特殊的结构(kd树)存储训练数据,以减少计算距离的次数。

2)kd树是一种k维空间的实例点进行存储以便对其快速检索的树形数据结构。Kd树是二叉树,表示对k维空间切分,构造kd树相当于不断地用垂直于坐标轴的超平面将k维空间切分,构成一系列的k维超矩形区域。

3)kd树构造步骤

(1)开始构造根结点,根节点对应于包含T的k维空间的超矩形区域。

         选择某个维度x1为坐标轴,以所有实例的x1坐标的中位数为切分点,将根结点对应的超矩形区域切分为两个子区域。左边子结点对应坐标x1小于切分点的子区域,右边子结点对应坐标x1大于切分点的子区域。

(2)重复:对深度为j的结点选择,选择xl为切分的坐标轴,l=j%k+1(轮流使用k维空间的每一维),以该结点的区域中所有实例点的中位数为切分点,将该结点对应的超矩形区域切分为两个子区域。由该结点生成深度为j+1的左、右子结点。

(3)直到两个子区域没有实例存在时停止。

4)kd树构造例子

二维空间数据集:

5)利用kd树可以省去对大部分数据点的搜索,从而减少搜索的计算量。

6)利用kd树最近邻搜索步骤

(1)在kd树中找出包含目标点x的叶节点

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

(2)以此叶子结点为“当前最近点”

(3)递归地向上回退,在每个节点进行以下操作

         a. 如果该结点保存的实例点比当前最近点距离目标点更近,则以该实例点为“当前最近点”。(即父结点更近,则父结点作为“当前最近点”)

         b. 检查x目标点离“当前最近点”在当前维度(树的每一层比较都会变化一次维度)的距离是否大于x目标点与父结点的当前维度的距离大。如果大,则需要比较父结点的另一子结点的距离是否比“当前最近点”距离更近,如果是,则父结点的另一子结点作为“当前最近点”。

(4)当回退到根结点时,搜索结束。最后的“当前最近点”即为x的最近邻点。

7)实例点随机分布时,kd树搜索的平均计算复杂度是O(logN),N是训练实例数。Kd树更适合训练实例远大于空间维度数的k近邻搜索,当维数接近实例数时,效率迅速下降,几乎接近线性扫描。

8)kd树搜索例子:查找点为(2,4.5)

(1)同样先进行二叉查找,先从(7,2)查找到(5,4)节点,在进行查找时是由y = 4为分割超平面的,由于查找点为y值为4.5,因此进入右子空间查找到(4,7),形成搜索路径<(7,2),(5,4),(4,7)>,但(4,7)与目标查找点的距离为3.202,而(5,4)与查找点之间的距离为3.041,所以(5,4)为查询点的最近点;

(2)以(2,4.5)为圆心,以3.041为半径作圆,如下图所示。可见该圆和y = 4超平面交割,所以需要进入(5,4)左子空间进行查找,也就是将(2,3)节点加入搜索路径中得<(7,2),(2,3)>;于是接着搜索至(2,3)叶子节点,(2,3)距离(2,4.5)比(5,4)要近,所以最近邻点更新为(2,3),最近距离更新为1.5;

(3)回溯查找至(5,4),直到最后回溯到根结点(7,2)的时候,以(2,4.5)为圆心1.5为半径作圆,并不和x = 7分割超平面交割,如下图所示。至此,搜索路径回溯完,返回最近邻点(2,3),最近距离1.5。

 

 

猜你喜欢

转载自blog.csdn.net/jliang3/article/details/85226221