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?还是半径的某个百分比?我的问题是