Algorithm 八叉树的近似最近邻算法

Algorithm 八叉树的近似最近邻算法,algorithm,computational-geometry,nearest-neighbor,Algorithm,Computational Geometry,Nearest Neighbor,有人知道八叉树近似近邻技术的起源(纸、书等)吗 从提供的伪代码实现它时遇到了问题。我也很难找到这项技术的原始出版物,我希望它有更多的细节 谢谢您的帮助。这不是确切的答案,而是一个近似值(使用主题的术语:) 它太大了,不能写评论,我认为这是一个很好的开始 本文提到,Voronoi图在高于3维的维度上不会展开,这意味着八叉树会展开。就术语而言,这是错误的 在R^3中定义了一个八叉树。简单地说,您可以在2D中看到这种数据结构,我们有一个这类树每个节点有2^D个子节点,其中D是维度。这意味着: 1.

有人知道八叉树近似近邻技术的起源(纸、书等)吗

从提供的伪代码实现它时遇到了问题。我也很难找到这项技术的原始出版物,我希望它有更多的细节


谢谢您的帮助。

这不是确切的答案,而是一个近似值(使用主题的术语:)

它太大了,不能写评论,我认为这是一个很好的开始

本文提到,Voronoi图在高于3维的维度上不会展开,这意味着八叉树会展开。就术语而言,这是错误的

在R^3中定义了一个八叉树。简单地说,您可以在2D中看到这种数据结构,我们有一个这类树每个节点有2^D个子节点,其中D是维度。这意味着:

 1. 2D: 2^D children per node, i.e. 4 children per node.

 2. 3D: 2^D children per node, i.e. 8 children per node.

 3. and so on.
例如,
octree
,来自希腊语单词octo,意思是8,这意味着这棵树每个节点有8个子节点

我已经为
NN
(最近邻)实现了这种树,并且,即使我已经使树成为多态树,以不浪费任何内存量,它也不会扩展到10维以上

此外,本文还提到了
kd树
。请注意,当维度变高时,查询时间不再是
O(logn)
,而是变得比蛮力方法略短(即检查所有点)。维度越高,kd树的性能越差

kd树实际上是嵌入在几何体中的二叉树。我的意思是,每个节点都有两个子节点,在每个级别,我们将数据集减半(通常在方差最大的坐标中位数处,这样我们就可以利用数据集的结构)。这将形成一棵完美的树

在这里你可以看到一个
kd树
,我的一个朋友做的,在8D中有64个点。在这个版本中,我们每个叶存储4个点

框中的数字表示点编号(从1开始, i、 e.test.points文件中的行号)

符号“8@0.532”表示一个内部节点,其中的数据是 沿第八维度以0.532拆分(同样,从 1,便于人类理解)

这就是为什么,我们倾向于对近似NN感兴趣,这意味着我们在准确性方面付出了一些损失,但我们获得了一些加速。(你可能知道,一切都是一种权衡)

在盒子里,它可能意味着一个

这很简单,下面是一个示例:

假设您在2D中拥有此数据集:

-1 -2
 0  5
 8 -5
为了构造边界框,我们需要在每个维度上找到最小和最大坐标。请注意,对于存储Boudning长方体,只需存储其最小角和最大角即可

这里,我们有
min=(-1,-5)和max=(8,5)
。然后,边界框是按顺时针顺序形成的矩形,从“最大角点”(max corner)开始,具有以下角点:

( 8,  5)  // ( max.x, max.y)
( 8, -5)  // ( max.x, min.y)
(-1, -5)  // ( min.x, min.y)
(-1,  5)  // ( min.x, max.y)
请注意,数据集的所有点都位于该边界框内

至于论文,它实际上是一场讲座,而不是一篇论文。它没有解释应该如何编写算法。此外,它没有提供任何独特的信息,以便尝试找到另一个.pdf,这将更详细地解释链接中的.pdf

[编辑]查看OP的评论

1) Q:
将包含代表点p的方框B出列

我想说的是,出列意味着提取队列的“第一”元素。排队,表示将队列中的元素向后推。用于将边界框作为元素保存的队列接缝

2) Q:
r=d(Q,B)

也许,他指的是从盒子里的代表点来看。不清楚

您可以计算从查询点到长方体最近角点或代表长方体的(欧几里德)距离

3)
对于包含p中点的B的所有子项B

p
是数据集。每个框在每个级别(在八叉树的情况下)划分为8个子框

4) Q:
而dN>=(1+e)r do

近似误差
e
,实际上就是我们所说的
epsilon
。它通常是一个参数,它意味着,当您检查:

而delta>=r do

你不那么严格,你确实如此

而delta>=(1+e)*r do

这意味着你进入循环的次数少于上面的确切条件。 所以,我想它说,在队列中插入框B的每个子框。这不是很聪明,伊姆霍


关于e=0.01的最后一个注释,只需按照上述条件进行计算。你会看到答案是否定的,因为作为你发布的链接状态,
e
是一个乘法因子。

这是一种算法,甚至可能没有写上去,因为“查看当前多维数据集,并扩展到比当前找到的最佳候选数据集更接近的相邻/父多维数据集”这是一件非常直截了当的事情。如果您的八叉树是隐式的,在父级拆分中没有邻居指针,那么这可能需要大量的重新查询。我的八叉树分支有8个指向其子级的指针。没有子级的分支为Null。在psuedo代码中对我来说有点模糊的东西是:1)
将包含代表点p的框B排出来:这是否意味着从一个被占用的分支开始?2) 
r=d(q,B)
:这是从q到B的哪个部分,中心,角的距离?3)
对于包含P do enqueue(B')中的点的B的所有子级B'
:这是否意味着在包含子级的所有子级分支上递归?4)
而dN>=(1+e)rdo
:e是否仅表示允许的误差半径?此外,如果r以米为单位,且e=0.01,则表示允许的误差为1cm?还是半径的某个百分比?我的问题是