可更新的最近邻搜索

时间:2018-03-28 08:06:25

标签: scikit-learn nearest-neighbor

我正在尝试为最近邻搜索应用程序设计一个好的设计。这有点类似于这个问题:

Saving and incrementally updating nearest-neighbor model in R

在我的情况下,这将是在Python中,但主要的一点是,当新数据出现时,必须更新模型/索引。我现在正在玩scikit-learn neighbors module,但我不相信它是合适的。

申请的目标:

用户进入查询,然后将显示现有数据集中的n(可能将固定为5)最近邻居。对于这一步骤,来自sklearn的搜索结构会有所帮助,但是在添加新记录时必须重新生成。这也是每次查询发生1次的第一次,因此在2-3秒内可能有点“慢”。 “即刻”。

然后,用户可以单击其中一个记录,并查看记录最近邻居等等。这意味着我们现在位于现有的数据集中,NN可以预先计算并以redis形式存储(现在有200,000条记录,但可以扩展到10或100万条)。浏览时应该非常快。

但是在这里我将面临同样的问题,即如何更新预先计算的数据而不必对距离矩阵进行完全重新计算,特别是因为新记录很少(例如每周100个)。

是否存在可更新的NN搜索的工具,方法或算法?

编辑4月3日:

如许多地方所示,KDTree或BallTree并不适合高维数据。我已经意识到,对于具有200k记录和512维度的小数据集的概念验证,蛮力并没有太慢,大约550ms对750ms。

然而,对于数百万以上的大数据集,问题仍未得到解决。我看过datasketch LSH Forest,但在我的情况下,这似乎不够准确或我使用它错了。将就此问一个单独的问题。

3 个答案:

答案 0 :(得分:2)

您可以尝试支持添加和近实时矢量搜索的 Milvus

这是 Milvus 的 benchmarks

答案 1 :(得分:1)

你应该研究FAISS及其IVFPQ方法 你可以做的是为每个更新创建多个索引,并将它们与旧的更新

答案 2 :(得分:0)

nmslib 支持添加新向量。 Elasticsearch 使用它作为其 Similarity Search Engine 的一部分,它是 very fast

一个警告:

<块引用>

虽然 HNSW 算法允许增量添加点,但它禁止删除和修改索引点。

您还可以研究MilvusVearch 之类的解决方案。