LSH 复习(考试向)

博客围绕解决文本相似度计算问题展开,指出传统hash算法无法对相似文本生成相似hash值。介绍了MinHash算法生成hash的步骤,还阐述了LSH(局部敏感哈希)算法,它能将大矩阵压缩成小矩阵,通过对signature向量分桶降低寻找相似用户的计算复杂度,并对分桶概率进行了分析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Overall

hash就是将不同长度规则的文本转化成相同长度的字符串,用这些相同长度的字符串来表示原文本。但是传统 hash存在一个问题是,相同内容的文本会生成相同的 hash,但是相似的文本(可能就是一个字的差别)生成的 hash会有很大的不同。但是我们在做文本相似度时,希望对相似的文本生成相似的 hash,这样我们只需要计算一个个特定长度的 hash值之间相似度,就可以近似得到原文本之间的相似度了,显然传统的 hash算法是做不到这一点的 。

针对这个问题我们就要设计一种hash算法,让相似的文本生成相似的 hash值。

在这里插入图片描述MinHash each set/document into a hash table Only compute Jaccard similarity of any pair of sets in the same bucket

Minhash Signatures

在这里插入图片描述Question

在这里插入图片描述

Binary Matrix(bit-vector)

Universe = {1,2,3,4,5,6,7}
D1 has {1,2,5,6,7}
Hence, D1[1] = D1[2] = D1[5] = D1[6] = D1[7] =1, while D1[3] = D1[4] = 0, so on and so forth.

在这里插入图片描述
(A)Answer

在这里插入图片描述

Construct MinHash matrix

在minhash算法中是怎么生成 hash的呢 可以用如下 3步来简单理解如何生成 hash

  • 将行随机打乱。

  • 行打乱后,针对每个 S1、 S2、 S3看第一个 1所在的行号,这个行号就是这个集合的最小值就是 MinHash Value。

  • 设定 hash的大小,如果是 N,则重复上述步骤,随机进行 N次行打乱, 得到 N个最小哈希值,那么这 N个 MinHash Value组成的集合就是 S1、 S2、 S3 MinHash Signature

所以,MinHash Signature 是 N个 MinHash Value组成的集合

比如,对于红色的第一列随机行号S1来说,D1的一列中D1[n] == 1所对应的行号的集合为{4,2,6,3,5},其中最小的是2,所以D1在S1上的MinHash Value是2,以此类推。
在这里插入图片描述

(B)Answer

在这里插入图片描述

Generate simulated permutations

Question

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

Jaccard similarities

Example

在这里插入图片描述

Answer

在这里插入图片描述

Tuning Parameters for rNNS

LSH (Locality Sensitivity Hashing, 局部敏感哈希)算法通过上面的Min Hashing可以将一个大矩阵通过哈希映射压缩成一个小矩阵,同时保持各列之间的相似性,从而降低了复杂度。但是,虽然我们降低了特征复杂度,如果用户非常多的话,我们的计算量依然是非常大的(O(n**2)),如果我们能先粗略地将用户分桶,将可能相似的用户以较大概率分到同一个桶内,这样每一个用户的“备选相似用户集”就会相对较小,降低寻找其相似用户的计算复杂度,LSH就是这样一个近似算法。

LSH的具体做法是在Min Hashing所得的signature向量的基础上,将每一个向量分为几段,称之为band(即每个band包含多行),如下图所示

在这里插入图片描述
每个signature向量被分成了4段,图上仅展示了各向量第一段的数值。其基本想法是:如果两个向量的其中一个或多个band相同,那么这两个向量就可能相似度较高;相同的band数越多,其相似度高的可能性越大。所以LSH的做法就是对各个用户的signature向量在每一个band上分别进行哈希分桶来计算相似度,在任意一个band上被分到同一个桶内的用户就互为candidate相似用户,这样只需要计算所有candidate用户的相似度就可以找到每个用户的相似用户群了。

