余弦相似度如何衡量高维向量的接近度
#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 ← 认为它们"完全一致"(方向相同)
在语义理解中,我们更关心“意思是否一致“(方向),而不是“表达长短“(长度)。
七、核心要点总结
为什么余弦相似度能衡量高维向量?
- 数学原理:向量夹角的概念在任意维度都成立
- 语义映射:相似文本在高维空间中方向接近
- 归一化特性:只看方向,消除长度干扰
- 训练学习:模型预训练时已经把语义信息编码进这些维度
高维向量的本质
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万维)下的数学原理完全相同,只是维度越高,我们越无法直观可视化,但计算机可以轻松处理。