【问题标题】:How to hash vectors into buckets in Locality Sensitive Hashing (using jaccard distance)?如何在局部敏感散列中将向量散列到桶中(使用杰卡德距离)?
【发布时间】:2014-05-21 17:47:55
【问题描述】:

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

我的代码能够使用 minhash 函数计算签名矩阵(我快要结束了)。我还在签名矩阵上应用了条带策略。但是我无法理解如何将带中的签名向量(列)散列到桶中。

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

q1:散列函数是否只会将 same 向量映射到同一个桶? (假设我们有足够的桶)

q2:散列函数是否应该将 similar 向量映射到同一个桶?如果是,那么这种相似性的程度/定义是什么,因为我不是在计算比较,而是在做散列。

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

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

【问题讨论】:

    标签: c hash machine-learning locality-sensitive-hash minhash


    【解决方案1】:

    q1:您不应该对整个向量进行散列,而是对其中的一部分进行散列。假设您有代表每个项目的长度为 100 的向量,您可以散列 5 个长度为 20 的切片。

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

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

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

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

    q4:我不确定你的意思。如果你散列一个对象,你通常会得到一个位串或一个整数或一个浮点数作为输出,这取决于语言。就是那个桶。如果你在不同的对象上使用相同的散列函数得到相同的输出,这意味着它们在同一个桶上散列。

    【讨论】:

      【解决方案2】:

      为 LSH 生成哈希函数的一种简单方法如下:

      对于每个带 b 的给定 min-hash signaturei,计算带中的行总和,称为 S_ib。为S_ib 创建一个存储桶。对于完整的集合,桶将附加总和与 S_ib 匹配的条目,否则将生成一个新桶

      从集合导入defaultdict

      ....
      LSHdictlist = [defaultdict(list) for b in range(bands)]
      ....
      tempsum = np.int(np.sum(M[i,b*rowsinband:(b+1)*rowsinband]))
              LSHdictlist[b][tempsum].append(i)
      

      您也可以使用 product 而不是 sum。

      【讨论】:

        猜你喜欢
        • 2016-09-19
        • 2011-04-29
        • 2020-05-19
        • 2016-09-25
        • 2012-12-08
        • 2016-03-16
        • 1970-01-01
        • 1970-01-01
        • 2013-07-26
        相关资源
        最近更新 更多