关于点积相似度和余弦相似度

引言

在向量空间中,相似度度量是机器学习、推荐系统、信息检索等领域的基础概念。其中,点积相似度(DotProductSimilarity)和余弦相似度(CosineSimilarity)是两种常用的方法。

基本概念回顾

向量定义

假设我们有两个向量a⃗\vec{a}a b⃗\vec{b}b ,它们在nnn维空间中:

  • a⃗=(a1,a2,…,an)\vec{a}=(a_1,a_2,\dots,a_n)a =(a1,a2,,an)
  • b⃗=(b1,b2,…,bn)\vec{b}=(b_1,b_2,\dots,b_n)b =(b1,b2,,bn)

向量的模(或范数)定义为:
∥a⃗∥=∑i=1nai2\|\vec{a}\|=\sqrt{\sum_{i=1}^{n}a_i^2}a =i=1nai2
∥b⃗∥=∑i=1nbi2\|\vec{b}\|=\sqrt{\sum_{i=1}^{n}b_i^2}b =i=1nbi2

向量间的夹角为θ\thetaθ,其中0≤θ≤180∘0\leq\theta\leq180^\circ0θ180

点积相似度

定义

点积(也称内积或标量积)是两个向量对应元素乘积的求和。它直接作为一种相似度度量,尤其在向量已归一化时。

点积公式:
a⃗⋅b⃗=∑i=1naibi\vec{a}\cdot\vec{b}=\sum_{i=1}^{n}a_ib_ia b =i=1naibi

几何解释

点积等于两个向量模的乘积乘以它们夹角的余弦:
a⃗⋅b⃗=∥a⃗∥∥b⃗∥cos⁡θ\vec{a}\cdot\vec{b}=\|\vec{a}\|\|\vec{b}\|\cos\thetaa b =a ∥∥b cosθ

  • 如果θ=0∘\theta=0^\circθ=0(向量同方向),cos⁡θ=1\cos\theta=1cosθ=1,点积最大。
  • 如果θ=90∘\theta=90^\circθ=90(垂直),cos⁡θ=0\cos\theta=0cosθ=0,点积为0。
  • 如果θ=180∘\theta=180^\circθ=180(反方向),cos⁡θ=−1\cos\theta=-1cosθ=1,点积最小(负值)。

点积考虑了向量的方向幅度。幅度大的向量即使方向相似,点积也较大。

计算过程

以二维向量为例:a⃗=(3,4)\vec{a}=(3,4)a =(3,4)b⃗=(1,2)\vec{b}=(1,2)b =(1,2)

  1. 计算对应元素乘积:3×1=33\times1=33×1=34×2=84\times2=84×2=8
  2. 求和:3+8=113+8=113+8=11
    所以,a⃗⋅b⃗=11\vec{a}\cdot\vec{b}=11a b =11

模:∥a⃗∥=32+42=25=5\|\vec{a}\|=\sqrt{3^2+4^2}=\sqrt{25}=5a =32+42 =25 =5∥b⃗∥=12+22=5≈2.236\|\vec{b}\|=\sqrt{1^2+2^2}=\sqrt{5}\approx2.236b =12+22 =5 2.236
夹角:cos⁡θ=11/(5×2.236)≈0.984\cos\theta=11/(5\times2.236)\approx0.984cosθ=11/(5×2.236)0.984θ≈10∘\theta\approx10^\circθ10

优缺点

  • 优点
    • 计算简单高效,时间复杂度O(n)O(n)O(n)
    • 保留幅度信息:在推荐系统中,如果用户偏好强度重要,点积能捕捉。
  • 缺点
    • 受向量幅度影响:幅度大的向量相似度高,即使方向不同。
    • 不归一化时,值域不固定(可正可负,可任意大),不便比较。
    • 在高维稀疏数据中,可能因幅度差异导致偏差。

应用场景

  • 神经网络中的注意力机制(Attention),如Transformer模型中使用点积计算查询和键的相似度。
  • 推荐系统:如矩阵分解中,用户-物品嵌入的点积表示偏好分数。
  • 信号处理:计算信号相关性。

余弦相似度

定义

余弦相似度是两个向量夹角余弦值,用于度量方向相似性,忽略幅度。

公式:
cos⁡θ=a⃗⋅b⃗∥a⃗∥∥b⃗∥\cos\theta=\frac{\vec{a}\cdot\vec{b}}{\|\vec{a}\|\|\vec{b}\|}cosθ=a ∥∥b a b

值域:[−1,1][-1,1][1,1]

  • 1:完全相同方向。
  • 0:垂直,无相似。
  • -1:完全相反方向。

几何解释

余弦相似度本质上是归一化后的点积。它只关心方向,不关心长度。将向量投影到单位球上后,计算点积。

例如,如果a⃗\vec{a}a b⃗\vec{b}b 方向相同,无论长度多长,cos⁡θ=1\cos\theta=1cosθ=1

计算过程

继续用a⃗=(3,4)\vec{a}=(3,4)a =(3,4)b⃗=(1,2)\vec{b}=(1,2)b =(1,2)

  1. 计算点积:11(同上)。
  2. 计算模:5和5≈2.236\sqrt{5}\approx2.2365 2.236
  3. 除以模乘积:11/(5×2.236)≈0.98411/(5\times2.236)\approx0.98411/(5×2.236)0.984

