LSH

本文深入探讨了局部敏感哈希(LSH)的概念,通过Piotr Indyk的示意图,解释了LSH如何在大数据环境中用于相似性搜索和近似最近邻查找。同时,也介绍了Shingling和Min-Hashing等关键预处理技术。

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

在数据挖掘中经常需要用到比较两个东西的相似度。
下面先主要说一下文档的相似度。 如果是判断两个文档是否完全相同,问题就变得很简单,只要简单地逐字符比较即可。但是在很多情况下并不是这样,比如网站文章的转载,主体内容部分是相同的,但是不同网页本身有自己的Logo、导航栏、版权声明等等,不能简单地直接逐字符比较。

定义两个集合S,T的Jaccard相似度: Sim(S,T) = |S,T的交集| / |S,T的并集|

1、Shingling
就是把每相邻的k个字符作为一个元素,这样整篇文档就变成了一个集合。比如文档是”banana”,若k=2,转化以后得到集合为{“ba”,”an”,”na”},于是又变成了前述集合相似度的问题。关于k值的设置,显然过小或过大都不合适,据说比较短的比如email之类可以设k=5,比如长的文章如论文之类可以设k=9。
Shingling方法里的k值比较大时,可以对每个片段进行一次hash。比如k=9,我们可以把每个9字节的片段hash成一个32bit的整数。这样既节省了空间又简化了相等的判断。这样两步的方法和4-shingling占用空间相同,但是会有更好的效果。因为字符的分布不是均匀的,在4-shingling中实际上大量的4字母组合没有出现过,而如果是9-shingling再hash成4个字节就会均匀得多。

2、Min-Hashing
首先把问题抽象一下,用矩阵的每一列表示一个集合,矩阵的行表示集合中所有可能的元素。若集合c包含元素r,则矩阵中c列r行的元素为1,否则为0。这个矩阵叫做特征矩阵,往往是很稀疏的。以下设此矩阵有R行C列。
所谓minhash是指把一个集合(即特征矩阵的一列)映射为一个0..
### 局部敏感哈希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
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值