You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何快速近似计算集合Jaccard分数?适配万亿级成对计算需求

近似Jaccard相似度计算方案:性能提升超数量级

针对你需要快速计算万亿级成对Jaccard分数、容忍±0.15误差的场景,**MinHash+局部敏感哈希(LSH)**是最优选择,性能提升远超一个数量级,完全适配你的需求。

核心方法:MinHash(最小哈希)

MinHash专门用于Jaccard相似度的近似估算,核心逻辑是将集合间的Jaccard相似度转化为哈希签名的匹配概率:

  • 对每个集合,用k个独立哈希函数计算集合元素的最小值,生成长度为k的MinHash签名
  • 两个集合的Jaccard相似度 ≈ 它们MinHash签名中相同值的比例
  • 当k取15-20时,误差可稳定控制在±0.15以内,计算量仅为原方法的1/100甚至更低

适配你的场景的关键优化

  1. 预计算已知集合签名:提前为1亿个已知集合生成MinHash签名并存储,每次更新10%-25%的集合时,仅重新计算新集合的签名,避免重复劳动
  2. LSH快速筛选候选集:不需要和1亿个集合逐一比对,通过LSH将签名分组:
    • 把MinHash签名拆分为b个连续块,对每个块计算哈希值,将签名存入对应哈希表
    • 目标集合生成签名后,仅需与同一哈希桶内的候选集合比对,直接将计算量从1亿级压缩到千级甚至百级

实现细节

1. 生成MinHash签名

构造k个独立的32位哈希函数(比如基于大质数的线性哈希),对每个集合的元素计算每个哈希函数的最小值:

def generate_minhash_signature(hash_set, k, primes):
    signature = []
    for prime in primes:
        min_val = 2**32  # 32位哈希的最大值
        for h in hash_set:
            # 简单构造的独立哈希函数,可替换为更高效的实现
            hash_val = (h * prime) % (2**32)
            if hash_val < min_val:
                min_val = hash_val
        signature.append(min_val)
    return signature

注:primes需选择k个不同的大质数,确保哈希函数的独立性

2. LSH候选集筛选

将每个MinHash签名拆分为b个块,对每个块计算哈希值并存储到哈希表中:

def build_lsh_index(signatures, b, k):
    block_size = k // b
    lsh_index = [dict() for _ in range(b)]
    for idx, sig in enumerate(signatures):
        for block_idx in range(b):
            block = tuple(sig[block_idx*block_size : (block_idx+1)*block_size])
            if block not in lsh_index[block_idx]:
                lsh_index[block_idx][block] = []
            lsh_index[block_idx][block].append(idx)
    return lsh_index

def get_candidates(target_sig, lsh_index, b, k):
    block_size = k // b
    candidates = set()
    for block_idx in range(b):
        block = tuple(target_sig[block_idx*block_size : (block_idx+1)*block_size])
        if block in lsh_index[block_idx]:
            candidates.update(lsh_index[block_idx][block])
    return candidates

拿到候选集后,仅需计算目标签名与候选签名的匹配比例,即可得到近似Jaccard值。

性能优势

  • 原方法:每次成对计算需遍历集合求交集,时间复杂度O(n+m)(n、m为集合大小),1亿次计算完全无法在笔记本上完成
  • MinHash+LSH:预计算签名的时间复杂度为O(Nks)(N为已知集合数,s为集合平均大小),后续每次匹配仅需O(k + t)(t为候选集大小),性能提升至少100倍以上,完全满足你的定期重复计算需求

内容的提问来源于stack exchange,提问作者Some Java Programmer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 05:34:53