统计学习方法 第3章 k近邻法

来源:互联网 发布:codeforces难度知乎 编辑:程序博客网 时间:2024/06/05 18:26

统计学习方法 第3章 k近邻法

算法

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

训练数据集:

其中xi为实例的特征向量,yi为实例的类别。

  1. 根据给定的距离度量,在训练集中找出与输入x最临近的k个点
  2. 从包含这k个点的邻域中根据分类决策规则(如多数表决)决定x的类别y

模型

k近邻法中,当训练集,距离度量,k值及分类决策规则确定后,对于任何一个新的输入实例,它所属的类唯一确定。

特征空间中,对每个训练实例点xi,距离该店比其他点更近的所有点组成一个单元,所有训练实例点的单元构成对特征空间的一个划分,如:

最常用的距离度量为欧氏距离,即L2距离。
Lp距离定义为:

p=1时为曼哈顿距离,p=2时为欧氏距离。

若选择较小的k值,则只有与输入实例较近的训练实例才会对预测结果起作用,学习的近似误差会减小,但估计误差会增大,容易产生过拟合。选择较大的k值可以减小估计误差,但近似误差会增大,整体模型变得简单。在实际应用中一般选取一个比较小的数值,并通过交叉验证发选取最优的k值。

实现:kd树

若通过线性扫描的方式寻找最近的k个训练数据,则计算耗时过长。
kd树是一种对k维空间的实例点进行存储以便对其进行快速检索的二叉树。利用kd树可以省去对大部分数据点的搜索,从而减少搜索的计算量。

构造kd树相当于不断用垂直于坐标轴的超平面将k维空间划分,构成一系列的k维超矩形区域。kd树的每个节点对应于一个k维超矩形区域。

构造平衡kd树

k维空间数据集 T={x1,x2,…,xN}
其中xi=(xi(1),xi(2),…,xi(i)) i=1~N

  1. 构造根节点,根节点对应包含T的k维空间的超矩形区域
  2. 选x1为坐标轴,以所有实例的x1坐标中位数为切分点将超矩形区域区分成两个子区域,分别为左右子节点,并将切分超平面上的实例点保存在根节点
  3. 重复:对深度为j的节点,选xl,l=j(mod k)+1为切分坐标轴,所有实例在该坐标轴的坐标中位数为切分点进行切分,直到子区域没有实例时停止

搜索kd树

  1. 从根节点出发,递归地向下访问,根据每个节点的切分坐标比较目标点,直到抵达叶子节点,以此叶子节点为当前最近点
  2. 递归地向上回退,对每个节点进行操作:
    1. 若该节点保存的实例比当前最近点距目标点更近,则以该节点为当前最近点
    2. 检查该子节点的父节点的另一子节点对应的区域是否与以目标点为球心,目标点与当前最近点距离为半径的圆相交,若相交则移动到另一子节点,递归进行搜索,若不相交则继续回退
  3. 回退到根节点,搜索结束,当前最近点即为目标点的最近邻点