除了向量 (vector)加法或标量乘法,另一个重要的运算是点积 (也称为标量积或内积)。与产生另一个向量的加法或标量乘法不同,点积接受两个向量并返回一个标量。这个运算在许多方面都很常用,包括衡量向量间的相似性,以及作为矩阵乘法等更复杂运算的组成部分。
计算点积
点积定义于两个相同维度的向量 (vector)。如果你有两个向量,比如 a a a 和 b b b ,它们都包含 n n n 个元素:
a = [ a 1 a 2 ⋮ a n ] , b = [ b 1 b 2 ⋮ b n ] a = \begin{bmatrix} a_1 \\ a_2 \\ \vdots \\ a_n \end{bmatrix}, \quad b = \begin{bmatrix} b_1 \\ b_2 \\ \vdots \\ b_n \end{bmatrix} a = a 1 a 2 ⋮ a n , b = b 1 b 2 ⋮ b n
它们的点积,通常表示为 a ⋅ b a \cdot b a ⋅ b 或 a T b a^T b a T b ,通过将对应元素相乘并求和来计算:
a ⋅ b = a 1 b 1 + a 2 b 2 + ⋯ + a n b n = ∑ i = 1 n a i b i a \cdot b = a_1 b_1 + a_2 b_2 + \dots + a_n b_n = \sum_{i=1}^{n} a_i b_i a ⋅ b = a 1 b 1 + a 2 b 2 + ⋯ + a n b n = i = 1 ∑ n a i b i
示例:
让我们计算两个3维向量的点积:
v = [ 1 , 2 , 3 ] v = [1, 2, 3] v = [ 1 , 2 , 3 ]
w = [ 4 , − 5 , 6 ] w = [4, -5, 6] w = [ 4 , − 5 , 6 ]
使用公式:
v ⋅ w = ( 1 × 4 ) + ( 2 × − 5 ) + ( 3 × 6 ) v \cdot w = (1 \times 4) + (2 \times -5) + (3 \times 6) v ⋅ w = ( 1 × 4 ) + ( 2 × − 5 ) + ( 3 × 6 )
v ⋅ w = 4 − 10 + 18 v \cdot w = 4 - 10 + 18 v ⋅ w = 4 − 10 + 18
v ⋅ w = 12 v \cdot w = 12 v ⋅ w = 12
结果12是一个标量。请注意,向量必须具有相同数量的元素才能定义点积。你不能计算一个3元素向量和一个4元素向量的点积。
在Python中使用NumPy计算点积
NumPy提供了计算点积的便捷方法。
使用 numpy.dot() 函数:
import numpy as np
v = np.array([1, 2, 3])
w = np.array([4, -5, 6])
# 使用 np.dot() 计算点积
dot_product = np.dot(v, w)
print(f"向量 v: {v}")
print(f"向量 w: {w}")
print(f"点积 (使用 np.dot): {dot_product}")
输出:
向量 v: [1 2 3]
向量 w: [ 4 -5 6]
点积 (使用 np.dot): 12
使用 @ 运算符: Python 3.5+ 引入了 @ 运算符用于矩阵乘法,它也适用于计算一维数组(向量 (vector))的点积。
import numpy as np
v = np.array([1, 2, 3])
w = np.array([4, -5, 6])
# 使用 @ 运算符计算点积
dot_product_operator = v @ w
print(f"向量 v: {v}")
print(f"向量 w: {w}")
print(f"点积 (使用 @): {dot_product_operator}")
输出:
向量 v: [1 2 3]
向量 w: [ 4 -5 6]
点积 (使用 @): 12
两种方法都得到相同的标量结果12,与我们手动计算的结果一致。在复杂表达式中,@ 运算符因其简洁性而常被选用。
几何解释:角度与投影
点积有一个重要的几何意义,它与两个向量 (vector)之间的夹角有关。公式是:
a ⋅ b = ∥ a ∥ ∥ b ∥ cos ( θ ) a \cdot b = \|a\| \|b\| \cos(\theta) a ⋅ b = ∥ a ∥∥ b ∥ cos ( θ )
其中:
a ⋅ b a \cdot b a ⋅ b 是向量 a a a 和 b b b 的点积。
∥ a ∥ \|a\| ∥ a ∥ 和 ∥ b ∥ \|b\| ∥ b ∥ 是向量 a a a 和 b b b 的大小(或 L 2 L_2 L 2 范数)。
θ \theta θ 是两个向量之间的夹角。
这个公式使我们能够通过向量的分量来计算它们之间的夹角:
cos ( θ ) = a ⋅ b ∥ a ∥ ∥ b ∥ \cos(\theta) = \frac{a \cdot b}{\|a\| \|b\|} cos ( θ ) = ∥ a ∥∥ b ∥ a ⋅ b
由此,我们可以根据点积看出向量间的关系:
如果 a ⋅ b > 0 a \cdot b > 0 a ⋅ b > 0 :向量之间的夹角 θ \theta θ 小于90度(cos ( θ ) > 0 \cos(\theta) > 0 cos ( θ ) > 0 )。向量大致指向相似的方向。
如果 a ⋅ b = 0 a \cdot b = 0 a ⋅ b = 0 :夹角 θ \theta θ 恰好是90度(cos ( θ ) = 0 \cos(\theta) = 0 cos ( θ ) = 0 ),这意味着向量是正交 的(垂直的)。这是在线性代数和机器学习 (machine learning)中一个很有用的性质。请注意,这假定 a a a 和 b b b 是非零向量。
如果 a ⋅ b < 0 a \cdot b < 0 a ⋅ b < 0 :夹角 θ \theta θ 大于90度(cos ( θ ) < 0 \cos(\theta) < 0 cos ( θ ) < 0 )。向量大致指向相反的方向。
点积也与投影 这个想法有关。向量 a a a 在向量 b b b 上的标量投影(a a a 有多少指向 b b b 的方向)可以使用点积计算:a ⋅ b ∥ b ∥ \frac{a \cdot b}{\|b\|} ∥ b ∥ a ⋅ b 。
点积在机器学习 (machine learning)中为何重要?
点积在机器学习算法中频繁出现:
相似度衡量: 余弦相似度,计算公式为 a ⋅ b ∥ a ∥ ∥ b ∥ \frac{a \cdot b}{\|a\| \|b\|} ∥ a ∥∥ b ∥ a ⋅ b ,使用点积来衡量两个向量 (vector)在方向上的相似性,而不考虑它们的大小。这在自然语言处理(NLP)中常用于比较文档或词向量,以及在推荐系统中。
线性模型: 在线性回归或逻辑回归等模型中,预测通常是输入特征的加权和。这个加权和就是特征向量与模型权重 (weight)向量之间的点积。
神经网络 (neural network): 许多神经网络层中的核心计算涉及矩阵乘法,这些矩阵乘法基本上由许多点积构成。
理解点积的计算方法及其几何意义,有助于理解这些更高级的应用。在下一节中,我们将练习使用NumPy实现这些向量运算。