我有大约 100M 个数字向量(Minhash指纹),每个向量包含 0 到 65536 之间的 100 个整数,我正在尝试使用Jaccard 相似度对这个指纹数据库进行快速相似度搜索,即给定一个查询向量(例如 [ 1,0,30, 9, 42, ...]) 求该查询集与 100M 集数据库的交集/并集的比率。
要求是在笔记本电脑上在 <1 秒(不包括索引/文件 IO 时间)内返回查询向量的 k 个“最近邻”。所以显然需要某种索引,问题是最有效的方法是什么。
笔记:我想过使用SimHash,但在这种情况下实际上需要知道集合的交集的大小来识别包含而不是纯粹的相似性/相似性,但 Simhash 会丢失该信息。
我尝试使用Jeffrey Ullman 书中第3 章中描述的简单的局部敏感散列技术,将每个向量分成 20 个“带”或长度为 5 的片段,将这些片段转换为字符串(例如 [1, 2, 45, 2, 3] - >“124523”)并将这些字符串用作哈希表中的键,其中每个键包含“候选邻居”。但问题是它为其中一些片段创建了太多候选者,而改变乐队的数量也无济于事。