【ML学习笔记03】《统计学习方法》—ch03:k近邻法

ch03: k近邻法

k 近邻法(k-nearest neighbor,k-NN)是一种基本分类与回归方法.本书只讨论分类问题中的 k 近邻法

  • k 近邻法的输入为实例的特征向量,对应于特征空间的点;输出为实例的类别,可以取多类.
  • k 近邻法假设给定一个训练数据集,其中的实例类别已定.分类时,对新的实例,根据其 k 个最近邻的训练实例的类别,通过多数表决等方式进行预测.因此, k 近邻法不具有显式的学习过程.
  • k 近邻法实际上利用训练数据集对特征向量空间进行划分,并作为其分类的“模型”.
  • k值的选择、距离度量及分类决策规则是k 近邻法的三个基本要素

1. k近邻算法

k 近邻算法简单、直观:给定一个训练数据集,对新的输入实例,在训练数据集中找到与该实例最邻近的 k 个实例,这 k 个实例的多数属于某个类,就把该输入实例分为这个类.

  • 输入:训练数据集
    T = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , . . . , ( x N , y N } T=\{(x_1,y_1),(x_2,y_2),...,(x_N,y_N\} T={(x1,y1),(x2,y2),...,(xN,yN}

    其中 x i x_i xi为实例的特征向量, y i y_i yi为实例的类别;实例特征向量 x

  • 输出:实例 x 所属的类 y

  • 步骤:
    (1)根据给定的距离度量,在训练集 T 中找出与 x 最邻近的 k 个点,涵盖这 k 个点的 x 的邻域记作 N k ( x ) N_k(x) Nk(x)
    (2)在 N k ( x ) N_k(x) Nk(x)中根据分类决策规律(如多数表决)决定 x 的类别 y

  • k 近邻法的特殊情况是 k=1的情形,称为最近邻算法.

2. k近邻模型

k 近邻法使用的模型实际上对应于对特征空间的划分.模型由三个基本要素——距离度量、 k 值的选择和分类决策规则决定.

模型

  • 特征空间中,对每个训练实例点,距离该点比其他点更近的所有点组成一个区域,叫作单元cell
  • 每个训练实例点拥有一个单元,所有训练实例点的单元构成对特征空间的一个划分.
  • 最近邻法将实例 xi 的类 yi 作为其单元中所有点的类标记(class label).

距离度量

  • 特征空间中两个实例点的距离是两个实例点相似程度的反映
  • k 近邻模型的特征空间一般是n 维实数向量空间 R^n.使用的距离是欧氏距离,但也可以是其他距离,如更一般的 Lp距离(Lp distance)或 Minkowski 距离(Minkowski distance).
    在这里插入图片描述

k值的选择

  • k值较小:相当于用较小的领域中的训练实例进行预测
    • “学习”的近似误差(approximation error) 会减小,只有与输入实例较近的(相似的)训练实例才会对预测结果起作用
    • 但缺点是“学习”的估计误差(estimation error) 会增大,预测结果会对近邻的实例点非常敏感
    • 换句话说,k 值的减小就意味着整体模型变得复杂,容易发生过拟合
  • k值较大:相当于用较大的领域中的训练实例进行预测
    • 其优点是可以减少学习的估计误差.但缺点是学习的近似误差会增大.
    • 这时与输入实例较远的(不相似的)训练实例也会对预测起作用,使预测发生错误.
    • k 值的增大就意味着整体的模型变得简单,如果 k=N,那么无论输入实例是什么,都将简单地预测它属于在训练实例中最多的类.这时,模型过于简单,完全忽略训练实例中的大量有用信息,是不可取的
  • 因此,在应用中,k 值一般取一个比较小的数值.通常采用交叉验证法来选取最优的 k 值.

分类决策规则

k 近邻法中的分类决策规则往往是多数表决,即由输入实例的 k 个邻近的训练实例中的多数类决定输入实例的类

  • 多数表决规则等价于经验风险最小化.

3. k近邻法的实现:kd树

实现 k 近邻法时,主要考虑的问题是如何对训练数据进行快速 k 近邻搜索.这点在特征空间的维数大及训练数据容量大时尤其必要.最简单的实现方法是线性扫描(linear scan).但是非常耗时,为了提高k 近邻搜索的效率,可以考虑使用特殊的结构存储训练数据,以减少计算距离的次数.

构造平衡kd树

  • 输入: k 维空间数据集 T = { x 1 , x 2 , … , x N } T=\{x_1,x_2,…,x_N\} T={x1,x2,,xN}
    其中 x i = { x i ( 1 ) , x i ( 2 ) , … , x i ( k ) } T , i = 1 , 2 , . . . N x_i=\{x^{(1)}_i,x^{(2)}_i,…,x^{(k)}_i\}^T,i=1,2,...N xi={xi(1),xi(2),,xi(k)}T,i=1,2,...N
  • 输出: kd树
  • 步骤:
    • 开始: 构造根结点,对应于包含 T 的 k 维空间的超矩形区域
      (1)选择为坐标轴,以T 中所有实例的 x ( 1 ) x^{(1)} x(1) 坐标的中位数 为切分点,将根结点对应的超矩形区域切分为两个子区域.切分由通过切分点并与坐标轴 x ( 1 ) x^{(1)} x(1)垂直的超平面实现.
      (2)由根结点生成深度为1的左、右子结点:左子结点对应坐标 x ( 1 ) x^{(1)} x(1) 小于切分点的子区域,右子结点对应于坐标 x ( 1 ) x^{(1)} x(1)大于切分点的子区域.
      (3)将落在切分超平面上的实例点保存在根结点.
    • 重复:
      (1)对深度为 j 的结点,选择 x ( l ) x^{(l)} x(l) 为切分的坐标轴, l = j ( m o d k ) + 1 l=j(mod k)+1 l=j(modk)+1
      以该结点的区域中所有实例的 x ( l ) x^{(l)} x(l) 坐标的中位数为切分点,将该结点对应的超
      矩形区域切分为两个子区域.切分由通过切分点并与坐标轴 x^{(l)} 垂直的超平面
      实现.
      (2)由根结点生成深度为 j+1 的左、右子结点:左子结点对应坐标 x ( l ) x^{(l)} x(l) 小于切分点的子区域,右子结点对应于坐标 x ( l ) x^{(l)} x(l)大于切分点的子区域.
      (3)将落在切分超平面上的实例点保存在该结点.
    • 结束: 直到两个子区域没有实例存在时停止.从而形成 kd 树的区域划分.
      在这里插入图片描述

搜索kd树

  • 输入: 已构造的 kd 树;目标点 x;
  • 输出: x 的最近邻
  • 步骤:
    (1)在 kd 树中找出包含目标点 x 的叶结点:从根结点出发,递归地向下访问 kd 树.若目标点 x 当前维的坐标小于切分点的坐标,则移动到左子结点,否则移动到右子结点.直到子结点为叶结点为止
    (2)以此叶结点为“当前最近点”.
    (3)递归地向上回退,在每个结点进行以下操作:
    (a)如果该结点保存的实例点比当前最近点距离目标点更近,则以该实例点为“当前最近点“
    (b)检查该子结点的父结点的另一子结点对应的区域是否有更近的点.如果有,移动到另一个子结点.接着,递归地进行最近邻搜索;如果没有,向上回退.
    (4)当回退到根结点时,搜索结束.最后的“当前最近点”即为 x 的最近邻点.
    在这里插入图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值