高维最近邻搜索的最佳数据结构
Best data structure for high dimensional nearest neighbor search
我实际上正在处理高维数据(~50.000-100.000 个特征)并且必须对其执行最近邻搜索。我知道随着维度的增长,KD-Trees 的性能很差,而且我也读到过,一般来说,所有 space-partitioning 数据结构都倾向于对高维数据执行详尽搜索。
此外,还有两个重要的事实需要考虑(按相关性排序):
- 精度:必须找到最近的邻居(不是近似值)。
- 速度: 搜索必须尽可能快。 (创建数据结构的时间并不重要)。
所以,我需要一些建议:
- 执行 k-NN 的数据结构。
- 是否最好使用 aNN(近似最近邻)方法,将其设置得尽可能准确?
我认为在如此高维的数据中进行聚类是不明智的。还有次元诅咒问题。
The concept of distance becomes less precise as the number of
dimensions grows, since the distance between any two points in a given
dataset converges
我建议你找一个好的距离度量,而不是在高维上直接使用欧式距离space。
本页列出了一些可能的解决方案,
https://en.wikipedia.org/wiki/Clustering_high-dimensional_data
2.1 Subspace clustering
2.2 Projected clustering
2.3 Hybrid approaches
2.4 Correlation clustering
Can I perform NN search in high dimensional space?
No. 因为维数灾难,在较低维度上表现良好的最近邻搜索的数据结构,表现不佳在一个高维的地方。事实上,查询时间几乎与暴力查询相同,因此它毫无价值。
因此,在高维 space 中,应该进行 近似最近邻 (ANN) 搜索.老实说,必须。
Which data structure to perform ANN?
我建议使用 LSH 或一些 RKD 树。在我的 answer 此处,我提到了一些在 C++ 中执行 ANN 的优秀库。但是,请注意 LSH 解决了 R 近邻问题,因此您指定了参数 R,它实际上是半径。然后,LSH 会从查询点寻找那个 R 里面的 NN,因此你不能真正请求 k 个 NN。
另一方面,RKD 树可以做到这一点,return 你 k NN 的。我有一个项目,它构建了一个 RKD 树森林并在 C++ 中执行 ANN 搜索,但它只针对高维度。它可以在 < 1 秒内处理 960 维的 10^6 图像的 GIST 数据集,大约 90% 的输出是真正的最近邻。名字是 kd-GeRaF。它将在下个月更新为分布式版本,但它已经过测试并可以使用。它还有一个可爱的标志。 :)
我也觉得你应该看看我的answer,里面说最优的数据结构取决于数据
我实际上正在处理高维数据(~50.000-100.000 个特征)并且必须对其执行最近邻搜索。我知道随着维度的增长,KD-Trees 的性能很差,而且我也读到过,一般来说,所有 space-partitioning 数据结构都倾向于对高维数据执行详尽搜索。
此外,还有两个重要的事实需要考虑(按相关性排序):
- 精度:必须找到最近的邻居(不是近似值)。
- 速度: 搜索必须尽可能快。 (创建数据结构的时间并不重要)。
所以,我需要一些建议:
- 执行 k-NN 的数据结构。
- 是否最好使用 aNN(近似最近邻)方法,将其设置得尽可能准确?
我认为在如此高维的数据中进行聚类是不明智的。还有次元诅咒问题。
The concept of distance becomes less precise as the number of dimensions grows, since the distance between any two points in a given dataset converges
我建议你找一个好的距离度量,而不是在高维上直接使用欧式距离space。
本页列出了一些可能的解决方案, https://en.wikipedia.org/wiki/Clustering_high-dimensional_data
2.1 Subspace clustering
2.2 Projected clustering
2.3 Hybrid approaches
2.4 Correlation clustering
Can I perform NN search in high dimensional space?
No. 因为维数灾难,在较低维度上表现良好的最近邻搜索的数据结构,表现不佳在一个高维的地方。事实上,查询时间几乎与暴力查询相同,因此它毫无价值。
因此,在高维 space 中,应该进行 近似最近邻 (ANN) 搜索.老实说,必须。
Which data structure to perform ANN?
我建议使用 LSH 或一些 RKD 树。在我的 answer 此处,我提到了一些在 C++ 中执行 ANN 的优秀库。但是,请注意 LSH 解决了 R 近邻问题,因此您指定了参数 R,它实际上是半径。然后,LSH 会从查询点寻找那个 R 里面的 NN,因此你不能真正请求 k 个 NN。
另一方面,RKD 树可以做到这一点,return 你 k NN 的。我有一个项目,它构建了一个 RKD 树森林并在 C++ 中执行 ANN 搜索,但它只针对高维度。它可以在 < 1 秒内处理 960 维的 10^6 图像的 GIST 数据集,大约 90% 的输出是真正的最近邻。名字是 kd-GeRaF。它将在下个月更新为分布式版本,但它已经过测试并可以使用。它还有一个可爱的标志。 :)
我也觉得你应该看看我的answer,里面说最优的数据结构取决于数据