HOOOS

MinHash、SimHash 之外的 LSH 变种:原理、应用场景与优缺点解析

0 38 哈希算法狂热爱好者 LSH近似最近邻搜索哈希算法
Apple

MinHash、SimHash 之外的 LSH 变种:原理、应用场景与优缺点解析

话说回来,咱们平时聊到近似最近邻搜索(Approximate Nearest Neighbor Search,ANN),肯定会想到局部敏感哈希(Locality Sensitive Hashing,LSH)这个神器。LSH 的基本思想就是,让相似的数据更有可能哈希到同一个桶里,这样咱们找相似数据的时候,就不用大海捞针,直接在少数几个桶里捞就行了,效率大大提高!

MinHash 和 SimHash 又是 LSH 家族里最出名的两个兄弟,一个擅长处理集合数据,一个擅长搞定文本数据。但是!LSH 的家族可不止这两个兄弟,还有很多其他的变种,它们各有各的绝活,适用于不同的场景和数据类型。今天,咱就来扒一扒 MinHash 和 SimHash 之外的那些 LSH 变种,看看它们都有啥本事!

1. LSH 的基本思想回顾

在深入了解各种 LSH 变种之前,咱们先简单回顾一下 LSH 的核心思想。LSH 的关键在于“局部敏感”这四个字。啥意思呢?就是说,如果两个数据点在原始空间中比较相似,那么经过 LSH 函数哈希之后,它们落到同一个桶里的概率也比较大;反之,如果两个数据点不相似,那么它们哈希到同一个桶里的概率就比较小。

为了实现这个目标,LSH 算法通常会采用以下几个步骤:

  1. 选择合适的哈希函数族: 不同的 LSH 变种会使用不同的哈希函数族,这些哈希函数族需要满足“局部敏感”的特性。常见的哈希函数族有基于 p-stable 分布的哈希函数、基于 Jaccard 距离的 MinHash、基于 Cosine 距离的 SimHash 等。
  2. 构建哈希表: 通常会使用多个哈希函数(或者说多个哈希函数族)来构建多个哈希表。每个哈希表都会将数据点划分到不同的桶里。
  3. 查询: 对于一个查询点,先用每个哈希函数计算出它在每个哈希表里对应的桶,然后在这些桶里查找与查询点相似的数据点。

2. LSH 变种大盘点

好了,铺垫了这么多,终于要进入正题了!下面咱们就来盘点一下 MinHash 和 SimHash 之外的那些 LSH 变种。

2.1 SuperBit LSH

SuperBit LSH 可以看作是 SimHash 的一种改进版。SimHash 使用的是随机超平面来划分数据空间,而 SuperBit LSH 则使用了一组“精心挑选”的超平面。这些超平面不是完全随机的,而是通过一种叫做“SuperBit”的算法来生成的。SuperBit 算法的目标是找到一组相互之间尽可能正交的超平面,这样可以减少哈希冲突,提高查询的准确率。

  • 原理:
    1. 从训练数据中随机抽取一部分向量。
    2. 对这些向量进行正交化处理,得到一组相互正交的基向量。
    3. 使用这些基向量作为超平面,对数据进行哈希。
  • 优点:
    • 相比 SimHash,SuperBit LSH 可以使用更少的哈希位来达到相同的查询准确率,从而减少存储空间和计算量。
    • 由于超平面之间更加正交,SuperBit LSH 的哈希冲突更少,查询准确率更高。
  • 缺点:
    • SuperBit LSH 需要从训练数据中学习超平面,因此需要一定的训练时间。
    • 如果训练数据不能很好地代表整个数据集的分布,SuperBit LSH 的性能可能会下降。
  • 适用场景:
    • 高维向量数据的近似最近邻搜索,例如图像检索、推荐系统等。

2.2 Cross-polytope LSH

