《统计学习方法》学习笔记2——KD树、SIFT+BBF算法

本文深入解析了KD树的构建与查询过程,以及SIFT特征匹配算法和BBF算法的工作原理。详细介绍了KD树如何通过递归分割数据点集建立树结构,以及BBF算法如何在KD树中高效搜索最近邻点。

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

KD树、SIFT+BBF算法

优快云文章:https://blog.youkuaiyun.com/tianwaifeimao/article/details/48287159
原文链接:https://www.cnblogs.com/v-July-v/archive/2012/11/20/3125419.html

SIFT特征匹配算法

https://blog.youkuaiyun.com/weixin_38404120/article/details/73740612

KD树

kd树的创建过程:

输入:一组数据点集,n个数据点,每个点有m维

输出:k-d树的根结点指针

过程:(1)分别计算这n个数据点在m维中各个维度的方差,取方差最大的维度dim作为分割维度;

(2)把数据点集按照该维度中值的大小进行排列,选择具有中间值的点作为该树的根结点;

(3)前半部分点进行如(1)、(2)所示的递归操作,选出的递归子树的根节点作为(2)中得到的根节点的左孩子;

同理,后半部分也这样操作。如此一直递归,直到各个递归子树的数据点集为空则算法截止。

k-d树的查询:

(1)查询点与k-d树的根节点进行比较,比较两者在根节点划分时的维度的值的大小,若查询点在该维的值小,则进入根节点的左子树,否则进入右子树。依次类推,进行查找,直到到达树的叶子节点。

(2)设当前到达的叶子节点为目前的最近邻(注意:可能并非真正的最近邻),并且记录目前的最近邻距离。沿着来时的路向前回溯,让目前的最近邻距离与查找点与当前叶子节点的父节点形成的分割超平面的距离进行比较,若当前最近邻比较小,则不用遍历当前叶子节点的父节点的另一边,否则需要遍历查找以更新最近邻距离和最近邻节点。

(3)按照(2)中所说依次遍历,直到到达根节点为止,查询结束。

BBF算法

bbf的算法流程如下:

输入:kd树,查找点x

输出:kd树种距离查找点最近的点以及最近的距离

流程:(1)若kd树为空,则设定两者距离为无穷大,返回;如果kd树非空,则将kd树的根节点加入到优先级队列中;

(2)从优先级队列中出队当前优先级最大的结点,计算当前的该点到查找点的距离是否比最近邻距离小,如果是则更新最近邻点和最近邻距离。如果查找点在切分维坐标小于当前点的切分维坐标,则把他的右孩子加入到队列中,同时检索它的左孩子,否则就把他的左孩子加入到队列中,同时检索它的右孩子。这样一直重复检索,并加入队列,直到检索到叶子节点。然后在从优先级队列中出队优先级最大的结点;

(3)重复(1)和(2)中的操作,直到优先级队列为空,或者超出规定的时间,返回当前的最近邻结点和距离。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值