kd树的构建与搜索
来源:互联网 发布:保险公司数据录入外包 编辑:程序博客网 时间:2024/04/28 18:06
二、构建完kd树之后,如今进行最近邻搜索呢?
KD树的查找算法:
在k-d树中进行数据的查找也是特征匹配的重要环节,其目的是检索在k-d树中与查询点距离最近的数据点。
这里先以一个简单的实例来描述最邻近查找的基本思路。
例一:查询的点(2.1,3.1)(较简单)。
1、如图3所示,星号表示要查询的点(2.1,3.1)。通过二叉搜索,顺着搜索路径很快就能找到最邻近的近似点,也就是叶子节点(2,3)。
2、而找到的叶子节点并不一定就是最邻近的,最邻近肯定距离查询点更近,应该位于以查询点为圆心且通过叶子节点的圆域内。
3、为了找到真正的最近邻,还需要进行'回溯'操作:
算法沿搜索路径反向查找是否有距离查询点更近的数据点。
此例中先从(7,2)点开始进行二叉查找,然后到达(5,4),最后到达(2,3),此时搜索路径中的节点为<(7,2),(5,4),(2,3)>,
首先以(2,3)作为当前最近邻点,计算其到查询点(2.1,3.1)的距离为0.1414,
然后回溯到其父节点(5,4),并判断在该父节点的其他子节点空间中是否有距离查询点更近的数据点。以(2.1,3.1)为圆心,以0.1414为半径画圆,如图3所示。发现该圆并不和超平面y = 4交割,因此不用进入(5,4)节点右子空间中去搜索。
4、最后,再回溯到(7,2),以(2.1,3.1)为圆心,以0.1414为半径的圆更不会与x = 7超平面交割,因此不用进入(7,2)右子空间进行查找。至此,搜索路径中的节点已经全部回溯完,结束整个搜索,返回最近邻点(2,3),最近距离为0.1414。
图3
例二:查找点为(2,4.5)(叫复杂一点)。
一个复杂点了例子如查找点为(2,4.5)。
1、同样先进行二叉查找,先从(7,2)查找到(5,4)节点,在进行查找时是由y = 4为分割超平面的,由于查找点为y值为4.5,因此进入右子空间查找到(4,7),形成搜索路径<(7,2),(5,4),(4,7)>,
2、取(4,7)为当前最近邻点,计算其与目标查找点的距离为3.202。然后回溯到(5,4),计算其与查找点之间的距离为3.041。
((4,7)与目标查找点的距离为3.202,而(5,4)与查找点之间的距离为3.041,所以(5,4)为查询点的最近点;)
3、以(2,4.5)为圆心,以3.041为半径作圆,如图4所示。可见该圆和y = 4超平面交割,所以需要进入(5,4)左子空间进行查找。此时需将(2,3)节点加入搜索路径中得<(7,2),(2,3)>。
4、回溯至(2,3)叶子节点,(2,3)距离(2,4.5)比(5,4)要近,所以最近邻点更新为(2,3),最近距离更新为1.5。
5、回溯至(7,2),以(2,4.5)为圆心1.5为半径作圆,并不和x = 7分割超平面交割,如图5所示。
至此,搜索路径回溯完。返回最近邻点(2,3),最近距离1.5。
图4 图5
上述的kd树是完成最近邻的搜索,其实也可以找到最近的k个点。
k-d树查询算法的简要说明:
- kd树的构建与搜索
- 统计数学方法——kd树的构建,kd树的搜索
- k近邻算法与kd树的创建和搜索
- KD树构建
- 用kd树的最近邻搜索
- kd树搜索
- 原始kd树的构建和显示(递归实现)
- KD树与决策树
- KD-tree的原理以及构建与查询操作的python实现
- KD-tree的原理以及构建与查询操作的python实现
- KD-tree的原理以及构建与查询操作的python实现
- KD-tree的原理以及构建与查询操作的python实现
- 有意思的kd树
- KNN算法与Kd树
- KNN算法与Kd树
- 二元搜索树的构建
- K近邻算法线性扫描与kd树的差异
- 二叉搜索树的构建与判别--是否为同一棵二叉搜索树
- PostgreSQL&Oracle——参考链接
- 一个高铁线杆杆号自动识别分类系统
- enumerate
- air jordan shoes jordan new shoes
- QML中多个动画的操作
- kd树的构建与搜索
- 重整晋商雄风,再现汇通天下 -------《晋商》阅读笔记第10章(完结)
- Glide的封装和使用总结
- 安装pdksh报错的解决方法(pdksh conflicts with ksh-20120801-10.el6.x86_64)
- mac 配置 maven 实例
- 贝卡尔特
- python twisted 建立服务器
- openwrt之 mtd操作
- Java中实现HTTP网络通信(1.1)