下面我们对signature向量的分桶概率作一些数值上的分析,以便针对具体应用确定相应的向量分段参数。假设我们将signature向量分为b个band,每个band的大小(也就是band内包含的行数)为r。假设两个用户向量之间的Jaccard相似度为s,前面我们知道signature向量的任意一行相同的概率等于Jaccard相似度s,我们可以按照以下步骤计算两个用户成为candidate用户的概率:

  • 两个signature向量的任意一个band内所有行的值都相同的概率为sr;
  • 两个signature向量的任意一个band内至少有一行值不同的概率为1-sr;
  • 两个signature向量的所有band都不同的概率为(1-sr)b;
  • 两个signature向量至少有一个band相同的概率为1-(1-sr)b,即为两个用户成为candidate相似用户的概率;

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述(A)Answer

在这里插入图片描述
Y – axis: Probability of being a candidate
False Positives: 相似度很低的两个用户被哈希到同一个桶内
False Negatives: 真正相似的用户在每一个band上都没有被哈希到同一个桶内

(B)Answer

在这里插入图片描述
(C)Answer

在这里插入图片描述

03-31
### 局部敏感哈希(LSH算法原理 局部敏感哈希(Locality-Sensitive Hashing, LSH)是一种用于处理高维数据相似性搜索的技术。其核心思想是设计一种特殊的哈希函数,使得相似的数据对象更有可能被映射到同一个“桶”中[^3]。 #### 原理概述 传统哈希函数的目标是尽可能均匀分布数据,而 LSH 的目标则是保持原始数据之间的相似关系。具体而言,如果两个数据点在原空间中的距离较小,则它们经过 LSH 映射后的哈希值有更高的概率相同;反之亦然。这种特性使 LSH 成为解决大规模近似最近邻搜索问题的有效工具[^4]。 #### 主要实现方式 根据不同的应用场景和技术需求,LSH 可以采用多种具体的实现方法: 1. **SimHash** SimHash 是一种基于随机超平面投影的 LSH 方法。它的基本思路是通过一系列随机向量将输入数据投射到低维空间,并利用汉明距离代替余弦距离来衡量相似度[^1]。这种方法特别适合处理文本或其他稀疏特征表示的任务。 2. **MinHash** MinHash 则主要应用于集合间的相似性计算,尤其是 Jaccard 相似系数的估计。它通过对集合元素进行多次独立哈希操作并记录最小值的方式降低维度,从而提高效率。 除了上述两种经典形式外,还有其他变种如基于稳定分布投影的方法以及核化版本(Kernel LSH),这些扩展进一步增强了 LSH 对不同类型数据的支持能力[^2]。 --- ### 应用领域 由于能够显著提升大数据环境下的检索速度与精度,LSH 已经广泛应用于多个实际场景之中: - **推荐系统**: 在构建个性化推荐模型时,可以通过 LSH 快速定位用户兴趣偏好相近的商品或内容; - **图像识别**: 面对海量图片库,借助该技术可迅速筛选出视觉上类似的候选集; - **自然语言处理(NLP)**: 文档去重、主题分类等领域也离不开高效的语义匹配手段支持; - **生物信息学**: DNA序列比对等问题同样受益于此类高效索引机制带来的便利条件[^5]。 ```python import numpy as np def lsh_example(data_points, hash_functions): """ A simple example of applying Locality Sensitive Hashing. :param data_points: List of high-dimensional vectors to be hashed. :param hash_functions: Predefined list of hashing functions. :return: Dictionary mapping buckets to their corresponding points. """ bucket_map = {} for point in data_points: signature = tuple([f(point) for f in hash_functions]) if signature not in bucket_map: bucket_map[signature] = [] bucket_map[signature].append(point) return bucket_map ``` 此代码片段展示了一个简化版的 LSH 实现过程,其中 `data_points` 表示待处理的数据样本集合,而 `hash_functions` 定义了一系列预先设定好的散列规则。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

nine_mink

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值