目前我正在研究如何使用 Locality-sensitive hashing 找到最近的邻居。然而,当我阅读论文和搜索网络时,我发现了两种算法:
1- 使用 L 个哈希表和 L 个随机 LSH 函数,从而增加两个相似文档获得相同签名的机会。例如,如果两个文档 80% 相似,那么它们有 80% 的机会从一个 LSH 函数中获得相同的签名。但是,如果我们使用多个 LSH 函数,则更有可能从其中一个 LSH 函数中获得文档的相同签名。这种方法在维基百科中有解释,希望我的理解是正确的:
http://en.wikipedia.org/wiki/Locality-sensitive_hashing#LSH_algorithm_for_nearest_neighbor_search
2- 另一种算法使用论文(第 5 节)中的一种方法,名为:Moses S. Charikar 的舍入算法中的相似性估计技术。它基于使用一个 LSH 函数生成签名,然后对其应用 P 排列,然后对列表进行排序。其实我不太了解这个方法,我希望有人能澄清一下。
我的主要问题是:为什么有人会使用第二种方法而不是第一种方法?我发现它更容易更快。
我真的希望有人能帮忙!!!
编辑:实际上我不确定@Raff.Edward 是否混合了“第一”和“第二”。因为只有第二种方法使用了半径,第一种方法只使用了由哈希族 F 组成的新哈希族 g。请查看 wikipedia 链接。他们只是使用许多 g 函数来生成不同的签名,然后对于每个 g 函数,它都有一个相应的哈希表。为了找到一个点的最近邻居,您只需让该点通过 g 函数并检查相应的哈希表是否存在冲突。因此,我如何将其理解为更多功能……更多的碰撞机会。
对于第一种方法,我没有发现任何关于半径的提及。
对于第二种方法,他们只为每个特征向量生成一个签名,然后对它们应用 P 个排列。现在我们有 P 个排列列表,每个列表包含 n 个签名。现在他们然后从 P 中对每个列表进行排序。在给定查询点 q 之后,他们为其生成签名,然后对其应用 P 排列,然后对每个排列和排序的 P 列表使用二进制搜索来找到最相似的签名查询 q。我在阅读了很多关于它的论文后得出了这个结论,但我仍然不明白为什么有人会使用这种方法,因为它在找到汉明距离时似乎并不快!!!!
对我来说,我只需执行以下操作即可找到查询点 q 的最近邻居。给定签名列表 N,我将为查询点 q 生成签名,然后扫描列表 N 并计算 N 中的每个元素与 q 的签名之间的汉明距离。因此,我最终会得到 q 的最近邻居。它需要 O(N) !!!