1841 words
9 minutes
MinHash LSH

简介#

MinHash LSH(MinHash Locality-Sensitive Hashing)是一种用于高效近似最近邻搜索的技术,广泛应用于处理大规模集合数据的相似性比较,特别是在文本、图像和其他高维数据的相似性搜索中。

MinHash 的基本原理#

MinHash 是一种用于估计集合相似性(通常是 Jaccard 相似性)的方法。Jaccard 相似性是两个集合交集的大小与它们并集的大小之比。MinHash 通过以下步骤来估计这个相似性:

  1. 哈希函数:使用多个哈希函数将集合中的元素映射到一个较小的值域中。
  2. 最小哈希值:对于每个集合,计算所有哈希值的最小值,这个最小值称为 MinHash 值。通过多个不同的哈希函数,可以得到多个 MinHash 值,从而形成一个 MinHash 签名。
  3. 相似性估计:两个集合的 MinHash 签名的相似度(即它们的 MinHash 值的相等比例)可以用来估计这两个集合的 Jaccard 相似度。

LSH 的基本原理#

局部敏感哈希(Locality-Sensitive Hashing,LSH)是一种技术,旨在通过将相似的对象映射到同一个桶中来加速相似性搜索。LSH 的关键是设计哈希函数,使得相似的输入数据在哈希后有较高的概率被映射到同一个桶中,而不相似的数据则有较低的概率。

MinHash LSH 的结合#

MinHash LSH 将 MinHash 和 LSH 结合起来,具体步骤如下:

  1. 生成 MinHash 签名:对每个集合使用 MinHash 方法生成一个 MinHash 签名。
  2. 哈希签名:将 MinHash 签名通过 LSH 哈希函数进行映射。每个签名会被映射到一个或多个桶中。
  3. 桶的查询:在进行相似性查询时,只需检查与查询对象在同一个桶中的其他对象,从而大幅减少需要比较的对象数量。

应用场景#

MinHash LSH 在许多应用中非常有用,包括:

  • 文本相似性检测:例如,检测文档或网页的重复内容。
  • 推荐系统:为用户提供相似兴趣的物品。
  • 图像查找:寻找相似的图像或图像特征。
  • 社交网络分析:寻找社交网络中相似的用户或群组。

通过使用 MinHash LSH,系统可以高效地处理大规模数据集,实现快速的相似性搜索,同时保持较高的准确性。

计算方法#

当然可以!以下是计算 MinHash LSH 的具体步骤,包括如何生成 MinHash 签名、如何进行局部敏感哈希(LSH)以及如何使用这些信息进行相似性搜索。

步骤 1:准备数据#

  1. 输入数据:准备一组集合数据,例如文档的词集、用户的兴趣标签等。每个集合可以用一个唯一的标识符表示。

步骤 2:生成 MinHash 签名#

  1. 选择哈希函数:选择一组哈希函数。通常使用多个独立的哈希函数来生成不同的 MinHash 值。每个哈希函数 ( h_i ) 可以将集合元素映射到一个整数值。

  2. 计算 MinHash 值

    • 对于每个集合 SjS_j,执行以下操作:
      • 对集合中的每个元素 xx 计算哈希值 hi(x)h_i(x)
      • 记录每个哈希函数 hih_i 的最小值: MinHashi(Sj)=minxSj(hi(x))\text{MinHash}_i(S_j) = \min_{x \in S_j}(h_i(x))
    • 这样,对于每个集合 SjS_j,你将得到一个 MinHash 签名 MinHash(Sj)=[MinHash1(Sj),MinHash2(Sj),,MinHashk(Sj)]\text{MinHash}(S_j) = [\text{MinHash}_1(S_j), \text{MinHash}_2(S_j), \ldots, \text{MinHash}_k(S_j)],其中 kk 是哈希函数的数量。

步骤 3:构建 LSH 哈希表#

在这个步骤中,我们将生成 LSH 哈希表,以便将 MinHash 签名进行分组,便于后续的相似性查询。以下是更详细的步骤:

3.1 选择 LSH 参数#

  • 选择桶的数量 bb:决定将生成的 MinHash 签名分成多少个部分。每个部分对应一个桶。
  • 每个桶的签名数量 rr:决定每个桶中包含多少个 MinHash 值。通常情况下,rr 的值应该小于 MinHash 签名的总长度 kk(即使用的哈希函数数量)。

