【问题标题】:Best data structure for high dimensional nearest neighbor search高维最近邻搜索的最佳数据结构
【发布时间】:2015-11-16 02:11:28
【问题描述】:

我实际上正在处理高维数据(约 50.000-100.000 个特征),必须对其执行最近邻搜索。我知道随着维度的增长,KD-Trees 的性能很差,而且我也读过,一般来说,所有空间分区数据结构都倾向于对高维数据执行穷举搜索。

此外,还有两个重要的事实需要考虑(按相关性排序):

  • 精度:必须找到最近的邻居(不是近似值)。
  • 速度:搜索必须尽可能快。 (创建数据结构的时间并不重要)。

所以,我需要一些建议:

  1. 执行 k-NN 的数据结构。
  2. 如果使用 aNN(近似最近邻)方法会更好,是否将其设置得尽可能准确?

【问题讨论】:

    标签: algorithm data-structures nearest-neighbor tradeoff approximate-nn-searching


    【解决方案1】:

    我可以在高维空间中进行 NN 搜索吗?

    没有。 由于维度的诅咒,执行最近邻搜索的数据结构在较低维度上表现良好,但在高维度上表现不佳。事实上,查询次数几乎与蛮力一样,因此一文不值。

    因此,在高维空间中,应该进行 Approximate Nearest Neighbour (ANN) 搜索。老实说,这是必须

    执行人工神经网络的数据结构是什么?

    我建议使用 LSH,或者一些 RKD 树。在我的answer 中,我提到了一些在 C++ 中执行 ANN 的优秀库。但是,请注意 LSH 解决了 R-最近邻问题,因此您指定了参数 R,它实际上是半径。然后,LSH 将从查询点开始在 R 中查找 NN,因此您不能真正请求 k NN。

    另一方面,RKD 树可以做到这一点并返回 k NN。我有一个项目,它构建了一个 RKD 树森林并在 C++ 中执行 ANN 搜索,但它只针对高维度。它可以在 kd-GeRaF。它将在下个月更新为分布式版本,但它已经过测试并可以使用。它还有一个可爱的标志。 :)


    我也觉得你应该看一下我的answer,上面说最优的数据结构取决于数据。

    【讨论】:

    • 每次插入后是否需要重新构建树?这就是我现在想在工作中避免的 kd-tree 的问题。 Tks
    • 没有@TaxiNoiBaiHaNoi。但是,您需要谨慎插入数据的方式,因为它可能会使树不平衡(假设已经平衡)。在Wikipedia阅读更多内容。
    【解决方案2】:

    我认为在如此高维的数据中进行聚类是不明智的。存在维度诅咒问题。

    距离的概念随着距离的增加而变得不那么精确 尺寸增加,因为给定的任意两点之间的距离 数据集收敛

    我建议你找到一个很好的距离度量,而不是在高维空间上直接欧几里得距离。

    本页列出了一些可能的解决方案, https://en.wikipedia.org/wiki/Clustering_high-dimensional_data

    2.1 子空间聚类

    2.2 投影聚类

    2.3 混合方法

    2.4 相关聚类

    【讨论】:

    • 我没有做也不想做集群。我正在实现一个对象识别系统,每个班级只有一个样本。因此,这种情况下最好的方法是最近邻搜索。
    • 我认为您正在寻找的是一次性学习,en.wikipedia.org/wiki/One-shot_learning。您还可以进行深度学习算法来降低维度。
    猜你喜欢
    • 1970-01-01
    • 2011-08-10
    • 2012-04-19
    • 2014-10-31
    • 1970-01-01
    • 2011-10-21
    • 1970-01-01
    • 2018-06-16
    • 1970-01-01
    相关资源
    最近更新 更多