kd树

机器学习算法(二十五):KD树详解及KD树最近邻算法 目录 1 KD树 1.1什么是KD树 1.2KD树的构建 1.3 KD树的插入 1.4KD树的删除 1.5KD树的最近邻搜索算法 1.5.1举例:查询点(2.1,3.1) 1.5.2 举例:查询点(2,4.5) 2 kd树近邻搜索算法的改进:BBF算法 3 球树、M树、VP树、MVP树 3.1球树 3.2VP树与MVP树简介 特征点匹配和数据库查、图像检索本质上是同一个问题,都可以归结为一个通过距离函数在高维矢量之间进行相似性检索的问题,如何快速而准确... 阅读详情

参考:

1.《统计学习方法》李航

2.https://baike.baidu.com/item/kd-tree/2302515?fr=aladdin

3.http://www.jianshu.com/p/ffe52db3e12b

4.http://blog.youkuaiyun.com/likika2012/article/details/39619687

1. 概述

KD树是一种查询索引结构,广泛应用于数据库索引中。从概念的角度讲,它是一种高纬数据的快速查询结构,本文首先介绍1维数据的索引查询,然后介绍2维KD树的创建和查询,相关定理和推论也简单列出,本文争取用15分钟的时间,让大家快速理解KD树。

2. 1维数据的查询

假设在数据库的表格T中存储了学生的语文成绩chinese、数学成绩math、英语成绩english,如果要查询语文成绩介于30~93分的学生,如何处理?假设学生数量为N,如果顺序查询,则其时间复杂度为O(N),当学生规模很大时,其效率显然很低,如果使用平衡二叉树,则其时间复杂度为O(logN),能极大地提高查询效率。平衡二叉树示意图为:

图1:平衡二叉树示意图

对于1维数据的查询,使用平衡二叉树建立索引即可。如果现在将查询条件变为:语文成绩介于30~93,数学成绩结余30~90,又该如何处理呢?

如果分别使用平衡二叉树对语文成绩和数学成绩建立索引,则需要先在语文成绩中查询得到集合S1,再在数学成绩中查询得到集合S2,然后计算S1和S2的交集,若|S1|=m,|S2|=n,则其时间复杂度为O(m*n),有没有更好的办法呢?

3. KD树

针对多维数据索引,是否也存在类似的一维的索引方法呢?先看2维数据的集合示意图:

图2: 2维数据示意图

如果先根据语文成绩,将所有人的成绩分成两半,其中一半的语文成绩<=c1,另一半的语文成绩>c1,分别得到集合S1,S2;然后针对S1,根据数学成绩分为两半,其中一半的数学成绩<=m1,另一半的数学成绩>m1,分别得到S3,S4,针对S2,根据数学成绩分为两半,其中一半的数学成绩<=m2,另一半的数学成绩>m2,分别得到S5,S6;再根据语文成绩分别对S3,S4,S5,S6继续执行类似划分得到更小的集合,然后再在更小的集合上根据数学成绩继续,...

上面描述的就是构建KD树的基本思路,其构建后的KD树如下图所示:

图3: KD树示意图

如图所示,l1左边都是语文成绩低于45分,l1右边都是语文成绩高于45分的;l2下方都是语文成绩低于45分且数学成绩低于50分的,l2上方都是语文成绩低于45分且数学成绩高于50分的,后面以此类推。下面的图示,更清晰地表示了KD树的结构及其对应的二叉树:

图4: KD树及对应的二叉树

在了解了KD树的基本原理后,剩下的工作就是如何构建KD树以及如何在KD树上查询了。

3.1 KD树构建算法

相对而言,构建KD树是针对高维数据,需要针对每一维都进行二分,针对二维数据的KD树构建算法如下图5所示:

图5:KD树构建算法

其中的P表示待构建的元素集合,depth表示当前是KD树的第几层,如果depth是偶数,通过纵向线对集合进行划分;如果depth是奇数,通过横向线进行划分(3~5行);第6、7行递归进行KD树中子树的构建。

图5中的算法时间复杂度为:O(nlogn),感兴趣的同学可以写出递推公式公式进行推到,算法导论中专门讲了这个递推公式。

3.2 KD树查询算法

在构建了KD树的基础上,如何进行查询其实是一个相对简单的问题了,在这里需要注意的是,在KD树中每一层划分所依据的是哪一维的数据,其它的根二叉树其实没有差别。KD树查询算法如下图所示:

图6: 查询算法

