相似度计算算法系统性总结
相似度计算算法系统性总结
一、基于数值/向量的相似度算法
1. 余弦相似度(Cosine Similarity)
原理:计算两个向量夹角的余弦值,衡量方向一致性。
cos(θ)=A⋅B∥A∥∥B∥\text{cos}(\theta) = \frac{\mathbf{A} \cdot \mathbf{B}}{\|\mathbf{A}\| \|\mathbf{B}\|}cos(θ)=∥A∥∥B∥A⋅B
优点:
- 对向量长度不敏感,适合高维稀疏数据(如文本TF-IDF向量)
- 计算稳定,结果在 [−1,1][-1, 1][−1,1],通常归一化到 [0,1][0, 1][0,1]
缺点:
- 忽略向量大小(模长),无法反映绝对差异
- 无法处理评分偏置(如用户A习惯打高分,B习惯打低分)
适用场景:文本相似度、推荐系统、信息检索
2. 皮尔逊相关系数(Pearson Correlation Coefficient, PCC)
原理:衡量两个变量的线性相关性,基于协方差与标准差。
r=cov(X,Y)σXσYr = \frac{\text{cov}(X,Y)}{\sigma_X \sigma_Y}r=σXσYcov(X,Y)
优点:
- 自动中心化(减去均值),消除用户评分偏置
- 能捕捉线性趋势
缺点:
- 仅适用于线性关系
- 对异常值敏感,要求数据近似正态分布
适用场景:协同过滤推荐系统、金融数据分析
3. 欧几里得距离(Euclidean Distance)
原理:两点间的直线距离。
d=∑(xi−yi)2d = \sqrt{\sum (x_i - y_i)^2}d=∑(xi−yi)2
优点:直观、几何意义明确
缺点:
- 对维度敏感(“维度灾难”)
- 未考虑方向,仅反映绝对距离
适用场景:低维空间聚类、图像像素比较
4. 曼哈顿距离(Manhattan Distance)
原理:各维度差值的绝对值之和。
d=∑∣xi−yi∣d = \sum |x_i - y_i|d=∑∣xi−yi∣
优点:计算简单,对噪声鲁棒性略强于欧氏距离
缺点:同样受维度影响,不适用于高维稀疏数据
适用场景:网格路径规划、特征选择
二、基于集合的相似度算法
5. 杰卡德相似度(Jaccard Similarity)
原理:交集与并集之比。
J(A,B)=∣A∩B∣∣A∪B∣J(A,B) = \frac{|A \cap B|}{|A \cup B|}J(A,B)=∣A∪B∣∣A∩B∣
优点:
- 适用于二值或集合数据(如标签、关键词)
- 计算简单直观
缺点:
- 忽略元素频率(只看是否出现)
- 对小集合敏感(如两个集合都为空,结果未定义)
适用场景:文本去重、用户兴趣标签匹配、图像分割评估(IoU)
6. Sørensen–Dice 系数
原理:
D=2∣A∩B∣∣A∣+∣B∣D = \frac{2|A \cap B|}{|A| + |B|}D=∣A∣+∣B∣2∣A∩B∣
优点:对小集合更友好,重叠比例直观
缺点:与Jaccard类似,忽略频率;对不平衡集合有偏
适用场景:生物信息学、医学图像分割
7. Tanimoto 系数(广义Jaccard)
原理(适用于实数向量):
T=A⋅B∥A∥2+∥B∥2−A⋅BT = \frac{\mathbf{A} \cdot \mathbf{B}}{\|\mathbf{A}\|^2 + \|\mathbf{B}\|^2 - \mathbf{A} \cdot \mathbf{B}}T=∥A∥2+∥B∥2−A⋅BA⋅B
优点:
- 支持非二值数据,适合稀疏向量
- 在化学/生物信息学中效果好
缺点:对噪声敏感,计算复杂度较高
适用场景:分子结构相似性、文档相似度(带权重)
三、基于信息论的相似度
8. 互信息(Mutual Information, MI)
原理:衡量两个变量共享的信息量。
I(X;Y)=∑x,yp(x,y)logp(x,y)p(x)p(y)I(X;Y) = \sum_{x,y} p(x,y) \log \frac{p(x,y)}{p(x)p(y)}I(X;Y)=x,y∑p(x,y)logp(x)p(y)p(x,y)
优点:可捕捉非线性依赖关系
缺点:需估计概率分布,数据稀疏时不准
适用场景:特征选择、文本共现分析
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
