最近邻搜索问题有很多解决方法,所以我想知道如果我想要进行固定半径范围搜索,是否可以利用那些最近邻搜索算法?
也许我可以一遍又一遍地进行kth-nearest-neighbor搜索,直到找到一个超出半径范围的点,但我认为这可能会造成很多浪费。
最近邻搜索问题有很多解决方法,所以我想知道如果我想要进行固定半径范围搜索,是否可以利用那些最近邻搜索算法?
也许我可以一遍又一遍地进行kth-nearest-neighbor搜索,直到找到一个超出半径范围的点,但我认为这可能会造成很多浪费。
高维空间
假设你的点位于高维空间中,你应该选择局部敏感哈希(LSH)。这个算法的一个好的实现是E²LSH。他们还提供幻灯片,如果你想自己实现或更好地理解发生了什么。请注意,E²LSH解决了随机版本的R近邻问题,他们称之为(R, 1-δ)-近邻问题,其中δ与近似有关,正如他们在手册中提到的那样。
你也可以查看我关于LSH的回答这里。我在C++中使用它,并强烈推荐它用于您想执行的固定半径搜索!
低维空间
使用CGAL的空间搜索。我在C++中已经多次使用它来处理这种情况。同样,如果您想自己实现,可以在他们精美的文档中找到大量信息,并进行相关的谷歌查询。
顺便说一句,你的回答很好,我给你加了个赞。:)
NNN index deltas: (-1, 2) ( 0, 2) ( 1, 2)
NNNNN (-2, 1) (-1, 1) ( 0, 1) ( 1, 1) ( 2, 1)
NNANN (-2, 0) (-1, 0) ( 0, 0) ( 1, 0) ( 2, 0)
NNNNN (-2, -1) (-1, -1) ( 0, -1) ( 1, -1) ( 2, -1)
NNN (-1, -2) ( 0, -2) ( 1, -2)
因此,您已经拥有了实现高维球内部有效搜索所需的所有内容:
使用包含它们的超立方体的索引元组作为键将输入点推入空间哈希中。
给定一个点 p
,搜索的方法是确定它所在的超立方体 A
,然后使用索引增量集获取可能包含比 r
更近的点的邻居超立方体 N
集合。
从空间哈希中检索属于超立方体 N
的点,并检查哪些点足够靠近 p
。
还有一些额外的优化可以执行,例如不检查属于 A 的点,因为它们保证都足够接近。可以根据 p
相对于 A
的位置执行 N 的预过滤。
请注意,选择 s = r / sqrt(d)
可以在具有小超立方体和不太大的集合 N
之间提供很好的折衷。
每次在树上向下移动一级时,都要检查它所代表的空间是否与查询超球体相交。如果是,则继续向下搜索,否则将其完全从搜索中丢弃。
N
的大小随着维度的增加呈指数级增长,导致计算成本为O(f(M)*exp(d))
,其中M
是点数,f
是某个未确定的函数。 - salvar/sqrt(d)
而是应该设置为r
吗?因为使用r
,您只需要在8个相邻的超立方体中搜索加上查询超立方体,总共只有9个超立方体,而使用r/sqrt(d)
,您需要在8个相邻的超立方体中搜索加上与它们相邻的其他12个超立方体,总共有20个超立方体。 r/sqrt(d)
的唯一优点是不必在查询超立方体内搜索,但其缺点远远超过它(20个超立方体对9个超立方体)。 - Géry Ogam20 * (r / sqrt(2))**2 = 10 * r**2
对比 9 * r**2
,所以情况并不那么糟糕。对于更大的维度,r/sqrt(d)
的情况会更好一些。 - salva格式为:
query_radius(X, r, return_distance=False, count_only=False, sort_results=False)