2.3 相似度算法详解:Cosine Similarity 与 Euclidean Distance

目录

一、基本概念

二、余弦相似度 (Cosine Similarity)

[2.1 数学定义](#2.1 数学定义)

[2.2 核心特性](#2.2 核心特性)

[2.3 直观理解](#2.3 直观理解)

[2.4 应用场景](#2.4 应用场景)

[2.5 Python实现示例](#2.5 Python实现示例)

三、欧氏距离 (Euclidean Distance)

[3.1 数学定义](#3.1 数学定义)

[3.2 核心特性](#3.2 核心特性)

[3.3 直观理解](#3.3 直观理解)

[3.4 应用场景](#3.4 应用场景)

[3.5 Python实现示例](#3.5 Python实现示例)

四、对比分析

[4.1 关键差异](#4.1 关键差异)

[4.2 实际例子对比](#4.2 实际例子对比)

[4.3 数学关系](#4.3 数学关系)

五、实际应用选择指南

[5.1 何时使用余弦相似度?](#5.1 何时使用余弦相似度?)

[5.2 何时使用欧氏距离?](#5.2 何时使用欧氏距离?)

[5.3 混合使用策略](#5.3 混合使用策略)

六、高级话题

[6.1 计算优化](#6.1 计算优化)

[6.2 变种与扩展](#6.2 变种与扩展)

[6.3 实际系统中的应用](#6.3 实际系统中的应用)

七、总结


一、基本概念

在机器学习和信息检索中,文本、图像、用户偏好等数据常被表示为向量,形成向量空间。相似度算法用于衡量这些向量之间的"接近程度"或"相似程度"。

二、余弦相似度 (Cosine Similarity)

2.1 数学定义

余弦相似度通过测量两个向量夹角的余弦值来评估其相似性:

2.2 核心特性

  • 范围:[-1, 1] 或 [0, 1](非负向量时)

  • 方向敏感,大小不敏感:只关注向量方向,忽略长度(幅度)

  • 归一化效果:自动处理不同长度的向量

2.3 直观理解

想象两个箭头从原点出发:

  • 夹角为0°时,cos=1(完全相同方向)

  • 夹角为90°时,cos=0(完全不相关)

  • 夹角为180°时,cos=-1(完全相反)

2.4 应用场景

  1. 文本相似度:TF-IDF向量比较

  2. 推荐系统:用户/物品的嵌入向量

  3. 信息检索:查询与文档的匹配度

  4. 高维稀疏数据:如词袋模型

2.5 Python实现示例

python 复制代码
import numpy as np
from numpy.linalg import norm

def cosine_similarity(a, b):
    """计算余弦相似度"""
    return np.dot(a, b) / (norm(a) * norm(b))

# 示例
vector1 = np.array([1, 2, 3])
vector2 = np.array([4, 5, 6])
print(f"余弦相似度: {cosine_similarity(vector1, vector2):.4f}")

三、欧氏距离 (Euclidean Distance)

3.1 数学定义

欧氏距离是n维空间中两点间的直线距离:

3.2 核心特性

  • 范围:[0, +∞)

  • 大小敏感:同时考虑方向和幅度差异

  • 满足距离公理:非负性、对称性、三角不等式

3.3 直观理解

在二维平面上,就是两点间的直线距离。在多维空间中,是"最短路径"的几何距离。

3.4 应用场景

  1. 聚类分析:K-means、DBSCAN

  2. 图像处理:像素值比较

  3. 物理测量:实际空间距离

  4. 异常检测:距离质心的远近

3.5 Python实现示例

python 复制代码
def euclidean_distance(a, b):
    """计算欧氏距离"""
    return np.sqrt(np.sum((a - b)**2))

# 示例
vector1 = np.array([1, 2, 3])
vector2 = np.array([4, 5, 6])
print(f"欧氏距离: {euclidean_distance(vector1, vector2):.4f}")

四、对比分析

4.1 关键差异

特性 余弦相似度 欧氏距离
关注点 方向相似性 绝对距离
缩放不变性 ✅ 是 ❌ 否
取值范围 [-1, 1] [0, ∞)
计算复杂度 O(n) O(n)
对稀疏数据 表现更好 可能不佳

4.2 实际例子对比

考虑三个文档的词频向量:

bash 复制代码
文档A: [2, 3, 1]  # "apple banana apple cherry"
文档B: [4, 6, 2]  # 同主题但更长
文档C: [1, 0, 5]  # 不同主题

余弦相似度

  • A与B:1.0(完全相似,仅长度不同)

  • A与C:较低的值

欧氏距离

  • A与B:5.48(距离较大,因长度差异)

  • A与C:5.10

4.3 数学关系

当向量归一化后(长度为1),两者存在关系:

五、实际应用选择指南

5.1 何时使用余弦相似度?

  • 文本分析:TF-IDF、词嵌入

  • 忽略幅度差异的场景:如用户评分模式相似性

  • 高维稀疏数据:大多数维度为0

  • 关注角度而非距离:方向比大小更重要

5.2 何时使用欧氏距离?

  • 物理空间测量:地理位置、图像像素

  • 聚类算法:K-means、层次聚类

  • 异常检测:与正常点的距离

  • 大小和方向都重要的场合

5.3 混合使用策略

在实际系统中,常根据需求组合使用:

  1. 预处理归一化后使用欧氏距离

  2. 多指标融合:同时考虑两种度量

  3. 层级筛选:先用余弦快速筛选,再用欧氏精排

六、高级话题

6.1 计算优化

  • 大规模数据:使用近似算法(SimHash for Cosine,Product Quantization for Euclidean)

  • 稀疏向量:仅计算非零维度

  • 分布式计算:MapReduce实现

6.2 变种与扩展

  1. 调整余弦相似度:考虑用户评分偏差

  2. 马氏距离:考虑特征相关性的欧氏扩展

  3. 曼哈顿距离:另一种距离度量

  4. Jaccard相似度:集合相似度的特殊形式

6.3 实际系统中的应用

python 复制代码
# 综合应用示例:文档检索系统
def hybrid_similarity(doc1, doc2, alpha=0.7):
    """结合余弦相似度和归一化欧氏距离"""
    cos_sim = cosine_similarity(doc1, doc2)
    
    # 归一化向量
    norm1 = doc1 / norm(doc1)
    norm2 = doc2 / norm(doc2)
    euclidean_dist = euclidean_distance(norm1, norm2)
    
    # 欧氏距离转换为相似度(0到1)
    euclidean_sim = 1 / (1 + euclidean_dist)
    
    # 加权组合
    return alpha * cos_sim + (1 - alpha) * euclidean_sim

七、总结

余弦相似度和欧氏距离是向量空间中最基础且最重要的相似度度量方法:

  1. 余弦相似度更适合衡量"模式相似性",特别是当数据幅度不重要或需要标准化处理时

  2. 欧氏距离更适合衡量"实际距离",特别是当所有维度都有意义且尺度相同时

  3. 选择关键在于理解数据特性和业务需求:

    • 文本/推荐系统 → 通常选余弦

    • 图像/物理测量 → 通常选欧氏

    • 不确定时 → 实验验证哪种更好

  4. 实际应用中,理解数据的归一化需求、维度特性和业务目标是做出正确选择的关键。

这两种度量各有优势,在复杂系统中常常配合使用,形成互补的评估体系,为机器学习模型和检索系统提供强大的相似度判断能力。

相关推荐
Remember_9932 小时前
【LeetCode精选算法】滑动窗口专题一
java·数据结构·算法·leetcode·哈希算法
小饼干超人3 小时前
详解向量数据库中的PQ算法(Product Quantization)
人工智能·算法·机器学习
你撅嘴真丑3 小时前
第四章 函数与递归
算法·uva
漫随流水3 小时前
leetcode回溯算法(77.组合)
数据结构·算法·leetcode·回溯算法
玄冥剑尊3 小时前
动态规划入门
算法·动态规划·代理模式
mjhcsp3 小时前
P14987 全等(mjhcsp)
算法·题解·洛谷
(❁´◡`❁)Jimmy(❁´◡`❁)3 小时前
Atcoder abc441A~F 题解
算法·深度优先·图论
少林码僧4 小时前
2.30 传统行业预测神器:为什么GBDT系列算法在企业中最受欢迎
开发语言·人工智能·算法·机器学习·ai·数据分析
豆沙沙包?4 小时前
2026年--Lc343-1926. 迷宫中离入口最近的出口(图 - 广度优先搜索)--java版
java·算法·宽度优先