K近邻快速算法 -- KD树、BBF改进算法

K近邻算法即是查找与当前点(向量)距离最近的K个点(向量),距离计算一般用欧氏距离。

最简单的方法就是穷举法:计算每个向量与当前向量的欧氏距离,选取最小的K个为所求。但这种方法计算量太大,无法应对大样本数的情况(比如SIFT特征点匹配,每张图片一般有几千个待匹配的特征点,对每个点都需要查找另一张图片中与之最相似的特征点从而建立对应关系,穷举法显然不行)。

SIFT采用的方法是:先将所有特征向量进行预处理,组成KD树的结构(二叉树),仅计算KD树中可能路径下(使用了BBF改进算法计算路径)特征向量的欧式距离,从而减小计算量。

本文将首先介绍KD树的构造,然后介绍KD树下的最近邻查找,最后介绍KD树下改进的查找方法BBF。


KD树的构造

KD树(k-dimension tree)是对数据点在K维空间中划分的一种数据结构

假设对于6个二维数据点(此时K=2):{(2,3), (5,4), (9,6), (4,7), (8,1), (7,2)}

(1)计算所有数据每一维的方差

在这里即计算(2, 5, 9, 6, 4, 7, 8)和(3, 4, 6, 7, 1, 2)的方差,分别为39和28.63

方差大的那一维(在这里为x轴)意味着当前数据在这一维分布最为分散,因此首先将数据按这一维进行划分

(2)选取方差最大的那一维中所有数据的中位数作为分割超面(根节点)

在这里选第一维(X轴)的数据,中位数为7,因此将x=7作为第一个分割超平面(点

  • 4
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
kd-tree和bbf(Best Bin First)都是用于高效地处理k维空间数据的算法。 kd-tree是一种用于快速检索k维空间中数据的树形结构。它通过递归地将数据集按照k维空间中的划分轴进行切分,每次选择一个划分点,并将其分成左右两个子树。切分轴的选择可以根据不同的策略进行,例如选择方差最大的维度作为切分轴。构建好kd-tree后,可以通过搜索算法快速地查找最近邻点、范围查询等操作。 而bbf(Best Bin First)是一种基于kd-tree的改进算法。其思想是,在搜索kd-tree时,根据距离当前查询点的距离进行优先级排序,优先搜索最近邻点附近的分支。bbf使用一个优先级队列来维护要访问的节点,每次取出队列中优先级最高的节点进行访问。这样能够避免对较远节点的访问,从而提高搜索效率。 对于给定的查询点,bbf首先找到距离最近的叶子节点,并将其作为当前最近邻点。然后,在bbf的搜索过程中,会不断更新当前最近邻点,并根据其与查询点的距离调整优先级队列中的节点顺序。如果当前最近邻点的距离小于优先级队列中最大优先级节点的距离,就可以剪枝,避免对该节点及其子节点的进一步搜索。 通过利用kd-tree和bbf算法,可以在高维空间中高效地进行最近邻搜索。这对于很多应用场景,如图像处理、数据挖掘等具有重要意义。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值