LSH

本文深入探讨了SimHash和MinHash算法的核心概念、工作原理及其应用,通过实例展示了如何利用这些算法进行特征相似性计算和集合相似度评估。

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

SimHash

  • 参考:http://blog.youkuaiyun.com/heiyeshuwu/article/details/44117473
  • 如下图,规定是多少位,对各个特征进行hash。将所有特征的进行累加。累加结果,若该位大于0则为1,小于0则为0。
    这里写图片描述
  • 可以基于海明距离还计算是否相似
  • 还有查询的问题。空间换时间,取前若干位作为index

MinHash

  • 参考:http://blog.youkuaiyun.com/sunlylorn/article/details/7835411
  • h(x): 把x映射成一个整数的哈希函数。
  • hmin(S):集合S中的元素经过h(x)哈希后,具有最小哈希值的元素。

  • 第一种:使用多个hash函数

    • 为了计算集合A、B具有最小哈希值的概率,我们可以选择一定数量的hash函数,比如K个

    • 然后用这K个hash函数分别对集合A、B求哈希值,对每个集合都得到K个最小值。比如Min(A)k={a1,a2,…,ak},Min(B)k={b1,b2,…,bk}。

    • 那么,集合A、B的相似度为|Min(A)k ∩ Min(B)k| / |Min(A)k ∪ Min(B)k|,及Min(A)k和Min(B)k中相同元素个数与总的元素个数的比例。

  • 第二种:使用单个hash函数

    • 第一种方法有一个很明显的缺陷,那就是计算复杂度高。使用单个hash函数是怎么解决这个问题的呢?请看:

    • 前面我们定义过 hmin(S)为集合S中具有最小哈希值的一个元素,那么我们也可以定义hmink(S)为集合S中具有最小哈希值的K个元素。

    • 这样一来,我们就只需要对每个集合求一次哈希,然后取最小的K个元素。计算两个集合A、B的相似度,就是集合A中最小的K个元素与集合B中最小的K个元素的交集个数与并集个数的比例。

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
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值