k-d树 & kNN & ANN 等相关理解

本文介绍了k-d树的基本概念,它是一种多维空间的二叉查找树,用于加速kNN(k最近邻)算法的搜索过程。k-d树通过固定一维并划分超平面来构建,其核心优势在于剪枝策略,能够有效降低搜索时间复杂度。文章还提及了k-d树的建树、最近邻和k近邻搜索方法,并讨论了在ANN(近似最近邻)中的应用。虽然k-d树在某些边界情况可能导致不准确,但在大规模数据集上,对于kNN搜索仍有显著的效率提升。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

花了两天时间就看了个k-d树 罪过罪过~

不过还是大约总结以下吧

起初看k-d树是在看李航的《统计学习方法》中提到的,kNN是个很简单的算法,但k-d树总的来说,稍微有点绕,感觉可能是看到的资料表述的不太清晰,也有可能是本来k-d树就不容易表述。


k-d树从根本上来说就是一个多维空间下的二叉查找树,区别于二叉查找树只有1维,k-d树可以有n维,故而k-d树在分叉的时候,需要固定一维,构成一个超平面进行划分,在选具体哪一维的时候,简单的做法是从第一维开始轮循,可能更优的做法是采用最大方差维进行划分,因为从根本上来说,我们需要把搜索空间划分的更均匀,这个时候总的搜索时间会下降,也更方便剪枝,考虑一种特殊情况,假设我们始终只使用1个维进行空间划分,那么整个搜索空间会被划分成长条状的超矩形,那么在搜索的时候,在kNN k = 1的情况下,超球体可能会横跨诸多搜索空间,也意味着我们需要遍历很多的搜索分支。


k-d树的建树方法比较简单,固定一维,然后左小右大,当然根结点中存储的是中位数,左小右大的基准也是该点,直到最终被点划分的子区域都是空白为止,此处应有图,不过很遗憾,懒得粘别人的博客了。


重点述说一下k-d树的查找最近邻以及k近邻的搜索方式,其实从搜索的角度来讲,不论是最近邻还是k近邻,从O(n) 到 log(n),节省掉的时间永远是剪枝剪掉的部分,而k-d树最核心的也应该是剪枝,不知道为什么,好多书,资料上都没有指出这一点,害的我有点怀疑自己,浪费时间,k-d树剪掉的枝就是假设已经找到一个当前最近点,那么如果当前最近点和目标点的距离小于目标点和某一块超矩形的距离,那么在这一块超矩形中都不去搜索,即减去这一分支。


简单述说一下最近邻和k近邻的搜索方法,这一块详细的算法书中都有,自己来写个很完善的伪代码可能也写不好...


在最近邻搜索中,先和二叉搜索树一样,找到树中离目标点最近的叶子节点,取该叶子节点为当前最近点,然后回溯,找到父节点,判断父节点与目标节点之间的距离,小则更新,大则不变,同时判断目标点与另一分支是否相交,此时只需判断目标点与父节点所在的那条

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值