图6中算法的v表示KD树中当前搜索的子树,R表示是一个高维数据的区域,区域的概念如图7所示:

图7: 区域示意图

如果v是叶子结点且属于区域R,则直接返回(第1行);如果v是非叶子结点,则比较R与v的左子树lc(v)是否有交集,如果有且lc(v)完全被R覆盖,则lc(v)是所查询结果的一部分,如果不是完全覆盖,则递归查询lc(v)(3~6行);对右子树也是类似的操作(7~10)。算法的时间复杂度为:O(sqrt(n) + k),其中k是最后的结果中元素的个数,其递推公式公式为:

图8: KD树查询递推公式

上述算法中的二维也可升级为3维,其思维方式与从1维升级到2维一致,相应的构建算法和查询算法也与2维的一致,感兴趣的童鞋可以分析相应算法的时间复杂度。

4. 小结

本文以从1维数据索引跳变到2维数据索引的方式,引出了KD树,并介绍了KD树的构建与索引查询算法。KD树主要应用在高维数据索引,特别是空间数据库的索引,x和y分别表示经度和纬度,能较好的处理空间上的查询效率问题,如果在x和y再加一个时间维度,也能较好地处理时空数据索引查询。


k近邻算法——kd树 kd树(K-Dimensional Tree)是一种对K维空间中的实例点进行存储以便对其进行快速检索的树形数据结构。 kd树是二叉树,表示对K维空间的一个划分 (partition).构造Kd树相 当于不断地用垂直于坐标轴的 超平面将k维空间切分,构成一系列的k维超矩形区 域.Kd树的每个结点对应于一个k维超矩形区域。 注:kd ... 阅读详情

相关推荐

算法(1):KD树的原理与基本代码

由于在做项目时遇到平面内最近点求解的问题,需要用到KD树简化算法,减少计算资源,因此本文记录这个过程中学到的知识。

qq_41904236的博客 1万+

KDTree复杂度

KD Tree Kd-树其实是K-dimension tree的缩写,是对数据点在k维空间中划分的一种数据结构。其实,Kd-树是一种平衡二叉树。 举一示例: 假设有六个二维数据点 = {(2,3),(5,4),(9,6),(4,7),(8,1),(7,2)},数据点位于二维空间中。为了能有效的找到最近邻,Kd-树采用分而治之的思想,即将整个空间划分为几个小部分。六个二维数据点生成的Kd-树的

alaclp的专栏 1万+

KD树——附代码实现

kd树是一种树形结构,树的每个节点存放一个k维数据,某一节点的子节点可以看作是由过该节点一个平面切割后产生的,其具体演示如图:(找到中间点,比中间点小的放到一起,比中间点大的放到一起)节点信息包括:(1)节点所处点点值:比较距离时候要用(2)节点维度:方便后续比较距离(3)节点左枝节点(4)节点右枝节点#退出递归条件#求维度#循环维度#求出中位数所在下标points:需要构建KD树的数据集depth:维度,默认值为0设置推出递归的条件,循环到空节点。

Kamen_xuan的博客 1673

统计学习方法 第三章 kdTree

在RkR^k空间中有mm个点,给定一个点,找到与这个点最近的点。 最简单也是效率最低的方法是一个一个的计算比较,时间复杂度是o(m).o(m).

fxnfk 2185

k近邻法 kd树 平衡kd树

k近邻法 k近邻法的思想: k近邻法是一种基本分类与回归方法。输入为实例的特征向量,输出为实例的类别(可取多类)。具体过程是:给定一个已经分好类的数据集,对于新的实例,加入此数据集,以离这个点最近(距离度量)的k个点(k值选取)的类别进行多数表决(分类策略)去决定这个新的实例的类别。 k近邻法三要素: k值的选择: k小,用于训练的点少,只有新实例点旁边的点起作用(表决),近似误差小,估...

ein5702的博客 2056

机器学习算法------1.5 kd树(kd树简介、kd树构造方法、kd树案例分析)

文章目录1.5 kd树学习目标1 kd树简介1.1 什么是kd树1.2 原理2 构造方法3 案例分析3.1 树的建立3.2 最近领域的搜索3.2.1 查找点(2.1,3.1)3.2.2 查找点(2,4.5)4 总结 1.5 kd树 学习目标 目标 知道kd树构建和搜索过程 问题导入: 实现k近邻算法时,主要考虑的问题是如何对训练数据进行快速k近邻搜索。 这在特征空间的维数大及训练数据容量大时尤其必要。 **k近邻法最简单的实现是线性扫描(穷举搜索),即要计算输入实例与每一个训练实例的距离。计算并存

