相似度计算全攻略:从理论到Python实战

目录

一、基于向量的相似度

1. 余弦相似度(Cosine Similarity)

2. 点积(Dot Product)

3. 欧氏距离(Euclidean Distance)

4. 曼哈顿距离(Manhattan Distance)

二、基于集合的相似度

1. Jaccard 相似系数(Jaccard Index)

2. 余弦相似度的集合扩展

三、基于统计的相似度

1. 皮尔逊相关系数(Pearson Correlation)

2. 斯皮尔曼秩相关系数(Spearman's Rank Correlation)

四、基于概率分布的相似度

1. KL散度(Kullback-Leibler Divergence)

2. JS散度(Jensen-Shannon Divergence)

五、特殊场景的相似度

1. 汉明距离(Hamming Distance)

2. 编辑距离(Levenshtein Distance)

六、代码示例(Python)

总结:如何选择相似度方法?


 

相似度计算是数据分析和机器学习中的基础任务,广泛应用于推荐系统、聚类分析、自然语言处理等领域。以下是常见的相似度计算方式,按类型分类并详细说明:


一、基于向量的相似度

1. 余弦相似度(Cosine Similarity)
  • 公式
    cos⁡(θ)=A⋅B∥A∥∥B∥cos(θ)=∥A∥∥B∥A⋅B​

  • 特点

    • 取值范围:[-1, 1],值越大越相似。

    • 仅关注向量方向,忽略长度差异。

  • 适用场景

    • 文本相似度(TF-IDF、词向量)。

    • 高维稀疏数据(如用户行为向量)。

2. 点积(Dot Product)
  • 公式
    A⋅B=∑i=1nAiBiA⋅B=∑i=1n​Ai​Bi​

  • 特点

    • 结果受向量长度影响,未归一化。

    • 与余弦相似度的关系:点积 = 余弦相似度 × 向量长度的乘积。

  • 适用场景

    • 需要显式考虑向量长度的场景(如推荐系统的评分预测)。

3. 欧氏距离(Euclidean Distance)
  • 公式
    d(A,B)=∑i=1n(Ai−Bi)2d(A,B)=∑i=1n​(Ai​−Bi​)2

  • 特点

    • 值越小越相似,是几何空间中的直线距离。

    • 对量纲敏感,需标准化数据。

  • 适用场景

    • 图像特征匹配(如像素差值)。

    • 聚类分析(K-Means)。

4. 曼哈顿距离(Manhattan Distance)
  • 公式
    d(A,B)=∑i=1n∣Ai−Bi∣d(A,B)=∑i=1n​∣Ai​−Bi​∣

  • 特点

    • 计算各维度绝对差之和,类似城市街区行走距离。

  • 适用场景

    • 离散型数据(如分类特征编码后的距离计算)。


二、基于集合的相似度

1. Jaccard 相似系数(Jaccard Index)
  • 公式
    J(A,B)=∣A∩B∣∣A∪B∣J(A,B)=∣A∪B∣∣A∩B∣​

  • 特点

    • 衡量两个集合的交集与并集的比例。

    • 取值范围:[0, 1],值越大越相似。

  • 适用场景

    • 用户标签匹配(如社交网络兴趣相似度)。

    • 文档去重(Shingling算法)。

2. 余弦相似度的集合扩展
  • 将集合表示为二进制向量(存在为1,否则为0),再计算余弦相似度。

  • 与Jaccard相似度的区别:Jaccard忽略元素出现次数,余弦可处理加权集合。


三、基于统计的相似度

1. 皮尔逊相关系数(Pearson Correlation)
  • 公式
    r(A,B)=∑(Ai−Aˉ)(Bi−Bˉ)∑(Ai−Aˉ)2∑(Bi−Bˉ)2r(A,B)=∑(Ai​−Aˉ)2

​∑(Bi​−Bˉ)2

  • ​∑(Ai​−Aˉ)(Bi​−Bˉ)​

  • 特点

    • 衡量两个变量的线性相关性,取值范围:[-1, 1]。

    • 去中心化后的余弦相似度。

  • 适用场景

    • 基因表达相关性分析。

    • 用户评分趋势相似性(如电影推荐)。

2. 斯皮尔曼秩相关系数(Spearman's Rank Correlation)
  • 特点

    • 基于变量排序的非参数相关性度量。

    • 对异常值鲁棒,但丢失原始数值信息。

  • 适用场景

    • 非线性但单调的关系(如用户满意度排名)。


四、基于概率分布的相似度

1. KL散度(Kullback-Leibler Divergence)
  • 公式
    DKL(P∥Q)=∑P(x)log⁡P(x)Q(x)DKL​(P∥Q)=∑P(x)logQ(x)P(x)​

  • 特点

    • 衡量两个概率分布的非对称差异。

    • 非对称性:DKL(P∥Q)≠DKL(Q∥P)DKL​(P∥Q)=DKL​(Q∥P)。

  • 适用场景

    • 语言模型评估(如比较文本生成分布)。

    • 信息检索中的查询模型匹配。

2. JS散度(Jensen-Shannon Divergence)
  • 公式
    DJS(P∥Q)=12DKL(P∥M)+12DKL(Q∥M)DJS​(P∥Q)=21​DKL​(P∥M)+21​DKL​(Q∥M)
    其中 M=P+Q2M=2P+Q​。

  • 特点

    • 对称化的KL散度,取值范围:[0, 1]。

  • 适用场景

    • 生成对抗网络(GAN)中分布差异度量。


五、特殊场景的相似度

1. 汉明距离(Hamming Distance)
  • 定义:两个等长字符串在相同位置上不同字符的数量。

  • 适用场景

    • 纠错编码(如网络传输校验)。

    • DNA序列比对。

2. 编辑距离(Levenshtein Distance)
  • 定义:将一个字符串转换为另一个字符串所需的最少单字符编辑(插入、删除、替换)次数。

  • 适用场景

    • 拼写纠错(如搜索引擎建议)。

    • 生物信息学中的序列比对。


六、代码示例(Python)

import numpy as np
from scipy.spatial.distance import euclidean, jaccard
from scipy.stats import pearsonr

# 示例向量
A = np.array([1, 2, 3])
B = np.array([4, 5, 6])

# 余弦相似度
cos_sim = np.dot(A, B) / (np.linalg.norm(A) * np.linalg.norm(B))

# 欧氏距离
euclidean_dist = euclidean(A, B)

# Jaccard相似度(需转换为二进制向量)
A_bin = (A > 0).astype(int)
B_bin = (B > 0).astype(int)
jaccard_sim = 1 - jaccard(A_bin, B_bin)

# 皮尔逊相关系数
pearson_corr, _ = pearsonr(A, B)

print(f"Cosine: {cos_sim:.2f}, Euclidean: {euclidean_dist:.2f}")
print(f"Jaccard: {jaccard_sim:.2f}, Pearson: {pearson_corr:.2f}")

 


总结:如何选择相似度方法?

场景推荐方法
文本/高维稀疏数据余弦相似度
数值型数据(需几何距离)欧氏距离
集合或标签匹配Jaccard相似度
线性相关性分析皮尔逊相关系数
概率分布差异KL散度或JS散度
字符串或序列差异汉明距离或编辑距离

根据数据特性(如维度、稀疏性、分布类型)和任务目标(如相似性排序、聚类、相关性分析)选择合适的方法,必要时可结合归一化或降维预处理。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

gorgor在码农

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值