另一个例子:a⃗=(3,4)\vec{a}=(3,4)a =(3,4)b⃗=(6,8)=2a⃗\vec{b}=(6,8)=2\vec{a}b =(6,8)=2a

  • 点积:3×6+4×8=18+32=503\times6+4\times8=18+32=503×6+4×8=18+32=50
  • 模:∥a⃗∥=5\|\vec{a}\|=5a =5∥b⃗∥=10\|\vec{b}\|=10b =10
  • 余弦:50/(5×10)=150/(5\times10)=150/(5×10)=1(完全相似,尽管幅度不同)。

优缺点

  • 优点
    • 值域固定[−1,1][-1,1][1,1],易于比较和解释。
    • 忽略幅度,只关注方向:适合文本相似度(如TF-IDF向量),因为文档长度差异不影响主题相似。
    • 对高维稀疏数据鲁棒(如词袋模型)。
  • 缺点
    • 忽略幅度:在某些场景(如用户评分强度重要时)可能丢失信息。
    • 如果向量全为正值,相似度总是正的,无法捕捉负相关。
    • 计算需额外求模,稍慢于纯点积(但在实践中可忽略)。

应用场景

  • 信息检索:如搜索引擎中,查询和文档的TF-IDF向量余弦相似度。
  • 文本分类/聚类:Word2Vec或BERT嵌入的相似度。
  • 推荐系统:协同过滤中,用户/物品向量的方向相似。
  • 图像检索:特征向量的方向匹配。

点积相似度 vs 余弦相似度:区别与联系

联系

  • 余弦相似度 = 点积 / (模乘积)。即余弦是点积的归一化版本。
  • 如果向量已归一化(单位向量,∥a⃗∥=∥b⃗∥=1\|\vec{a}\|=\|\vec{b}\|=1a =b =1),则点积 = 余弦相似度。
  • 两者都基于向量夹角,都能处理高维数据。

区别

方面 点积相似度 余弦相似度
公式 ∑aibi\sum a_ib_iaibi (∑aibi)/(∣a⃗∣∣b⃗∣)(\sum a_ib_i)/(|\vec{a}||\vec{b}|)(aibi)/(a ∣∣b )
考虑因素 方向 + 幅度 只方向
值域 (−∞,+∞)(-\infty,+\infty)(,+) [−1,1][-1,1][1,1]
归一化
适用场景 幅度重要(如强度、流行度) 幅度无关(如主题、方向)
计算复杂度 O(n)O(n)O(n) O(n)O(n)O(n)(稍多sqrt操作)
例子影响 幅度大者得分高 幅度不影响
  • 何时选择点积:当幅度有意义时,如在深度学习嵌入中,幅度可表示置信度或流行度。
  • 何时选择余弦:当只需方向时,如规范化文本向量,避免长文档主导。

潜在问题与改进

  • 零向量:点积为0,余弦未定义(分母0)。处理:添加小epsilon或跳过。
  • 负值:点积可负,余弦也可负。在相似度上下文中,常取绝对值或映射到[0,1]:(1+cos⁡θ)/2(1+\cos\theta)/2(1+cosθ)/2
  • 高维诅咒:在高维中,所有向量趋向垂直,余弦趋向0。改进:使用L1范数或其他度量。
  • 改进变体:调整余弦相似度(AdjustedCosine):减去平均值,处理偏置。

实际例子

例子1:文本相似度

假设两个文档的词向量(词频):

  • Doc1: a⃗=(2,1,0)\vec{a}=(2,1,0)a =(2,1,0)(词:apple,banana,cat)
  • Doc2: b⃗=(0,3,1)\vec{b}=(0,3,1)b =(0,3,1)

点积:2×0+1×3+0×1=32\times0 + 1\times3 + 0\times1=32×0+1×3+0×1=3
余弦:模∥a⃗∥=4+1+0=5≈2.236\|\vec{a}\|=\sqrt{4+1+0}=\sqrt{5}\approx2.236a =4+1+0 =5 2.236∥b⃗∥=0+9+1=10≈3.162\|\vec{b}\|=\sqrt{0+9+1}=\sqrt{10}\approx3.162b =0+9+1 =10 3.162
cos⁡θ=3/(2.236×3.162)≈0.424\cos\theta=3/(2.236\times3.162)\approx0.424cosθ=3/(2.236×3.162)0.424

解释:点积=3表示有一些共同词,余弦≈0.424表示中等方向相似。

例子2:用户推荐

用户A评分:(5,3,0)(电影1,2,3)
用户B评分:(4,2,1)

点积=54 + 32 + 0*1=20+6+0=26(高,因为高评分重合)
余弦=26/(√(25+9+0)√(16+4+1))=26/(√34 * √21)≈26/(5.834.58)≈0.973(很高方向相似)

如果用户C:(10,6,0)=2*用户A,点积A-C=50+18+0=68(更高,因幅度),余弦=1(相同方向)。

代码实现(Python)

import numpy as np

def dot_product(a, b):
    return np.dot(a, b)

def cosine_similarity(a, b):
    return np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b))

# 示例
a = np.array([3, 4])
b = np.array([1, 2])
print("Dot Product:", dot_product(a, b))  # 11
print("Cosine Similarity:", cosine_similarity(a, b))  # ≈0.984

总结

点积相似度捕捉方向和幅度,适合幅度敏感场景;余弦相似度聚焦方向,适合规范化比较。选择取决于应用:在推荐中点积常用于分数预测,在搜索中余弦用于排名。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