程序猿-凡白的博客 2682

KD树

问题导入: k近邻法最简单的实现是线性扫描(穷举搜索),即要计算输入实例与每一个训练实例的距离。计算并存储好以后,再查找K近邻。当训练集很大时,计算非常耗时。 为了提高kNN搜索的效率,可以考虑使用特殊的结构存储训练数据,以减小计算距离的次数。这里介绍的就是KD树 简介: 为了避免每次都重新计算一遍距离,算法会把距离信息保存在一棵树里,这样在计算之前从树里查询距离信息,尽量避免重新计算。其基本原理是,如果A和B距离很远,B和C距离很近,那么A和C的距离也很远。有了这个信息,就可以在合适的时候跳过距离远的点。

qq_41745284的博客 1万+

KD树的实现

在我们使用KNN算法分类时,需要求离某个点最近的k个样本。如果用矩阵来储存计算的话,则大大降低效率,因此我们使用KD树进行储存与搜索。

qq_50323694的博客 1692

KD树详解及KD树最近邻算法

参考:http://blog.youkuaiyun.com/app_12062011/article/details/51986805 http://www.cnblogs.com/snake-hand/archive/2012/08/13/2636236.html 2.1、什么是KD树     Kd-树是K-dimension tree的缩写,是对数据点在k维空间(如二

xbmatrix的博客 2万+

PCL KD树的使用

KD树(K-D Tree)是一种用于组织k维空间中的点的数据结构,常用于高效的最近邻搜索、范围查询等操作。KD树通过递归地将空间划分成k维的超矩形,使得在高维空间中的搜索变得更加高效。本文将详细介绍KD树的构建原理及其在PCL中的应用。

纵马踏花向自由 2170

LabVIEW vs Python:谁更适合你的ATE自动化测试系统?实测对比与选型建议

本文深入对比了LabVIEW和Python在ATE自动化测试系统中的性能表现、开发效率和应用场景,帮助工程师根据实时控制需求、数据处理复杂度及团队技能做出最优选型决策。通过实测数据和典型案例,分析两者在硬件集成、系统性能和维护成本等方面的差异,并提供混合架构实施建议。

weixin_29240711的博客 276

KD树详解

转载自:https://blog.youkuaiyun.com/xbmatrix/article/details/63683614 2.1、什么是KD树 Kd-树是K-dimension tree的缩写,是对数据点在k维空间(如二维(x,y),三维(x,y,z),k维(x1,y,z..))中划分的一种数据结构,主要应用于多维空间关键数据的搜索(如:范围搜索和最近邻搜索)。本质上说,Kd-树就是一种...

weixin_39568744的博客 1万+

Android 导出aar 用于Unity 百度语音唤醒

AndroidStudio版本下载地址Android Studio Arctic Fox Unity版本2021.3.26f1c1 新建AndroidStudio工程 新建module 这里注意一下,网上很多教程说要注意包名要和unity一样,但是测试下来,不一样也可以的 在新建的module里添加这两个jar包,并点击右键add as library 导入jniLibs 右键创建这几个package 代码就安装这个大佬的写参考代码 需要注意的的是在WakeupListener脚本里U

weixin_38777563的博客 633

KD树 球树

KD树   1.KD树建树采用的是从m个样本的n维特征中,分别计算n个特征的取值的方差,用方差最大的第k维特征 nk来作为根节点。选择特征 nk的取值的中位数 nkv对应的样本作为划分点,对于所有第k维特征的取值小于 nkv的样本,划入左子树,对于第k维特征的取值大于等于 nkv的样本,划入右子树,对于左子树和右子树,采用和刚才同样的办法来找方差最大的特征来做更节点,递归的生成KD树。 ...

yingchundexiaoxiong的博客 3797

保姆级教程:用杰理701N可视化SDK搞定ANC降噪配置(从工具到代码全流程)

本文提供了一份详细的杰理701N可视化SDK配置ANC降噪功能的教程,涵盖从开发环境搭建到代码集成的全流程。通过图形化工具和代码示例,帮助开发者快速掌握ANC参数配置技巧,优化降噪效果,解决常见问题。

weixin_30616969的博客 450

使用JAVA代码转word文档之动态生成数据填充(图文详解)

