Kd-Tree,即K-dimensional tree,是一棵二叉树,树中存储的是一些K维数据。在一个K维数据集合上构建一棵Kd-Tree代表了对该K维数据集合构成的K维空间的一个划分,即树中的每个结点就对应了一个K维的超矩形区域(Hyperrectangle)。

在介绍Kd-tree的相关算法前,我们先回顾一下二叉查找树(Binary Search Tree)的相关概念和算法。k=1就是BST!

例如,图1中是一棵二叉查找树,其满足BST的性质。

图1 二叉查找树(来源:Wiki)

KD树的构建

kd树构建的伪代码如下图所示(伪代码来自《图像局部不变特性特征与描述》王永明 王贵锦 编著):

再举一个简单直观的实例来介绍k-d树构建算法。假设有6个二维数据点{(2,3),(5,4),(9,6),(4,7),(8,1),(7,2)},数据点位于二维空间内,如下图所示。为了能有效的找到最近邻,k-d树采用分而治之的思想,即将整个空间划分为几个小部分,首先,粗黑线将空间一分为二,然后在两个子空间中,细黑直线又将整个空间划分为四部分,最后虚黑直线将这四部分进一步划分。

6个二维数据点{(2,3),(5,4),(9,6),(4,7),(8,1),(7,2)}构建kd树的具体步骤为:

  1. 确定:split域=x。具体是:6个数据点在x,y维度上的数据方差分别为39,28.63,所以在x轴上方差更大,故split域值为x;
  2. 确定:Node-data = (7,2)。具体是:根据x维上的值将数据排序,6个数据的中值(所谓中值,即中间大小的值)为7,所以Node-data域位数据点(7,2)。这样,该节点的分割超平面就是通过(7,2)并垂直于:split=x轴的直线x=7;
  3. 确定:左子空间和右子空间。具体是:分割超平面x=7将整个空间分为两部分:x<=7的部分为左子空间,包含3个节点={(2,3),(5,4),(4,7)};另一部分为右子空间,包含2个节点={(9,6),(8,1)};
如上算法所述,kd树的构建是一个递归过程,我们对左子空间和右子空间内的数据重复根节点的过程就可以得到一级子节点(5,4)和(9,6),同时将空间和数据集进一步细分,如此往复直到空间中只包含一个数据点。

与此同时,经过对上面所示的空间划分之后,我们可以看出,点(7,2)可以为根结点,从根结点出发的两条红粗斜线指向的(5,4)和(9,6)则为根结点的左右子结点,而(2,3),(4,7)则为(5,4)的左右孩子(通过两条细红斜线相连),最后,(8,1)为(9,6)的左孩子(通过细红斜线相连)。如此,便形成了下面这样一棵k-d树:

问题1: 每次对子空间的划分时,怎样确定在哪个维度上进行划分?

最简单的方法就是轮着来,即如果这次选择了在第i维上进行数据划分,那下一次就在第j(j≠i)维上进行划分,例如:j = (i mod k) + 1。想象一下我们切豆腐时,先是竖着切一刀,切成两半后,再横着来一刀,就得到了很小的方块豆腐。

可是“轮着来”的方法是否可以很好地解决问题呢?再次想象一下,我们现在要切的是一根木条,按照“轮着来”的方法先是竖着切一刀,木条一分为二,干净利落,接下来就是再横着切一刀,这个时候就有点考验刀法了,如果木条的直径(横截面)较大,还可以下手,如果直径较小,就没法往下切了。因此,如果K维数据的分布像上面的豆腐一样,“轮着来”的切分方法是可以奏效,但是如果K维度上数据的分布像木条一样,“轮着来”就不好用了。因此,还需要想想其他的切法。

如果一个K维数据集合的分布像木条一样,那就是说明这K维数据在木条较长方向代表的维度上,这些数据的分布散得比较开,数学上来说,就是这些数据在该维度上的方差(invariance)比较大,换句话说,正因为这些数据在该维度上分散的比较开,我们就更容易在这个维度上将它们划分开,因此,这就引出了我们选择维度的另一种方法:最大方差法(max invarince),即每次我们选择维度进行划分时,都选择具有最大方差维度。

摘自:http://blog.csdn.net/junshen1314/article/details/51121582

转载于:https://www.cnblogs.com/bonelee/p/7010071.html

