相似度计算算法系统性总结
一、基于数值/向量的相似度算法
1. 余弦相似度(Cosine Similarity)
原理:计算两个向量夹角的余弦值,衡量方向一致性。
优点:
对向量长度不敏感,适合高维稀疏数据(如文本TF-IDF向量)计算稳定,结果在
[
−
1
,
1
]
[-1, 1]
[−1,1],通常归一化到
[
0
,
1
]
[0, 1]
[0,1]
缺点:
忽略向量大小(模长),无法反映绝对差异无法处理评分偏置(如用户A习惯打高分,B习惯打低分)
适用场景:文本相似度、推荐系统、信息检索
2. 皮尔逊相关系数(Pearson Correlation Coefficient, PCC)
原理:衡量两个变量的线性相关性,基于协方差与标准差。
优点:
自动中心化(减去均值),消除用户评分偏置能捕捉线性趋势
缺点:
仅适用于线性关系对异常值敏感,要求数据近似正态分布
适用场景:协同过滤推荐系统、金融数据分析
3. 欧几里得距离(Euclidean Distance)
原理:两点间的直线距离。
优点:直观、几何意义明确
缺点:
对维度敏感(“维度灾难”)未考虑方向,仅反映绝对距离
适用场景:低维空间聚类、图像像素比较
4. 曼哈顿距离(Manhattan Distance)
原理:各维度差值的绝对值之和。
优点:计算简单,对噪声鲁棒性略强于欧氏距离
缺点:同样受维度影响,不适用于高维稀疏数据
适用场景:网格路径规划、特征选择
二、基于集合的相似度算法
5. 杰卡德相似度(Jaccard Similarity)
原理:交集与并集之比。
优点:
适用于二值或集合数据(如标签、关键词)计算简单直观
缺点:
忽略元素频率(只看是否出现)对小集合敏感(如两个集合都为空,结果未定义)
适用场景:文本去重、用户兴趣标签匹配、图像分割评估(IoU)
6. Sørensen–Dice 系数
原理:
优点:对小集合更友好,重叠比例直观
缺点:与Jaccard类似,忽略频率;对不平衡集合有偏
适用场景:生物信息学、医学图像分割
7. Tanimoto 系数(广义Jaccard)
原理(适用于实数向量):
优点:
支持非二值数据,适合稀疏向量在化学/生物信息学中效果好
缺点:对噪声敏感,计算复杂度较高
适用场景:分子结构相似性、文档相似度(带权重)
三、基于信息论的相似度
8. 互信息(Mutual Information, MI)
原理:衡量两个变量共享的信息量。
优点:可捕捉非线性依赖关系
缺点:需估计概率分布,数据稀疏时不准
适用场景:特征选择、文本共现分析
9. KL散度 / 相对熵(Kullback–Leibler Divergence)
注意:不是对称相似度,而是分布差异度量
适用场景:语言模型评估、生成模型训练(如VAE)
四、文本专用相似度算法
10. TF-IDF + 余弦相似度
经典组合:将文本转为加权词向量后计算余弦
优点:简单有效,工业界广泛使用
缺点:忽略语义、词序、同义词
11. BM25
原理:改进的词频加权,考虑文档长度归一化
优点:比TF-IDF更适合搜索排序
适用场景:搜索引擎相关性排序
12. 语义嵌入相似度(BERT/SBERT等)
原理:用预训练语言模型生成句向量,再算余弦
优点:捕捉深层语义,支持上下文理解
缺点:计算开销大,需GPU加速
适用场景:问答匹配、语义搜索、智能客服
五、图像/音频相似度算法
| 类型 | 算法 | 特点 |
|---|---|---|
| 图像 | SSIM | 模拟人眼感知,优于MSE |
| 图像 | pHash / dHash | 快速去重,抗轻微变形 |
| 音频 | DTW(动态时间规整) | 对齐不同长度音频 |
| 音频 | MFCC + 余弦 | 提取声学特征后比较 |
六、大规模相似检索技术
MinHash + LSH:快速估算Jaccard相似度FAISS / Annoy / HNSW:高效近似最近邻搜索(ANN)SimHash:用于网页/文本去重
总结对比表
| 算法 | 数据类型 | 是否考虑大小 | 是否考虑顺序 | 是否处理稀疏 | 典型场景 |
|---|---|---|---|---|---|
| 余弦相似度 | 向量 | ❌(只方向) | ❌ | ✅ | 文本、推荐 |
| 皮尔逊相关 | 数值 | ✅(中心化) | ❌ | ⚠️ | 用户评分 |
| Jaccard | 集合 | ❌ | ❌ | ✅ | 标签、关键词 |
| Dice | 集合 | ❌ | ❌ | ✅ | 图像分割 |
| Tanimoto | 实数向量 | ✅ | ❌ | ✅ | 化学、文档 |
| TF-IDF+Cos | 文本 | ⚠️(加权) | ❌ | ✅ | 信息检索 |
| BERT相似度 | 文本 | ✅ | ✅ | ✅ | 语义匹配 |
| 欧氏距离 | 向量 | ✅ | ❌ | ❌ | 聚类、图像 |
选择建议
短文本/字符串匹配 → Levenshtein、Jaro-Winkler长文本/语义理解 → SBERT、TF-IDF+Cosine、BM25用户行为/评分数据 → 皮尔逊、修正余弦标签/集合数据 → Jaccard、Dice高维稀疏向量 → 余弦、Tanimoto大规模检索 → FAISS + Embedding 或 MinHash + LSH


