余弦相似度如何衡量高维向量的接近度

#2025/12/30 #ai

目录

一、从二维到多维的理解

1. 二维平面的余弦相似度(你之前学过的)

在二维平面上,余弦相似度就是两个向量夹角的余弦值

向量A = (3, 4)  
向量B = (6, 8)  

     B (6,8)  
    /  
   / θ 夹角  
  /_____ A (3,4)  
原点  

cos(θ) = A·B / (|A| × |B|)  
       = (3×6 + 4×8) / (√(3²+4²) × √(6²+8²))  
       = 50 / (5 × 10)  
       = 1  ← 完全相同方向  

关键点

  • θ = 0° → cos(θ) = 1(方向完全相同)
  • θ = 90° → cos(θ) = 0(垂直,无关)
  • θ = 180° → cos(θ) = -1(方向完全相反)

2. 多维空间的余弦相似度(嵌入向量的场景)

本质完全相同!只是从2维扩展到768维(或更多维):

# 768维向量示例  
向量A = [0.23, -0.45, 0.67, ..., 0.12]  # 共768个数字  
向量B = [0.25, -0.43, 0.68, ..., 0.10]  # 共768个数字  

# 计算公式完全一样  
cos(θ) = (A₁B₁ + A₂B₂ + ... + A₇₆₈B₇₆₈) / (|A| × |B|)  

为什么可以这样?

因为数学上的“向量空间“概念可以无限扩展维度,余弦相似度的定义在任意维度下都成立。


二、余弦相似度的数学本质

核心公式

$$
\text{余弦相似度} = \frac{\mathbf{A} \cdot \mathbf{B}}{||\mathbf{A}|| \times ||\mathbf{B}||} = \frac{\sum_{i=1}^{n} A_i B_i}{\sqrt{\sum_{i=1}^{n} A_i^2} \times \sqrt{\sum_{i=1}^{n} B_i^2}}
$$

三个部分

部分含义计算方式
分子:点积两个向量在各维度的“相似程度累加“A₁B₁ + A₂B₂ + … + AₙBₙ
分母:长度乘积归一化,消除向量长度的影响√(A₁²+A₂²+…+Aₙ²) × √(B₁²+B₂²+…+Bₙ²)
结果:夹角余弦取值 -1 到 1,只看方向不看长度cos(θ)

三、为什么高维也能“接近“?

关键理解:维度 = 特征维度

以文本嵌入为例:

"Best movie ever!" 转成768维向量:  
[0.23, -0.45, 0.67, ..., 0.12]  
 ↓      ↓      ↓          ↓  
维度1  维度2  维度3  ... 维度768  

每个维度可能代表某种抽象特征:  
- 维度1:情感极性?  
- 维度2:主题相关性?  
- 维度3:语气强度?  
- ...  

相似的文本在这768维空间中会“聚集在一起“

高维空间示意(简化到3维理解):  

        正面评论区域  
       /  "Great!" (0.8, 0.2, 0.1)  
      /   "Best!" (0.7, 0.3, 0.1)  
     /_________________  
    原点  
     \  
      \   "Terrible" (-0.7, -0.2, 0.1)  
       \  "Awful" (-0.8, -0.3, 0.1)  
        负面评论区域  

余弦相似度衡量的就是它们在这个高维空间中的“方向一致性“


四、实际例子:文本相似度计算

场景:判断两条评论是否相似

from sklearn.metrics.pairwise import cosine_similarity  

# 1. 两条评论转成768维向量  
review1 = "Best movie ever!"  → 向量A (768维)  
review2 = "Great film!"       → 向量B (768维)  
review3 = "Terrible movie"    → 向量C (768维)  

# 2. 计算余弦相似度  
cos_sim(A, B) = 0.92  ← 很相似(正面+正面)  
cos_sim(A, C) = 0.08  ← 不相似(正面+负面)  

为什么768维能判断相似?

因为模型训练时学到了:“正面评论“的768个特征倾向于某种模式,“负面评论“是另一种模式。


五、多维空间的直观理解

类比:从平面地图到立体世界

维度类比特点
2维平面地图上的两个点可以画出来
3维立体空间中的两个点还能想象
768维一个有768个坐标轴的“超空间“无法可视化,但数学上完全成立

关键认知

  • 我们人类只能直观感知3维
  • 但数学上,1万维和2维没有本质区别
  • 计算机在高维空间中计算余弦相似度,跟在2维平面上一样简单

六、为什么不用欧氏距离?

在高维空间中,余弦相似度比欧氏距离更适合衡量语义相似性

方法关注点问题
欧氏距离两点之间的直线距离高维空间中会受“维度灾难“影响
余弦相似度两向量的方向只看方向,不受向量长度影响

例子

短评:"好"     → 向量 [0.5, 0.5]   
长评:"非常好" → 向量 [1.0, 1.0]  

欧氏距离 = 0.71  ← 认为它们"有点远"  
余弦相似度 = 1.0 ← 认为它们"完全一致"(方向相同)  

在语义理解中,我们更关心“意思是否一致“(方向),而不是“表达长短“(长度)。


七、核心要点总结

为什么余弦相似度能衡量高维向量?

  1. 数学原理:向量夹角的概念在任意维度都成立
  2. 语义映射:相似文本在高维空间中方向接近
  3. 归一化特性:只看方向,消除长度干扰
  4. 训练学习:模型预训练时已经把语义信息编码进这些维度

高维向量的本质

768维向量 = 768个特征的组合  
不是"很多个2维平面的叠加"  
而是"一个有768个坐标轴的超空间中的一个点"  

实际应用中的意义

  • 值接近 1:语义高度相似(“Best movie” vs “Great film”)
  • 值接近 0:语义无关(“Movie review” vs “Math equation”)
  • 值接近 -1:语义相反(“Love it” vs “Hate it”)

一句话总结

余弦相似度通过计算高维空间中两个向量的夹角,衡量它们的方向一致性,这种方法在任意维度(2维、768维、1万维)下的数学原理完全相同,只是维度越高,我们越无法直观可视化,但计算机可以轻松处理。