今天跟公司对接了业务,根据业务需求,乙方需求文档是word格式的,而我们的数据是动态数据,每生成一份数据,就要以word的形式给乙方一份邮件!这就给了我们的工作一定的难度和挑战! 通过阅读资料,团队的帮助以及自我测试,终于实现了这个功能!因为在搜索资料方面,发现各位博主讲的比较模糊,自己碰到了很多bug,浪费了很多宝贵的时间,所以今天写了这篇文章,希望对自己以后或者他人有所帮助! 操作第一步:先准...

huaiyan 7719

什么是KD树?

KD树(K-Dimensional Tree)是一种用于高效处理多维数据的数据结构。它是二叉搜索树的一种变体,在每个节点上对数据进行分割,从而构建一个多维空间的层次结构。因为KD树是基于二叉搜索树的特性构建的,所以它保留了二叉搜索树的一些性质,例如在插入和搜索操作中的平均时间复杂度为O(log n)。但与传统的二叉搜索树不同的是,KD树的节点划分是基于多维空间的划分,而不仅仅是单个维度上的划分KD树主要用于解决最近邻搜索(Nearest Neighbor Search)等问题。

Despicable_Me的博客 3603

远程桌面(RDP)共享USB设备全攻略:不止Hyper-V,你的加密狗和CH340串口也能远程用

本文详细介绍了远程桌面(RDP)共享USB设备的完整解决方案,包括加密狗和CH340串口设备的远程使用技巧。通过RemoteFX USB重定向技术,用户可以在远程会话中无缝使用本地USB设备,提升工作效率。文章涵盖企业级配置、典型设备实战案例及高级故障排除方法,是远程工作者的实用指南。

weixin_42522964的博客 333

Kd树与Kd树的k最近邻算法

Kd树查找的重点是剪枝,如果放宽剪枝条件D_split>D_max,添加一个比例因子α,使D_split>αD_max,整个kd树查询的速度就更快,但是不保证找到严格的最近邻。//如果未启用近似搜索,则直接使用当前最近邻点到查询点的距离平方来判断:如果到分割轴距离的平方小于当前最近邻点到查询点的距离平方。// 边界情况检查:输入的points等于同一个值,上面的判定是>=号,所以都进了右侧。/// Kd树节点,二叉树结构,内部用祼指针,对外一个root的shared_ptr。// 平方距离,用于比较。

Joeybee的博客 1284

锐捷-GZ073 网络系统管理赛项赛题第1套A模块-S5配置

锐捷-GZ073 网络系统管理赛项赛题第1套A模块-S5配置

weixin_46183247的博客 767

Android系统内存和性能关系的调研

摘要:本文分析了低内存导致性能问题的判断方法和评估思路。通过监控/proc/vmstat中的allocstall_normal、pageoutrun等指标可判断内存回收频率,当MemFree、MemAvailable和Cached均低于500MB时可能出现明显卡顿。全文通过实验和理论验证分析,回答因内存瓶颈导致性能问题的一些分析和解决的思路。

jidapenglin28的专栏 129

构建kd树和kd树的搜索

问题引入:如何对训练数据进行快速k近邻搜索? 方法1、k近邻法最简单的实现是线性扫描(穷举搜索),即要计算输入实例与每一个训练实例的距离。计算并存储好以后,再查找K近邻。当训练集很大时,计算非常耗时。 方法2、kd树使用特殊的结构存储训练数据,以减小计算距离的次数。算法复杂度可降低到O(DNlog(N)) 基本原理 如果A和B距离很远,B和C距离很近,那么A和C的距离也很远。 构造kd树 1.构造根节点 2.通过递归的方法,不断地对k维空间进行切分,生成子节点 3.重复第二步骤,直到子区.

lian740930980的博客 1209

芒果YOLOv11改进175:DCNv4卷积,全网首发纯Pytorch实现代码,无需cuda编译|即插即用,一键运行:高效可变形卷积网络:重新思考视觉应用的动态和稀疏算子

芒果YOLOv11改进:DCNv4卷积,全网首发纯Pytorch实现代码,无需cuda编译|即插即用,一键运行:高效可变形卷积网络:重新思考视觉应用的动态和稀疏算子

包括YOLOv5、YOLOv7、YOLOv8等模型改进 1296
上一篇: k-近邻法KNN-机器学习ML
下一篇: 朴素贝叶斯Naive Bayes-机器学习ML
HelloZEX
博客等级 码龄11年 486粉丝 264原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值