关于点积相似度和余弦相似度
假设我们有两个向量a⃗\vec{a}a和b⃗\vec{b}b,它们在nnna⃗a1a2anaa1a2anb⃗b1b2bnbb1b2bn∥a⃗∥∑i1nai2∥a∥i1∑nai2∥b⃗∥∑i1nbi2∥b∥i1∑nbi2向量间的夹角为θ\thetaθ,其中0≤θ≤180∘0≤θ≤。
关于点积相似度和余弦相似度
引言
在向量空间中,相似度度量是机器学习、推荐系统、信息检索等领域的基础概念。其中,点积相似度(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=1∑nai2
∥b⃗∥=∑i=1nbi2\|\vec{b}\|=\sqrt{\sum_{i=1}^{n}b_i^2}∥b∥=i=1∑nbi2
向量间的夹角为θ\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=1∑naibi
几何解释
点积等于两个向量模的乘积乘以它们夹角的余弦:
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)。
- 计算对应元素乘积:3×1=33\times1=33×1=3,4×2=84\times2=84×2=8。
- 求和: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}=5∥a∥=32+42=25=5,∥b⃗∥=12+22=5≈2.236\|\vec{b}\|=\sqrt{1^2+2^2}=\sqrt{5}\approx2.236∥b∥=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)。
- 计算点积:11(同上)。
- 计算模:5和5≈2.236\sqrt{5}\approx2.2365≈2.236。
- 除以模乘积: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}\|=5∥a∥=5,∥b⃗∥=10\|\vec{b}\|=10∥b∥=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}\|=1∥a∥=∥b∥=1),则点积 = 余弦相似度。
- 两者都基于向量夹角,都能处理高维数据。
区别
方面 | 点积相似度 | 余弦相似度 |
---|---|---|
公式 | ∑aibi\sum a_ib_i∑aibi | (∑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.236∥a∥=4+1+0=5≈2.236,∥b⃗∥=0+9+1=10≈3.162\|\vec{b}\|=\sqrt{0+9+1}=\sqrt{10}\approx3.162∥b∥=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
总结
点积相似度捕捉方向和幅度,适合幅度敏感场景;余弦相似度聚焦方向,适合规范化比较。选择取决于应用:在推荐中点积常用于分数预测,在搜索中余弦用于排名。
更多推荐
所有评论(0)