kd树就是一种对k维空间中的实例点进行存储以便对其进行快速检索的树形数据结构,可以运用在k近邻法中,实现快速k近邻搜索。构造kd树相当于不断地用垂直于坐标轴的超平面将k维空间切分。
   假设数据集\(T\)的大小是\(m*n\),即\(T={x_1,x_2,...x_m}\),其中\(x_i=(x_i^{(1)},x_i^{(2)},...,x_i^{(n)})^T,i=1,2,...m\)。构建Kd树的过程大致如下。
  对所有的数据,以\(x^{(1)}\)为轴,即取\(x_i^{(1)},i=1,2,...m\),并求得其中位数\(mid^{(1)}\),\(mid^{(1)}\)对应的点即为根节点,以\(mid^{(1)}\)为切分点,将剩余数据分为两个集合,左子树对应小于切分点的区域,右子树对应大于切分点的区域,然后针对每个集合,以\(x^{(2)}\)为轴,重复上述过程,继续切分为两个集合,然后不断重复上述过程,依次选择\(x^{(j)},j=1,2,...,n\)为轴,直到切分得到的集合中只有一个数据为止。
   kd树的构造相对简单,那么如何利用kd树进行搜索?
  给定一个目标点,搜索其最近邻,首先按照“左小右大”的规则,找到目标点所属区域对应的叶节点,然后从该叶节点出发,依次回退到父节点,不断查找与目标点最邻近的点,当确定不可能存在更近的节点时终止,这样搜索就被限制在空间的局部区域上,效率大大提高。
  具体来说,
  (1)从根节点出发,按照“左小右大”的规则,找到目标点所属区域对应的叶节点
  (2)然后从该叶节点出发,向上回退,在回退到的每个父节点\(f\)上,执行一下两种操作:
    (a)判断\(f\)与目标点的距离是否比当前最近距离更近,如果是,则将当前最近点更新为\(f\)
    (b)当前最近点一定存在于\(f\)的一个子结点对应的区域中,即一定存在于\(f\)对应的区域中,即有可能\(f\)另一个   子结点距离目标点更近。判断目标点是否距离\(f\)另一个子结点对应区域更近,具体地,判断目标点与\(f\)对应的切  分轴 的距离是否小于当前最小距离,如果小于,从该子结点出发,重复执行步骤(2)
  (3)当回退到根节点并完成对根节点步骤(2)中的两步操作时,搜索结束。当前最近点即为目标点的最近邻点。
以一个具体例子说明。如图1是生成的一颗kd树,特征空间划分如图2所示,要求目标点S(4.5,7.5)的最近邻点。

  搜索过程如下:
  (1)首先在kd树中找到了包含目标点S的叶节点D,D即为当前最近点,两点之间的距离是当前最近距离dist;
  (2)向上回退到点B,点B距离点S更远,并且点B以\(x^{(2)}=5.5\)为切分轴,S距离\(x^{(2)}=5.5\)的距离大于dist,不用考虑点F;
  (3)继续向上回退到根节点点A,点A距离点S更远,但是点A以\(x^{(1)}=5\)为切分轴,S距离\(x^{(1)}=5\)的距离小于dist,那么点S有可能距离A的右子树区域C中的点更近
  (4)从点C出发,一直访问到点E,点E比点D距离点S更近,点E成为当前最近点,两点之间的距离是当前最近距离dist;
  (5)从点E向上回退到点C,点C距离点S更远,并且点C以\(x^{(2)}=4.5\)为切分轴,S距离\(x^{(2)}=4.5\)的距离大于dist,不用考虑点G
  (6)继续向上回退,再次回退到了根节点A,结束搜索,点E即为点S的最近邻点。