KD树——k=1时就是BST,里面的数学原理还是有不明白的地方,为啥方差划分?...相关推荐

  1. 多维空间分割树--KD树

    算法介绍 KD树的全称为k-Dimension Tree的简称,是一种分割K维空间的数据结构,主要应用于关键信息的搜索.为什么说是K维的呢,因为这时候的空间不仅仅是2维度的,他可能是3维,4维度的或者 ...

  2. 机器学习----KNN中的Kd树及BBF优化

    一.KD树基本解释 1.1.基础概念 1.2.什么是KD树 1.3.KD树的构建 1.3.1.算法的实现 1.3.2.构造代码部分 1.3.2.具体步骤 二.KD树基本操作 2.1.KD树查找 2.2 ...

  3. 【KNN以及KD树】

    文章目录 前言 一.学习类型 二.机器学习算法使用步骤 1.收集数据 2准备输入数据 3分析输入数据 4训练算法 5测试算法 6使用算法 三.KNN 1KNN简介 2KD树简介 总结 前言 提示:这里 ...

  4. 统计学习笔记(3)——k近邻法与kd树

    在使用k近邻法进行分类时,对新的实例,根据其k个最近邻的训练实例的类别,通过多数表决的方式进行预测.由于k近邻模型的特征空间一般是n维实数向量,所以距离的计算通常采用的是欧式距离.关键的是k值的选取, ...

  5. java knn kd树_KNN算法之KD树(K-dimension Tree)实现 K近邻查询

    KD树是一种分割k维数据空间的数据结构,主要应用于多维空间关键数据的搜索,如范围搜索和最近邻搜索. KD树使用了分治的思想,对比二叉搜索树(BST),KD树解决的是多维空间内的最近点(K近点)问题.( ...

  6. 基于KD树的K近邻算法(KNN)算法

    文章目录 KNN 简介 KNN 三要素 距离度量 k值的选择 分类决策规则 KNN 实现 1,构造kd树 2,搜索最近邻 3,预测 用kd树完成最近邻搜索 K近邻算法(KNN)算法,是一种基本的分类与 ...

  7. k近邻法的实现(kd树)-相关问题梳理

    K邻近算法的伪代码 机器学习实战 李锐等译 对未知类别属性的数据集的每一个点依次进行如下操作: 1.计算已知类别数据集中的点与当前点之间的距离: 2.按照距离递增次序排序 3.选取与当前点距离最小的k ...

  8. K近邻算法的kd树实现

    k近邻算法的介绍 k近邻算法是一种基本的分类和回归方法,这里只实现分类的k近邻算法. k近邻算法的输入为实例的特征向量,对应特征空间的点:输出为实例的类别,可以取多类. k近邻算法不具有显式的学习过程 ...

  9. 《统计学习方法》—— k近邻方法、kd树以及python3实现

    前言 k近邻方法的初衷很简单,就是找最近的k个数据,根据这些数据的标记,按照某种规则,给新的数据标记.这里,我们可以看到三个重点:k值,距离度量和决策规则. k值决定方法的复杂程度.考虑k很大,足以包 ...

最新文章

  1. 神经网络中的批量归一化Batch Normalization(BN)原理总结
  2. (完美解决)linux服务器安装anaconda并且配置好jupyter从而windows远程访问
  3. Backtrack5 下WEB模糊测试
  4. linux C编程之makefile
  5. SQL SERVER深入学习学习资料参考
  6. jquery-懒加载技术(简称lazyload)
  7. C++将带ui界面的qt工程封装为动态库dll
  8. Firefox火狐Flash插件卡死问题完美解决方法(转载)
  9. srs 服务关闭命令_【经验总结】如何做到网络版工作站与服务器时间同步?
  10. 关于IIS服务启动失败的问题:“IIS提示‘另一个程序正在使用此文件,进程无法访问’”,的解决方法...
  11. 多路转接select1
  12. css3 下边框缓缓划过_干货来袭!web前端开发工程师必看之如何使用CSS3实现瀑布流效果?...
  13. 【java学习之路】(数据结构篇)002.栈和队列
  14. python是什么专业学的-什么水平的人才可以学python呢?
  15. Oracle RAC系列之:ASM基本操作维护
  16. Atitit 修改密码的功能流程设计 attilax总结
  17. idea jar包重新依赖_分布式架构系列:jar包依赖管理
  18. matlab数学实验 课件,MATLAB数学实验课件.PPT
  19. 微信小程序如何使用视频组件
  20. 【leetCode】69. x 的平方根

热门文章

  1. 查看linux中某个端口(port)是否被占用
  2. c mysql存储过程实例_MySQL存储过程实例
  3. 两张照片重叠处半透明_美人计 | 林允儿的发型可真好看!拿着照片去找发型师吧...
  4. 翟萍python程序设计_Python程序设计(高等学校计算机教育规划教材)
  5. 触摸屏中文软件_八招轻松搞定西门子软件安装!
  6. 麦芒8能安装鸿蒙系统吗,首颗5G基带芯片麦芒8发布鸿蒙最新进展
  7. selector多路复用_超详细的I/O多路复用概念、常用I/O模型、系统调用等介绍
  8. 长沙医学院计算机系怎么样,长沙医学院有哪些专业及什么专业好
  9. android播放页蒙层过渡效果,EasyGuideLayer: 这可能是最简单、灵活、强大的页面蒙层组件了!...
  10. tp3.2.3权限控制一之详解及demo