目前我正在学习如何使用局部敏感哈希找到最近的邻居。然而,在阅读论文和搜索网络时,我发现了两种实现此目的的算法:
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。请检查维基百科链接。他们只是使用许多g函数生成不同的签名,然后对于每个g函数,它都有一个相应的哈希表。为了找到一个点的最近邻居,你只需要让这个点通过g函数,并检查相应的哈希表是否有冲突。因此,我理解为更多的函数......更容易出现冲突。
我没有找到任何关于第一种方法的半径提及。
对于第二种方法,他们仅为每个特征向量生成一个签名,然后对它们应用P个排列。现在我们有了P个排列列表,每个列表包含n个签名。然后,他们对来自P的每个列表进行排序。之后,给定查询点q,他们为其生成签名,然后对其应用P个排列,然后在每个排列和排序后的P列表上使用二进制搜索,以找到与查询q最相似的签名。我阅读了许多关于此的论文后得出了这个结论,但我仍然不明白为什么会有人使用这种方法,因为它似乎在查找汉明距离方面并不快!!!对于我来说,我会简单地执行以下操作来查找查询点q的最近邻。给定签名列表N,我将为查询点q生成签名,然后扫描列表N并计算N中每个元素与q的签名之间的汉明距离。因此,我最终会得到q的最近邻。而且它只需要O(N)!