我实际上正在研究高维数据(~50.000-100.000特征),并且必须在其上执行最近邻搜索。我知道随着尺寸的增长,KD-Trees的性能很差,而且我也读过,一般来说,所有空间分区数据结构都倾向于使用高维数据进行穷举搜索。
此外,有两个重要事实需要考虑(按相关性排序):
所以,我需要一些建议:
答案 0 :(得分:2)
我可以在高维空间中执行NN搜索吗?
否。 由于维度的诅咒,在较低维度上执行最近邻搜索的数据结构无法在高维度位置执行良好。事实上,查询时间几乎与蛮力一致,因此它毫无价值。
因此,在高维空间中,应该选择 近似最近邻 (ANN)搜索。说实话,必须。
执行ANN的数据结构是什么?
我会建议使用LSH或许多RKD树。在我的answer中,我提到了一些在C ++中执行ANN的好库。但是,请注意LSH解决了R最近邻问题,因此指定参数R,实际上是半径。然后,LSH将从查询点中查找R内的NN,因此您无法真正请求 k NN。
另一方面,RKD树可以做到并返回 k NN&#39。我有一个项目,它构建一个RKD树林并在C ++中执行ANN搜索,但它只针对高维。它可以处理< 960维中的10 ^ 6个图像的GIST数据集。 1秒,约90%的输出是真正的最近邻居。名称为kd-GeRaF。它将在下个月使用分布式版本进行更新,但它已经过测试并可以使用。它还有一个可爱的标志。 :)
我还觉得你应该阅读我的answer,它说最佳数据结构取决于数据。
答案 1 :(得分:0)
我不认为在这种高维数据中进行聚类是明智的。有维度问题的诅咒。
距离的概念变得不那么精确 尺寸增长,因为给定的任何两点之间的距离 数据集收敛
我建议你找到一个很好的距离测量,而不是在高维空间上直接欧几里德距离。
此页面列出了一些可能的解决方案, https://en.wikipedia.org/wiki/Clustering_high-dimensional_data
2.1子空间聚类
2.2预计聚类
2.3混合方法
2.4相关聚类