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