如何在“位置敏感哈希”中将向量哈希到存储桶中(使用jaccard距离)?

toz*_*zak 6 c hash machine-learning minhash locality-sensitive-hash

我正在实现一个近邻搜索应用程序,它将找到相似的文档。到目前为止,我已经阅读了很多有关LSH的资料(LSH背后的理论有些令人困惑,我还不能100%理解它)。

我的代码能够使用minhash函数计算签名矩阵(我已经接近尾声了)。我也将签名策略应用于签名矩阵。但是,我不明白如何将一个带中的(列的)签名向量散列到存储桶中。

我的最后一个问题可能是最重要的一个,但我不得不问一些introduction问题:

问题1:哈希函数是否只会将相同的向量映射到相同的存储桶?(假设我们有足够的水桶)

问题2:哈希函数是否应将相似的向量映射到同一存储桶?如果是,那么这种相似性的程度/定义是多少,因为我不是在计算比较,而是在进行哈希处理。

q3:根据上面的问题,我应该使用哪种哈希表算法?

q4:我认为我的最弱点是我不知道如何生成将向量作为输入并选择存储桶作为输出的哈希函数。我可以根据q1和q2自己实现一个...关于为LSH生成哈希函数的任何建议bucketing

ppl*_*lat 6

q1:您不应该对整个向量进行哈希处理,而应对部分向量进行哈希处理。假设您有代表每个项目的长度为100的向量,则可以哈希5个长度为20的切片。

q2:这是整个事物的主要思想:通过比较事物的某些部分是否相等来衡量相似性。如果您将文本中的句子视为向量,则两个句子不可能完全相同(具有相同的哈希输出)。但是,如果将它们分成几部分并分别对它们进行散列化处理,则在相同位置的一些匹配单个单词的散列将返回相同的散列输出,因此您可以对句子的相似性有所了解。

切片的数量和长度是重要的参数,它们会影响相似性结果的准确性。太多的切片会产生很多误报,而太多的切片只能识别出最高的相似度。

您可以在本书“挖掘大量数据集”中找到有关此的更多信息:http : //infolab.stanford.edu/~ullman/mmds.html

q3:您需要一个数据结构,对于每个切片级别,它都可以保留每个向量切片的哈希结果以及产生它的向量。然后,当要查找向量X的相似邻居时,可以检查每个切片的数据结构,并查看获得的哈希输出是否也由另一个向量输出。

q4:我不确定你在这里是什么意思。如果对一个对象进行哈希处理,则通常会根据语言的不同而获得一个位串或一个整数或一个浮点数作为输出。这就是水桶。如果在不同的对象上使用相同的哈希函数获得相同的输出,则意味着它们在同一存储桶上进行了哈希处理。