kd树的原理的更多相关文章

  1. kd树 求k近邻 python 代码

      之前两篇随笔介绍了kd树的原理,并用python实现了kd树的构建和搜索,具体可以参考 kd树的原理 python kd树 搜索 代码 kd树常与knn算法联系在一起,knn算法通常要搜索k近邻, ...

  2. python kd树 搜索 代码

    kd树就是一种对k维空间中的实例点进行存储以便对其进行快速检索的树形数据结构,可以运用在k近邻法中,实现快速k近邻搜索.构造kd树相当于不断地用垂直于坐标轴的超平面将k维空间切分,依次选择坐标轴对空间 ...

  3. 【特征匹配】SIFT原理之KD树+BBF算法解析

    转载请注明出处:http://blog.csdn.net/luoshixian099/article/details/47606159 继上一篇中已经介绍了SIFT原理与C源代码剖析,最后得到了一系列 ...

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

    Kd-Tree,即K-dimensional tree,是一棵二叉树,树中存储的是一些K维数据.在一个K维数据集合上构建一棵Kd-Tree代表了对该K维数据集合构成的K维空间的一个划分,即树中的每个结 ...

  5. kd树原理及实现

    常用来作空间划分及近邻搜索,是二叉空间划分树的一个特例.通常,对于维度为k,数据点数为N的数据集,kd树适用于N≫2的k次方的情形. 1维数据的查询 假设在数据库的表格T中存储了学生的语文成绩chin ...

  6. 利用KD树进行异常检测

    软件安全课程的一次实验,整理之后发出来共享. 什么是KD树 要说KD树,我们得先说一下什么是KNN算法. KNN是k-NearestNeighbor的简称,原理很简单:当你有一堆已经标注好的数据时,你 ...

  7. kd树和knn算法的c语言实现

    基于kd树的knn的实现原理可以参考文末的链接,都是一些好文章. 这里参考了别人的代码.用c语言写的包括kd树的构建与查找k近邻的程序. code: #include<stdio.h> # ...

  8. PCL点云库:Kd树

    Kd树按空间划分生成叶子节点,各个叶子节点里存放点数据,其可以按半径搜索或邻区搜索.PCL中的Kd tree的基础数据结构使用了FLANN以便可以快速的进行邻区搜索.FLANN is a librar ...

  9. KNN算法与Kd树

    最近邻法和k-近邻法 下面图片中只有三种豆,有三个豆是未知的种类,如何判定他们的种类? 提供一种思路,即:未知的豆离哪种豆最近就认为未知豆和该豆是同一种类.由此,我们引出最近邻算法的定义:为了判定未知 ...

随机推荐

  1. bzoj 3545: [ONTAK2010]Peaks

    Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1124  Solved: 304[Submit][Status][Discuss] Descripti ...

  2. MySQL表损坏修复【Incorrect key file for table】

    今天机房mysql服务器异常关机,重新启动后报错如下: -- :: [ERROR] /usr/local/mysql/bin/mysqld: Incorrect key file for table ...

  3. 安装xenserver6.5

    安装之前的准备工作就不在赘述了,下边开始安装 1.安装界面 2.键盘模式选择默认-美式,ok 3.这里提醒你安装将清除磁盘信息,做好备份,选择ok. 4.这一步没有选择,要么继续,要么退回,选择Acc ...

  4. C#设计模式之控制反转即依赖注入-Spring.NET

    主流的依赖注入方案:微软企业库中的Unity.Spring.NET.StructureMap.Ninject.Castle Windsor等等. 本章用简单的案例讲解 Spring.NET IOC-控 ...

  5. 关于java 线程池 ThreadPoolExceutor 之 TestDemo

    public class App { public static void main(String[] args) throws InterruptedException { System.out.p ...

  6. 如何选择正确的angular2学习曲线?

    参考: https://www.zhihu.com/question/50800464/answer/122921043 https://www.zhihu.com/question/48670501 ...

  7. activiti如何让业务对象和对应的流程关联

    如何让业务对象和对应的流程 关联? 发现ProcessInstance 有个方法getBusinessKey()可以得到一个businessKey. ProcessInstance 对应数据库中的表a ...

  8. Mysql5.7基于日志转为基于事务主从复制

    将基于日志的复制变更为基于事务的复制 mysql版本要高于5.7.6 gtid_mode要设为off 处理步骤 详细步骤 1.查看主从mysql版本是否高于5.7.6 show variables l ...

  9. JS中,如何判断一个数是不是小数?如果是小数,如何判断它是几位小数??

    <script type="text/javascript">     var x = 4.23323;//测试的数字     var y = String(x).in ...

  10. 【zznu-夏季队内积分赛3-I】逛超市

    题目描述 “别人总说我瓜,其实我一点也不瓜,大多数时候我都机智的一批“我宝儿姐背包学的太差了,你们谁能帮我解决这道题,我就让他做我的男朋友!宝儿姐现在在逛超市,超市里的种类实在是太多了,每种都有很多很 ...