超球体上最接近另一点的点
Closest point to another point on a hypersphere
我在维度为 m(在 10^4 到 10^6 之间)的超球面上有 n(大约 10^5)个点。
我将进行一系列 "given a point p, find the closest of the n points to p" 形式的查询。我将进行大约 n 个这样的查询。
(不确定超球面事实是否有帮助。)
解决这个问题的简单朴素算法是,对于每个查询,将 p 与所有其他 n 个点进行比较。这样做 n 次最终运行时间为 O(n^2 m),这对我来说太大了,无法计算。
我可以使用更高效的算法吗?如果我能用一些对数因子将它达到 O(nm),那就太好了。
可能不会。具有多个维度使得高效索引变得极其困难。这就是为什么人们寻找机会将维数减少到易于管理的程度。
有关更多信息,请参阅 https://en.wikipedia.org/wiki/Curse_of_dimensionality and https://en.wikipedia.org/wiki/Dimensionality_reduction。
将您的 space 分成超立方体 - 称为这些单元格 - 选择边缘大小,以便平均每个立方体有一个点。您需要一张从超单元到它们包含的点集的映射。
然后,给定一个点,检查它的超单元是否有其他点。如果它是空的,请查看相邻的超单元(为简单起见,我建议使用超单元的字面超立方体,而不是对由超单元构建的超球体的某种近似)。检查其他点。不断重复,直到你得到一个点。假设您的分数是随机分布的,那么您在 1-2 次扩展中找到第二个分数的几率很高。
找到一个点后,检查所有可能包含更近点的超单元。这是可能的,因为您找到的点可能在一个角落,但在包含您目前检查过的所有超单元的超立方体之外还有一些更近的点。
我在维度为 m(在 10^4 到 10^6 之间)的超球面上有 n(大约 10^5)个点。
我将进行一系列 "given a point p, find the closest of the n points to p" 形式的查询。我将进行大约 n 个这样的查询。
(不确定超球面事实是否有帮助。)
解决这个问题的简单朴素算法是,对于每个查询,将 p 与所有其他 n 个点进行比较。这样做 n 次最终运行时间为 O(n^2 m),这对我来说太大了,无法计算。
我可以使用更高效的算法吗?如果我能用一些对数因子将它达到 O(nm),那就太好了。
可能不会。具有多个维度使得高效索引变得极其困难。这就是为什么人们寻找机会将维数减少到易于管理的程度。
有关更多信息,请参阅 https://en.wikipedia.org/wiki/Curse_of_dimensionality and https://en.wikipedia.org/wiki/Dimensionality_reduction。
将您的 space 分成超立方体 - 称为这些单元格 - 选择边缘大小,以便平均每个立方体有一个点。您需要一张从超单元到它们包含的点集的映射。
然后,给定一个点,检查它的超单元是否有其他点。如果它是空的,请查看相邻的超单元(为简单起见,我建议使用超单元的字面超立方体,而不是对由超单元构建的超球体的某种近似)。检查其他点。不断重复,直到你得到一个点。假设您的分数是随机分布的,那么您在 1-2 次扩展中找到第二个分数的几率很高。
找到一个点后,检查所有可能包含更近点的超单元。这是可能的,因为您找到的点可能在一个角落,但在包含您目前检查过的所有超单元的超立方体之外还有一些更近的点。