【问题标题】:Knn search for large data?Knn 搜索大数据?
【发布时间】:2013-04-10 04:07:43
【问题描述】:

我有兴趣在大型数据集上执行 knn 搜索。

有一些库:ANN 和 FLANN,但我对这个问题很感兴趣:如果您的数据库不完全适合内存 (RAM),如何组织搜索?

【问题讨论】:

    标签: algorithm search machine-learning knn


    【解决方案1】:

    我想这取决于您的索引与内存相比有多大。这是我的第一个自发想法:

    1. 假设它是 RAM 大小的几十倍,我会尝试使用例如层次聚类树(在 FLANN 中实现)对我的数据进行聚类。我会修改树的实现,以便它们将分支保存在内存中并将叶子(簇)保存在磁盘上。因此,每次都必须加载适当的集群。然后,您可以尝试以不同的方式对此进行优化。

    2. 如果它不是那么大(假设是 RAM 大小的两倍),我会将数据集分成两部分并为每个部分创建一个索引。因此,我需要在每个数据集中找到最近的邻居,然后在它们之间进行选择。

    【讨论】:

    • 你说得对,我们需要使用一些分层表示,但也许有一些现成的解决方案?
    • 也许有,但我没有听说过。此外,我认为这确实是针对您的情况的优化问题(例如,为了减少访问磁盘的次数而进行更多计算是否成本更高,或者与您的计算相比访问磁盘是否便宜力量?)。如果您发现了什么,请告诉我们...
    • I would try to cluster my data using, for instance, hierarchical clustering trees。 kdd 或 ball 树是这样的方法吗?
    【解决方案2】:

    这取决于您的数据是否非常高维。如果是比较低维的,可以使用现有的磁盘上的R-Tree实现,比如Spatialite。

    如果是更高维度的数据,你可以使用X-Trees,但我不知道有什么磁盘上的实现。

    或者,您可以使用磁盘持久性实现locality sensitive hashing,例如使用 mmap。

    【讨论】:

    • 为什么取决于尺寸大小?
    • 这是关于所谓的维度诅咒 (en.wikipedia.org/wiki/Curse_of_dimensionality):在更高维度的空间中,数据变得非常稀疏,并且所有数据点开始看起来同样(不)相似。因此,例如使用欧几里得距离等相似性度量的方法无法正常工作。
    • 我的矢量大小约为 24*32 或 32*32 是大还是小?我应该使用什么度量来代替欧几里德距离?
    猜你喜欢
    • 2012-01-03
    • 1970-01-01
    • 1970-01-01
    • 2013-07-19
    • 2011-06-28
    • 1970-01-01
    • 1970-01-01
    • 2022-09-24
    • 1970-01-01
    相关资源
    最近更新 更多