相似性算法
前言:
相似性算法用于衡量两个对象(如文本、图像、向量等)之间的相似程度,广泛应用于搜索、推荐、聚类、自然语言处理等领域。
基于向量的相似性算法
适用于将对象表示为向量(如词向量、特征向量)后的相似度计算。
余弦相似度(Cosine Similarity)
- 公式:计算两个向量的夹角余弦值,范围
[-1, 1]
,值越大越相似。
- 特点:
- 忽略向量长度,适合文本相似性(如TF-IDF、词向量)
- 几何上表示两向量间的夹角
- 值域为[-1,1],1表示完全相似,-1表示完全相反
- 应用:
- 文档检索、用户画像匹配
- 推荐系统中的用户/物品相似度计算
- 文本聚类和分类任务
欧氏距离(Euclidean Distance)
- 公式:向量间的几何距离,值越小越相似。
- 特点:
- 对数值绝对大小敏感,适合低维空间(如图像特征)
- 满足距离度量的三个基本性质:非负性、同一性、对称性、三角不等式
- 在高维空间中可能失效(维度诅咒)
- 应用:
- KNN、聚类、异常检测
- 图像处理和计算机视觉
- 机器学习中的特征空间距离计算
点积相似度(Dot Product)
- 公式:向量内积,受向量长度影响。
- 特点:
- 结果与向量的模长和夹角有关:
- 若向量已归一化,则点积等于余弦相似度
- 对向量长度敏感,不适合直接用于比较不同尺度的向量
- 结果与向量的模长和夹角有关:
- 应用:
- 推荐系统中的矩阵分解(如隐语义模型)
- 神经网络中的权重计算
- 向量空间模型中的相似性初筛
曼哈顿距离(Manhattan Distance)
- 公式:各维度绝对差之和。
- 特点:
- 对异常值不敏感,适合高维稀疏数据
- 几何上等价于“城市街区”距离(只能沿坐标轴移动)
- 比欧氏距离更鲁棒,常用于文本、特征工程
- 应用:
- KNN 算法中的距离度量
- 文本分类、推荐系统
- 高维空间下的聚类分析
基于集合的相似性算法
适用于集合(如用户兴趣标签、关键词集合)的相似度计算。
Jaccard 相似度
- 公式:计算两个集合交集大小与并集大小的比值,范围
[0, 1]
,值越大越相似。
- 特点:
- 只关注元素是否出现,不考虑频率或顺序
- 对集合大小敏感,适合稀疏数据(如标签、关键词)
- 当两个集合完全相同时,值为 1;无交集时为 0
- 应用:
- 文本相似性(如关键词集合比较)
- 推荐系统中的用户兴趣匹配
- 聚类分析(如基于标签的聚类)
- 信息检索中的文档去重
重叠系数(Overlap Coefficient)
- 公式:计算两个集合交集大小与较小集合大小的比值,范围
[0, 1]
,值越大越相似。
- 特点:
- 只关注元素是否出现,不考虑频率或顺序
- 对集合大小差异敏感,适合比较大小不同的集合
- 当一个集合完全包含另一个时,值为 1;无交集时为 0
- 与 Jaccard 不同,它不会因并集变大而降低得分
- 应用:
- 用户兴趣标签匹配(如小众用户 vs 大众用户)
- 文本关键词重合度分析
- 生物信息学中的基因集合比较
- 推荐系统中冷启动用户的相似性评估
基于字符串的相似性算法
用于文本、序列的相似性比较。
编辑距离(Levenshtein Distance)
- 定义:将一个字符串转换为另一个所需的最少单字符编辑(插入、删除、替换)次数。
- 特点:
- 满足距离度量的所有性质
- 计算复杂度较高,为O(mn)
- 对字符串的局部变化敏感
- 应用:
- 拼写纠错、DNA序列比对
- 数据清洗和去重
- 代码相似度检测
Jaro-Winkler 距离
- 特点:
- 考虑字符顺序和前缀匹配,适合短文本(如人名匹配)
- 对字符串开头的匹配给予更高权重
- 结果范围在
[0,1]
之间,1表示完全匹配
- 应用:
- 记录链接和数据去重
- 姓名和地址匹配
- 数据库清洗
最长公共子序列(LCS)
- 定义:两个序列共有的最长子序列长度。
- 特点:
- 不要求连续,但保持相对顺序
- 常用于衡量序列相似性
- 可以通过动态规划高效计算
- 应用:
- 版本控制(如代码差异比较)
- 生物信息学中的序列比对
- 文本相似性分析
基于概率分布的相似性算法
用于比较概率分布(如语言模型、生成数据)。
KL 散度(Kullback-Leibler Divergence)
- 公式:衡量分布
相对于分布 的信息损失,非对称,值越大表示差异越大。
- 特点:
- 非对称性:
- 非负性:
,当且仅当 时等于 0 - 不是距离度量(不满足对称性和三角不等式)
- 可解释为“用 Q 来编码 P 所需的额外比特数”
- 非对称性:
- 应用:
- 信息检索中的文档相似性评估
- 模型拟合优度(如训练模型与真实分布的差距)
- 生成模型(如变分自编码器 VAE、GAN 中的判别器)
- 自然语言处理中的语言模型比较
JS 散度(Jensen-Shannon Divergence)
- 特点:
- KL 散度的对称化版本,范围
[0, 1]
- 满足对称性,是对衡量分布差异更好的选择
- 基于KL散度定义,保持了良好的理论性质
- KL 散度的对称化版本,范围
- 应用:
- 分布相似性度量
- 聚类分析中的距离计算
- 生成模型评估
交叉熵(Cross-Entropy)
- 公式:衡量两个概率分布
和 之间的差异,常用于分类任务的损失函数。
- 特点:
- 非对称性:
- 当
时,交叉熵最小(等于 ,即 的熵) - 可解释为“用分布
来编码来自分布 的数据所需的平均比特数” - 在深度学习中,常作为分类模型的损失函数(如 softmax + cross-entropy)
- 非对称性:
- 应用:
- 分类模型训练(如神经网络、逻辑回归)
- 语言模型评估
- 生成模型中的目标函数
- 信息检索中的排序优化
基于深度学习的相似性算法
利用神经网络提取高阶特征后计算相似度。
Siamese Networks
- 特点:
- 双塔结构共享权重,输出隐向量计算相似度
- 通过端到端训练学习相似性度量
- 可以处理各种类型的数据(图像、文本等)
- 应用:
- 人脸识别、签名验证
- 问答系统中的答案选择
- 推荐系统中的用户/物品匹配
Sentence-BERT
- 特点:
- BERT模型微调后生成句向量,计算余弦相似度
- 解决了BERT直接计算句向量效果不佳的问题
- 比原始BERT计算效率更高
- 应用:
- 语义搜索、问答系统
- 文本聚类和分类
- 语义文本相似性任务
Contrastive Loss
- 目标:
- 拉近相似样本的向量距离,推开不相似样本
- 通过损失函数直接优化相似性度量
- 应用:
- 表征学习
- 人脸识别和验证
- 无监督和自监督学习
其他专用算法
Pearson相关系数
- 特点:
- 衡量线性相关性,范围
[-1, 1]
- 对变量的线性变换具有不变性
- 衡量线性相关性,范围
- 应用:
- 用户评分预测
- 特征选择和相关性分析
SimHash
- 特点:
- 局部敏感哈希(LSH)的一种,用于海量文本去重
- 将相似文本映射到相近的哈希值
- 计算效率高,适合大规模应用
- 应用:
- 网页和文档去重
- 抄袭检测
- 大规模相似性搜索
Word Mover’s Distance
- 特点:
- 基于词嵌入的文档距离度量
- 考虑词语间的语义相似性
- 计算复杂度较高但语义效果好
- 应用:
- 文档相似性计算
- 短文本匹配
- 语义搜索
选择依据
- 数据类型
- 文本(编辑距离/Jaccard)
- 向量(余弦/欧氏)
- 分布(KL散度)
- 集合(Jaccard/重叠系数)
- 计算效率
- 编辑距离较慢,Jaccard适合大规模集合
- 近似算法可提升大规模计算效率
- 语义需求
- 深度学习模型能捕捉语义,但需要训练成本
- 传统方法计算快但语义表达能力有限