从课程的幻灯片中,我发现了这些:
给定R ^ D中的集合P和查询点q,它的NN是P中的点p_0,其中:
dist(p_0, q) <= dist(p, q), for every p in P.
类似地,近似因子1> ε&gt; 0,ε-NN是p_0,这样:
dist(p_0, q) <= (1+ε) * dist(p, q), for every p in P.
(我想知道为什么ε不能达到1)。
我们构建了一个KD树,然后我们用这个算法搜索NN: 这是正确的,就我的想法和我的测试而言。
如何修改上述算法,以便执行近似最近邻搜索(ANNS)?
我的想法是将当前最佳(在叶子中的更新部分)乘以ε,并保持算法的其余部分不变。不过我不确定这是否正确。有人可以解释一下吗?
PS - 我理解搜索NN的工作原理。
请注意,我在计算机科学网站上asked,但我一无所获!
答案 0 :(得分:2)
所需的一项修改是将current best distance
替换为current best distance/(1+ε)
。这会修剪不能包含违反新不等式的点的节点。
这有效的原因是(假设cut-coor(q)
在左侧)测试
cut-coor(q) + current best distance > node's cut-value
正在检查分隔left-child
和right-child
的超平面是否比current best distance
更近,这是right-child
中某点更接近的必要条件到查询点q
,因为加入q
的线段和right-child
中的点通过该超平面。将d(p_0, q) = current best distance
替换为current best distance/(1+ε)
,我们会检查右侧是否有任何点p
可以满足
d(p, q) < d(p_0, q)/(1+ε),
相当于
(1+ε) d(p, q) < d(p_0, q),
是违反近似邻近保证的证人。