[英]Approximate nearest neighbor algorithm for Octrees
有谁知道八叉树这种近似最近邻技术的起源(纸,书等)?
http://www.cs.ucdavis.edu/~amenta/w11/nnLecture.pdf
我无法从提供的伪代码中实现它。 我也很难找到该技术的原始出版物,我希望它有更多细节。
谢谢你的帮助。
这不是确切的答案,而是一个近似值(使用主题的术语:))。
太大了,无法发表评论,我认为这是一个很好的起点。
该论文提到,Voronoi图的展开维数没有超过三个,并且暗示八叉树可以展开。 就术语而言,这是错误的。
在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.
对于exampe, octree
,源于希腊文辛,这意味着8,它指的是此树有每个节点的8个孩子。
我已经为NN
(最近邻居)实现了这种树,即使我将树做成多态的,也不会浪费任何内存,但这不会扩展到10维以上。
此外,本文还提到了kd-trees
。 注意,当维度变大时,查询时间不再是O(logn)
,而是比蛮力法(即检查所有点)略短。 尺寸越高, kd-trees
性能越差。
kd-tree
实际上是嵌入几何中的二叉树。 我的意思是,每个节点都有两个孩子,并且在每个级别上,我们将数据集减半(通常在方差最大的坐标中间,以便我们可以利用数据集的结构)。 这将形成一棵完美的树。
在这里,您可以看到一个
kd-tree
,它是我的一个朋友,在8D中得到64点。 在此版本中,我们每个叶子存储4点。
框中的数字表示点号(从1开始,即test.points文件中的行号)。
符号“ 8 @ 0.532”是指一个内部节点,其中的数据沿第八维(同样,维从1开始,以便于人类理解)在0.532处拆分。
因此,我们倾向于关注近似NN ,这意味着我们付出了一些准确性上的损失,但是却获得了一定的提速。 (您可能知道,一切都是折衷的)。
按Box ,它可能意味着一个minimum bounding box
。
这很简单,这是一个示例:
假设您具有2D数据集:
-1 -2
0 5
8 -5
为了构造边界框,我们需要找到每个维度上的最小和最大坐标。 请注意,对于存储Boudning框,足以存储其最小和最大角。
在这里,我们有min = (-1, -5) and max = (8, 5)
。 这样,边界框将按照顺时针方向形成,即从最大角开始,即具有角的矩形:
( 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: dequeue box B, containing representative point p
我要说的是,出队意味着提取队列的“第一个”元素。 入队,意味着将队列中的元素推回。 队列缝将边界框作为元素。
2)Q: r = d(q,B)
也许,他的意思是从盒子的角度说。 不清楚。
您可以计算从查询点到框的最近角或框的代表的(欧几里得)距离。
3) for all children B' of B containing points in P
P
是数据集。 每个框都在每个级别上划分为8个子框(对于octree)。
4)Q: while dN >= (1+e)r do
近似误差e
实际上是我们所谓的epsilon
。 它通常是一个参数,表示在检查时:
while delta >= r do
你不那么严格,你就做
while delta >= (1 + e)*r do
这意味着您进入循环的时间少于上述确切条件的时间。 因此,我认为这是说要在队列中插入框B的每个子框。 恕我直言,这不是那么聪明。
关于e = 0.01的最后一条注释,只需在上述条件下进行数学运算即可。 您将看到答案是否定的,因为作为发布链接的状态, e
是一个乘法因子。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.