scikit-learn - 可更新的最近邻搜索

标签 scikit-learn nearest-neighbor

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

Saving and incrementally updating nearest-neighbor model in R

在我的例子中,这将是在 Python 中,但要点是当新数据出现时,模型/索引必须更新的部分。我目前正在玩 scikit-learn neighbors module但我不认为它很合适。

应用的目标:

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

然后用户可以单击其中一条记录并查看该记录的最近邻居等。这意味着我们现在处于现有数据集中,并且 NN 可以预先计算并存储在 redis 中(目前有 20 万条记录,但可以扩展到百万分之一或第一亿)。这样浏览应该很快。

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

是否存在用于可更新神经网络搜索的工具、方法或算法?

编辑 4 月 3 日:

正如许多地方指出的那样,KDTree 或 BallTree 并不真正适合高维数据。我已经意识到,对于具有 20 万条记录和 512 维的小数据集的概念验证,暴力破解根本不会慢很多,大约 550 毫秒对 750 毫秒。

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

最佳答案

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

关于scikit-learn - 可更新的最近邻搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49529193/

相关文章:

python - Scikit 学习 API xgboost 允许在线培训吗?

python - 保存 sklearn 模型的最佳方法是什么?

scikit-learn - XGBoost 从 booster 对象中获取分类器对象?

php - SQL中的匹配兴趣(最近邻)搜索

api - 有谁知道免费的邻里数据库?

python - sklearn.impute.IterativeImputer 的实现

python - Sklearn 管道抛出 ValueError : too many values to unpack (expected 2)

machine-learning - SAS : how to get the neighbor list for each row? 中的 k 最近邻

algorithm - 如何在 O(n) 时间内找到 n 个不同数字的中位数的 k 个最近邻居?

java - 寻找二维数组的邻居