k近邻算法——球树

一、概念

  KD树算法虽然提高了KNN搜索的效率,但是在某些时候效率并不高,比如当处理不均匀分布的数据集时,不管是近似方形,还是矩形,甚至正方形,都不是最好的使用形状,因为他们都有角。一个例子如下图:
在这里插入图片描述
  如果黑色的实例点离目标点星点再远一点,那么虚线圆会如红线所示那样扩大,导致与左上方矩形的右下角相交,既然相 交了,那么就要检查这个左上方矩形,而实际上,最近的点离星点的距离很近,检查左上方矩形区域已是多余。于此我们看见,KD树把二维平面划分成一个一个矩形,但矩形区域的角却是个难以处理的问题。

  为了优化超矩形体导致的搜索效率的问题,牛人们引入了球树,这种结构可以优化上面的这种问题。

二、球树的构建

球树,顾名思义,就是每个分割块都是超球体,而不是KD树里面的超矩形体。
在这里插入图片描述
我们看看具体的建树流程:

  1. 先构建一个超球体,这个超球体是可以包含所有样本的最小球体。
  2. 从球中选择第一个点(离球的中心最远的点),然后选择第二个点(离第一个点最远的点);将球中所有的点分配到离这两个聚类中心最近的一个上,然后计算每个聚类的中心,以及聚类能够包含它所有数据点所需的最小半径。这样我们得到了两个子超球体,和KD树里面的左右子树对应。
    3)对于这两个子超球体,递归执行步骤2)。最终得到了一个球树。

  可以看出KD树和球树类似,主要区别在于球树得到的是节点样本组成的最小超球体,而KD得到的是节点样本组成的超矩形体,这个超球体要比对应的KD树的超矩形体小,这样在做最近邻搜索的时候,可以避免一些无谓的搜索。

三、球树搜索最近邻

  使用球树找出给定目标点的最近邻方法是首先自上而下贯穿整棵树找出包含目标点所在的叶子,并在这个球里找出与目标点最邻近的点,这将确定出目标点距离它的最近邻点的一个上限值,然后跟KD树查找一样,检查兄弟结点,如果目标点到兄弟结点中心的距离超过兄弟结点的半径与当前的上限值之和,那么兄弟结点里不可能存在一个更近的点;否则的话,必须进一步检查位于兄弟结点以下的子树。

  检查完兄弟节点后,我们向父节点回溯,继续搜索最小邻近值。当回溯到根节点时,此时的最小邻近值就是最终的搜索结果。

  从上面的描述可以看出,KD树在搜索路径优化时使用的是两点之间的距离来判断,而球树使用的是两边之和大于第三边来判断,相对来说球树的判断更加复杂,但是却避免了更多的搜索,这是一个权衡。

3.1 搜索原理

  给定一个目标区域 q q q(q,r),使得所有点都包含在内(||q-x||≤r),q为目标区域圆心,r为探索半径。搜索过程从根节点开始,递归地计算可能包含范围内结果的子节点。具体地说,每个子分区 p i p_i pi都对应球树中的一个点,如果 (radius( p i p_i pi) + r) ≥|| center(pi) ) - q|| (即 子分区 p i p_i pi的半径 + 目标区域 q q q的半径r ≥ 子分区 p i p_i pi和目标区域的中心间距,两个区域 p i p_i pi q q q相交或包含),然后对分区中的元素进行求值以查找可能满足的数据点 那么该子分区中的元素只要满足||x - q|| ≤ r(即元素与目标区域 q q q的中心小于目标区域 q q q的半径r)。换句话说,如果查询球与节点的球相交,那么搜索将继续到所有子节点与查询球相交的。

3.2 搜索实例

  1. 构建一个大的 q q q(q, r 0 r_0 r0),则所有元素都在 q q q(q, r 0 r_0 r0)中。
  2. 减小r值,构建一个 q q q(q, r 1 r_1 r1),和 q a q_a qa q b q_b qb进行计算;(radius( p a p_a pa) + r 1 r_1 r1) ≥|| center( p a p_a pa) ) - q||,(radius( p b p_b pb) + r 1 r_1 r1) ≥|| center( p b p_b pb) ) - q|| ,两个子超球体均与 q q q(q, r 1 r_1 r1)相交,继续分别查找 q a q_a qa q b q_b qb的子超球体
  3. 减小r值
    3.1)构建一个 q q q(q, r 2 r_2 r2),对 q a q_a qa中的 q c q_c qc q d q_d qd进行计算,(radius( p c p_c pc) + r 2 r_2 r2) ≤|| center( p c p_c pc) ) - q||,(radius( p d p_d pd) + r 2 r_2 r2) ≥|| center( p d p_d pd) ) - q|| , 则 q a q_a qa的子超球体 p c p_c pc不相交,丢弃; q a q_a qa的子超球体 p d p_d pd相交,继续分别查找 q d q_d qd的子超球体
      3.2)、构建一个 q q q(q, r 3 r_3 r3),对 q b q_b qb中的 q h q_h qh q e q_e qe进行计算,(radius( p e p_e pe) + r 3 r_3 r3) ≤|| center( p e p_e pe) ) - q||,(radius( p h p_h ph) + r 3 r_3 r3) ≥|| center( p h p_h ph) ) - q|| , 则 q b q_b qb的子超球体 p r p_r pr不相交,丢弃; q b q_b qb的子超球体 p h p_h ph相交,继续分别查找 q h q_h qh的子超球体
  4. 减小r值
      4.1)、由于 q d q_d qd中无子超球体,对内部元素分别求距离并取最小距离点,及4号点
      4.2)、构建一个 q q q(q, r 4 r_4 r4),对 q h q_h qh中的 q f q_f qf q g q_g qg进行计算,(radius( p f p_f pf) + r 4 r_4 r4) ≤|| center( p f p_f pf) ) - q||,(radius( p g p_g pg) + r 4 r_4 r4) ≥|| center( p g p_g pg) ) - q|| , 两个子超球体均与 q q q(q, r 4 r_4 r4)相交,继续分别查找 q f q_f qf q g q_g qg的子超球体
  5. 减小r值
      5.1)、由于 q f q_f qf中无子超球体,对内部元素分别求距离并取最小距离点,及7号点
      5.2)、由于 q g q_g qg中无子超球体,对内部元素分别求距离并取最小距离点,及8号点
  6. 比较4、7、8号到q点的距离,求出最小距离点,即7号点

以上搜索过程如图所示:
在这里插入图片描述

四、附

参考: 英文文档,免费下载;若出现需要c币的为网站自动调的,请及时通知我进行修改(不知道哪里可以放文件,一直很纠结;github最近也被屏蔽了)

在这里插入图片描述

  • 5
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值