Machine Learning
  • Introduction
  • 机器学习
    • 前言
      • 符号表
    • 监督式学习
      • 感知机
        • 感知机模型
        • 感知机学习算法
        • 算法python实现
      • Logistic回归
        • Logistic分布
        • Logistic回归模型
        • 算法python实现
      • 线性回归
        • 线性回归模型
        • 算法python实现
      • K近邻法
        • k近邻模型
        • kd树方法
        • kd树python实现
        • knn实例
      • 朴素贝叶斯法
        • 模型和原理
        • 参数估计
        • 算法和实现
      • 决策树
        • 模型与学习
        • 特征选择
        • 生成算法和剪枝
        • python实现
      • 支持向量机
    • 神经网络
      • 神经元模型和感知机
      • 神经网络
      • 神经网络的矩阵表达
      • 反向传播算法
        • 算法证明
        • 算法代码
        • 基于矩阵的计算
      • 改进神经网络的学习方法
        • 交叉熵代价函数
        • softmax
        • regularization
        • 权重初始化
      • 卷积神经网络
        • 基本介绍
    • 数学基础
      • 线性代数
        • 特征值和特征向量
      • 概率统计
        • 随机变量的特征
        • 样本统计量
        • 先验后验概率
      • 微积分
        • 向量内积
        • 方向导数和梯度
        • 梯度下降法
      • 信息论
        • 熵
        • 相对熵和交叉熵
        • 条件熵
        • 互信息
Powered by GitBook
On this page
  • 1. 构造平衡树算法
  • 2. kd树的最近邻搜索
  • 3. 例子
  1. 机器学习
  2. 监督式学习
  3. K近邻法

kd树方法

Previousk近邻模型Nextkd树python实现

Last updated 7 years ago

kdkdkd树是一种对kkk维空间中的实例点进行存储以便对其进行快速检索的树形结构。它是二叉树,表示对kkk维空间的一个划分(partition)。构造kdkdkd树相当于不断地用垂直于坐标轴的超平面将kkk维空间划分,构成一列的kkk维超矩形区域。kdkdkd树的每个节点对应于一个kkk维超矩形区域。

pic source:

1. 构造平衡kdkdkd树算法

输入:kkk维空间数据集T={x(1),x(2),...,x(m)}T=\{x^{(1)},x^{(2)},...,x^{(m)}\}T={x(1),x(2),...,x(m)},其中x(i)=(x1,x2,...,xk)Tx^{(i)}=(x_1, x_2, ..., x_k)^Tx(i)=(x1​,x2​,...,xk​)T,i=1,2,...,mi=1,2,...,mi=1,2,...,m

输出:kd树

1)开始:构造根节点,根节点对应于包含TTT的kkk维空间的超矩形区域。

选择x1x_1x1​为坐标轴,以TTT中所有实例的x1x_1x1​坐标的中位数为切分点,将根节点对应的超矩形区域切分为两个子区域。切分由通过切分点并与坐标轴x1x_1x1​垂直的超平面实现。

由根节点生成深度为1的左右子树:左子树对应于坐标x1x_1x1​的值小于切分点的子区域,右子树对应于坐标x1x_1x1​的值大于切分点的子区域。

将落在切分超平面上的实例点保存在根节点。

2)重复:对于深度为lll的节点,选择xjx_jxj​为切分的坐标轴,j=l(modk)+1j=l\pmod k+1j=l(modk)+1,举例来讲就是第一次切分选择坐标x1x_1x1​,第二次选择坐标x2x_2x2​,第三次选择坐标x3x_3x3​,当kkk维后,返回到x1x_1x1​继续作为切分坐标。切分由通过切分点并与轴xjx_jxj​垂直的超平面实现。

对于左右子树,以xjx_jxj​坐标的中位数为切分点,并保存为子树的根节点,然后同样分成两个子树。

3)直到两个子区域没有实例存在时停止,从而形成kdkdkd树的区域划分。

2. kd树的最近邻搜索

输入:已经构造好的kdkdkd树;目标点xxx

输出:xxx的最近邻

1)首先在kdkdkd树中找出包含目标点xxx的叶节点。方法是从根节点出发,递归地向下访问kdkdkd树,若目标点xxx当前维的坐标小于切分点的坐标,则往左子树查找,否则往右子树查找,一直到叶节点为止。

2)以此叶节点为“当前最邻近点”

3)递归往上回退,在每个节点上进行如下操作

  • 如果该节点的实例比当前保存的最近点的距离更近,则以该节点为“当前最邻近点”

  • 检查另一边子树有没有更近的点,如果有则从该节点往下找

  • 即检查当前节点的超平面是否跟以目标节点xxx为圆心,目标节点xxx与“当前最邻近点”的距离为半径构成的圆体相交。

  • 如果相交,可能在超平面的另外一侧有节点离目标节点更近,因此移动到超平面的另外一侧的递归执行搜索

  • 如果不相交,则向上回退

4)当回退到根节点时(根节点已经完成了步骤3 的操作),搜索结束,最后的“当前最近点”即为xxx的最邻近点。

如果实例点是随机分布的,则kdkdkd树搜索的平均计算复杂度是O(logN)O(logN)O(logN)。kdkdkd树更适用于训练实例数远大于空间维数的情况,如果训练实例数接近空间维数,则效率退化为线性扫描。

3. 例子

示例1:

示例2:

pic source:

维基百科上的一个动画例子(

By User A1 at English Wikipedia, CC BY-SA 3.0,

http://blog.csdn.net/baimafujinji/article/details/52928203
https://en.wikipedia.org/wiki/K-d_tree)
https://commons.wikimedia.org/w/index.php?curid=16242339
http://homes.sice.indiana.edu/yye/lab/teaching/spring2014-C343/moretrees.php