3.2 创建 LSH 哈希表#

  1. 初始化哈希表:创建一个空的哈希表(可以使用字典或其他数据结构),每个桶的键是哈希值,值是存储集合标识符的列表。

  2. 为每个集合生成 MinHash 签名

    • 假设你已经为每个集合 SjS_j 计算了 MinHash 签名: MinHash(Sj)=[MinHash1(Sj),MinHash2(Sj),,MinHashk(Sj)]\text{MinHash}(S_j) = [\text{MinHash}_1(S_j), \text{MinHash}_2(S_j), \ldots, \text{MinHash}_k(S_j)]
  3. 将 MinHash 签名划分为桶

    • 对于每个 MinHash 签名,将其划分为 bb 个部分,每个部分包含 rr 个 MinHash 值(即每个部分的长度为 rr)。
    • 例如,如果 k=brk = br,那么每个 MinHash 签名可以被分成 bb 个长度为 rr 的子签名: MinHash(Sj)=[MinHash1(Sj),,MinHashr(Sj)Part 1,MinHashr+1(Sj),,MinHash2r(Sj)Part 2,,MinHash(b1)r+1(Sj),,MinHashbr(Sj)Part b]\text{MinHash}(S_j) = [\underbrace{\text{MinHash}_1(S_j), \ldots, \text{MinHash}_r(S_j)}_{\text{Part 1}}, \underbrace{\text{MinHash}_{r+1}(S_j), \ldots, \text{MinHash}_{2r}(S_j)}_{\text{Part 2}},\\\ldots, \underbrace{\text{MinHash}_{(b-1)r+1}(S_j), \ldots, \text{MinHash}_{br}(S_j)}_{\text{Part b}}]
  4. 为每个部分生成哈希值

    • 对于每个部分(子签名),生成一个哈希值。可以使用简单的哈希函数,如 SHA-1、MD5 或自定义的哈希函数。
    • 对于第 ii 个桶(ii 从 1 到 bb),计算哈希值: hi(Sj)=hash(MinHash(i1)r+1(Sj),,MinHashir(Sj))h_i(S_j) = \text{hash}(\text{MinHash}_{(i-1)r+1}(S_j), \ldots, \text{MinHash}_{ir}(S_j))
  5. 将集合标识符存入哈希表

    • 使用哈希值 hi(Sj)h_i(S_j) 作为键,将集合标识符 SjS_j 存入哈希表中对应的桶。如果该哈希值不存在,则创建一个新的列表并添加 SjS_j;如果已存在,则将 SjS_j 添加到现有的列表中。

    • 例如,如果哈希表是一个字典,添加的代码可能如下:

      hash_table[h_i(S_j)] = hash_table.get(h_i(S_j), []) + [S_j]

3.3 处理所有集合#

  • 对于每一个集合 SjS_j,重复上述过程,直到所有集合都被处理并存入 LSH 哈希表中。

示例#

假设我们有三个集合和我们选择的参数 b=2b = 2r=2r = 2,并且每个集合的 MinHash 签名长度为 4(即 k=4k = 4)。我们将每个 MinHash 签名划分为两个部分,每个部分包含两个 MinHash 值。

  • 集合 S1S_1 的 MinHash 签名: MinHash(S1)=[3,1,4,2](分为两部分: [3, 1], [4, 2])\text{MinHash}(S_1) = [3, 1, 4, 2] \quad \text{(分为两部分: [3, 1], [4, 2])}
  • 集合 S2S_2 的 MinHash 签名: MinHash(S2)=[2,0,3,1](分为两部分: [2, 0], [3, 1])\text{MinHash}(S_2) = [2, 0, 3, 1] \quad \text{(分为两部分: [2, 0], [3, 1])}
  • 集合 S3S_3 的 MinHash 签名: MinHash(S3)=[1,1,2,0](分为两部分: [1, 1], [2, 0])\text{MinHash}(S_3) = [1, 1, 2, 0] \quad \text{(分为两部分: [1, 1], [2, 0])}

然后,计算每个部分的哈希值并将集合存入哈希表中。

步骤 4:查询#

  1. 查询集合:对于待查询的集合 QQ,首先计算其 MinHash 签名 MinHash(Q)\text{MinHash}(Q)

  2. 生成查询的 LSH 哈希值

    • 将查询的 MinHash 签名划分为 bb 个部分,并为每个部分生成哈希值。
  3. 查找候选集合

    • 根据查询生成的哈希值,查找 LSH 哈希表中对应的桶,获取与查询集合 QQ 可能相似的候选集合。

步骤 5:相似性计算#

  1. 精确相似性计算
    • 对于候选集合,计算其与查询集合 QQ 的 Jaccard 相似性(或其他相似性度量),以确认哪些集合是最相似的。这可以通过以下公式计算:
    J(Sj,Q)=SjQSjQJ(S_j, Q) = \frac{|S_j \cap Q|}{|S_j \cup Q|}
    • 根据计算的相似性得分,选出最相似的集合。

总结#

以上步骤概述了如何计算 MinHash LSH 的流程。通过使用 MinHash 签名和 LSH 哈希表,可以高效地进行大规模集合数据的相似性搜索,从而显著提高搜索效率,特别是在处理高维数据时。

MinHash LSH
https://etherwindy.github.io/AstroBlog/posts/minhash-lsh/
Author
etherwindy
Published at
2024-11-13
License
CC BY-NC-SA 4.0