Cross-polytope LSH 也是 SimHash 的一种改进版,它使用了另一种不同的方式来划分数据空间。SimHash 使用的是超平面,而 Cross-polytope LSH 使用的是“交叉多面体”(Cross-polytope)。交叉多面体是一种特殊的几何体,它的形状有点像钻石。在二维空间中,交叉多面体就是一个正方形;在三维空间中,它就是一个正八面体。Cross-polytope LSH 的核心思想就是,将数据点投影到交叉多面体的各个顶点上,然后根据投影结果进行哈希。

  • 原理:
    1. 生成一个随机矩阵,矩阵的每一列代表一个交叉多面体的顶点。
    2. 将数据向量与随机矩阵相乘,得到一个投影向量。
    3. 找到投影向量中绝对值最大的元素,将该元素对应的顶点作为哈希值。
  • 优点:
    • Cross-polytope LSH 的理论性能比 SimHash 更好,尤其是在高维空间中。
    • Cross-polytope LSH 的计算复杂度与 SimHash 相当。
  • 缺点:
    • Cross-polytope LSH 的实现比 SimHash 稍微复杂一些。
  • 适用场景:
    • 高维向量数据的近似最近邻搜索,尤其是在维度非常高的情况下。

2.3 E2LSH (Exact Euclidean LSH)

E2LSH 是一种基于 p-stable 分布的 LSH 算法。p-stable 分布是一种特殊的概率分布,它有一个重要的性质:如果两个向量的差服从 p-stable 分布,那么它们的欧几里得距离可以被很好地估计出来。E2LSH 利用了这个性质,通过将数据点投影到服从 p-stable 分布的随机向量上,然后对投影结果进行哈希,从而实现近似最近邻搜索。

  • 原理:
    1. 生成多个服从 p-stable 分布的随机向量。
    2. 将数据向量与这些随机向量进行点积,得到一组投影值。
    3. 对每个投影值进行量化(例如,取整或者四舍五入),得到一个哈希值。
  • 优点:
    • E2LSH 对欧几里得距离有很好的理论保证。
    • E2LSH 的参数调节比较简单。
  • 缺点:
    • E2LSH 的计算复杂度相对较高,尤其是在维度较高的情况下。
    • E2LSH 需要存储随机向量,会占用一定的存储空间。
  • 适用场景:
    • 欧几里得空间中的近似最近邻搜索,例如图像检索、推荐系统等。

2.4 基于聚类的 LSH

基于聚类的 LSH 是一种将聚类算法和 LSH 结合起来的算法。它的基本思想是,先对数据进行聚类,然后对每个簇分别构建 LSH 索引。在查询时,先找到查询点所属的簇,然后在该簇对应的 LSH 索引中进行查找。这样可以减少需要搜索的数据量,提高查询效率。

  • 原理:
    1. 使用聚类算法(例如 K-Means)将数据点划分成多个簇。
    2. 对每个簇分别构建 LSH 索引。
    3. 对于一个查询点,先找到它所属的簇。
    4. 在该簇对应的 LSH 索引中进行查找。
  • 优点:
    • 可以减少需要搜索的数据量,提高查询效率。
    • 可以处理非均匀分布的数据。
  • 缺点:
    • 聚类算法的性能会影响整个算法的性能。
    • 如果簇的划分不够好,可能会导致查询准确率下降。
  • 适用场景:
    • 非均匀分布的数据的近似最近邻搜索。

2.5 多探头 LSH (Multi-Probe LSH)

多探头 LSH 是一种改进的 LSH 算法,它通过在查询时探测多个桶来提高查询准确率。传统的 LSH 算法通常只探测一个桶,而多探头 LSH 会根据一定的策略探测多个桶。这样可以增加找到相似数据点的概率,减少漏报的可能性。

  • 原理:
    1. 构建多个哈希表。
    2. 对于一个查询点,计算它在每个哈希表里对应的桶。
    3. 根据一定的策略,选择多个桶进行探测。
    4. 在这些桶里查找与查询点相似的数据点。
  • 优点:
    • 可以提高查询准确率,减少漏报的可能性。
  • 缺点:
    • 需要探测多个桶,会增加查询时间。
  • 适用场景:
    • 对查询准确率要求较高的场景。

3. 总结与展望

除了上面介绍的几种 LSH 变种,还有很多其他的 LSH 算法,例如基于图的 LSH、基于树的 LSH 等。这些算法各有各的特点,适用于不同的场景和数据类型。选择哪种 LSH 算法,需要根据具体的需求来决定。

总的来说,LSH 是一个非常有用的工具,它可以帮助我们高效地解决近似最近邻搜索问题。随着数据量的不断增长,LSH 的应用也会越来越广泛。相信未来会有更多更强大的 LSH 算法被提出,让我们拭目以待!

希望这篇文章能帮到你,让你对 LSH 的世界有更深入的了解!以后再遇到相似性搜索的问题,就知道该怎么选 LSH 算法啦!

点评评价

captcha
健康