向量
向量点积
点积(Dot product)也叫标量积(Scalar product)。在 Euclidean 空间中,点积也是最常见的内积(Inner product)形式。
点积的计算方式很直接:两个向量的对应元素分别相乘,再把结果相加。最终结果是一个标量,也就是一个数。
对于二维向量:
\vec{a} = (a_1, a_2), \quad \vec{b} = (b_1, b_2)
两者的点积为:
\vec{a} \cdot \vec{b} = a_1b_1 + a_2b_2
在二维和三维空间中,点积还可以从几何角度理解为两个向量夹角的关系:
\vec{a} \cdot \vec{b} = \lvert \vec{a} \rvert \cdot \lvert \vec{b} \rvert \cdot \cos\theta
因此,点积可以用来判断两个向量方向上的相似程度,诶嘿嘿!前面那篇 Transformer 就需要了解这点性质,你猜我为啥突然回来看向量乘?
点积大于 0,说明夹角小于 90 度;点积等于 0,说明两个向量正交;点积小于 0,说明夹角大于 90 度。
Python 中可以使用 np.dot(a, b) 计算两个向量的点积。
向量叉积
叉积(Cross product)又称矢量积(Vector product)。在部分中文资料中也会称为外积,但这里要注意,它和矩阵运算中的外积(Outer product)不是同一个概念。叉积的结果是一个向量。
叉积通常用于三维向量。对于向量:
\vec{a} = (a_1, a_2, a_3), \quad \vec{b} = (b_1, b_2, b_3)
两者的叉积为:
\vec{a} \times \vec{b}
=
\begin{vmatrix}
\vec{i} & \vec{j} & \vec{k} \\
a_1 & a_2 & a_3 \\
b_1 & b_2 & b_3
\end{vmatrix}
展开后得到:
\vec{a} \times \vec{b}
= (a_2b_3 - a_3b_2)\vec{i}
+ (a_3b_1 - a_1b_3)\vec{j}
+ (a_1b_2 - a_2b_1)\vec{k}
其中,{\vec{i}, \vec{j}, \vec{k} } 分别表示 X, Y, Z 方向上的单位向量
叉积得到的向量同时垂直于 {\vec{a}} 和 {\vec{b}},也就是垂直于这两个向量所张成的平面。方向可以通过右手定则判断。
叉积结果向量的模为:
\lvert \vec{a} \times \vec{b} \rvert
= \lvert \vec{a} \rvert \cdot \lvert \vec{b} \rvert \cdot \sin\theta
当 {\vec{a}} 和 {\vec{b}} 共起点时,叉积的模等于这两个向量构成的平行四边形面积。
Python 中可以使用 np.cross(a, b) 计算两个向量的叉积。
矩阵
矩阵乘法
矩阵乘法常写作 {A \cdot B} 。如果矩阵 \text{A} 是 \text m 行 \text n 列,矩阵 \text{B} 是 \text n 行 \text s 列,那么左矩阵的列数必须等于右矩阵的行数,结果是一个 \text m 行 \text s 列的矩阵。
矩阵乘法的本质是:结果矩阵中每个位置的元素,都来自左矩阵某一行和右矩阵某一列的点积。
对于矩阵:
\text{设 } A =
\begin{bmatrix}
a_{11} & a_{12} \\
a_{21} & a_{22}
\end{bmatrix},
\quad
B =
\begin{bmatrix}
b_{11} & b_{12} \\
b_{21} & b_{22}
\end{bmatrix}
矩阵乘法为:
\text{则 } A \cdot B =
\begin{bmatrix}
a_{11}b_{11} + a_{12}b_{21} & a_{11}b_{12} + a_{12}b_{22} \\
a_{21}b_{11} + a_{22}b_{21} & a_{21}b_{12} + a_{22}b_{22}
\end{bmatrix}
Python 中推荐使用 A @ B 或 np.matmul(A, B) 计算矩阵乘法。
对于二维矩阵,np.dot(A, B) 也可以得到矩阵乘法结果。
点积和矩阵乘法不是同一个概念。点积主要用于两个向量之间的计算,结果是标量;矩阵乘法用于两个矩阵之间的计算,结果通常仍然是矩阵。
矩阵叉积
严格来说,矩阵本身没有标准的叉积定义。Python 和 MATLAB 中提供的矩阵叉积函数,本质上是把矩阵看成一组向量,然后对这些向量分别计算叉积。
在 NumPy 中,np.cross(A, B) 默认沿最后一个维度取向量。例如,当 \text A 和 \text B 的形状都是 \text {(n, 3)} 时,可以把每一行看成一个三维向量,返回结果也是 \text {(n, 3)},其中每一行都是对应两行向量的叉积。
如果希望按列计算叉积,需要显式调整轴参数,或者先转置矩阵后再计算。
哈达玛积
哈达玛积(Hadamard product)也叫元素积(Element-wise product, Point-wise product)或逐项积。它要求两个矩阵维度完全一致,计算方式是对应元素逐项相乘,结果仍然是一个矩阵。
哈达玛积记为 \text A \circ\text B ,需要和矩阵乘法中的 \text A \cdot \text B 区分开。
对于两个矩阵:
\text{设 } A =
\begin{bmatrix}
a_{11} & a_{12} \\
a_{21} & a_{22}
\end{bmatrix},
\quad
B =
\begin{bmatrix}
b_{11} & b_{12} \\
b_{21} & b_{22}
\end{bmatrix}
哈达玛积为:
\text{则 } A \circ B =
\begin{bmatrix}
a_{11}b_{11} & a_{12}b_{12} \\
a_{21}b_{21} & a_{22}b_{22}
\end{bmatrix}
Python 中可以使用 np.multiply(A, B) 或 A * B 计算哈达玛积。
弗罗比尼乌斯内积
弗罗比尼乌斯内积(Frobenius Inner Product)可以看作矩阵上的点积。它要求两个矩阵维度一致,结果是一个标量。
弗罗比尼乌斯内积记为 \text A : \text B。对于实数矩阵,它等于两个矩阵对应元素相乘后的总和:
\text{有 } A : B = \sum_{i=1}^{m} \sum_{j=1}^{n} a_{ij}b_{ij}
对于二维矩阵:
\text{即 } A : B
= a_{11}b_{11} + a_{12}b_{12} + a_{21}b_{21} + a_{22}b_{22}
Python 中可以使用 np.sum(A * B) 计算实数矩阵的弗罗比尼乌斯内积。
克罗内克积
克罗内克积(Kronecker product)用于两个任意大小的矩阵。它会把一个矩阵中的每个元素,都乘到另一个完整矩阵上,从而组合成一个更大的矩阵。
克罗内克积记为 \text A \otimes \text B 。
对于矩阵:
\text{设 } A =
\begin{bmatrix}
a_{11} & a_{12} & \cdots & a_{1n} \\
a_{21} & a_{22} & \cdots & a_{2n} \\
\vdots & \vdots & \ddots & \vdots \\
a_{m1} & a_{m2} & \cdots & a_{mn}
\end{bmatrix}
它和矩阵 \text{B} 的克罗内克积为:
\text{则 } A \otimes B =
\begin{bmatrix}
a_{11}B & a_{12}B & \cdots & a_{1n}B \\
a_{21}B & a_{22}B & \cdots & a_{2n}B \\
\vdots & \vdots & \ddots & \vdots \\
a_{m1}B & a_{m2}B & \cdots & a_{mn}B
\end{bmatrix}
若矩阵 \text{A} 和 \text{B} 都是二阶矩阵:
\text{设 } A =
\begin{bmatrix}
a_{11} & a_{12} \\
a_{21} & a_{22}
\end{bmatrix},
\quad
B =
\begin{bmatrix}
b_{11} & b_{12} \\
b_{21} & b_{22}
\end{bmatrix}
则有:
\text{所以 } A \otimes B =
\begin{bmatrix}
a_{11}B & a_{12}B \\
a_{21}B & a_{22}B
\end{bmatrix}
进一步展开为:
\text{即 } A \otimes B =
\begin{bmatrix}
a_{11}b_{11} & a_{11}b_{12} & a_{12}b_{11} & a_{12}b_{12} \\
a_{11}b_{21} & a_{11}b_{22} & a_{12}b_{21} & a_{12}b_{22} \\
a_{21}b_{11} & a_{21}b_{12} & a_{22}b_{11} & a_{22}b_{12} \\
a_{21}b_{21} & a_{21}b_{22} & a_{22}b_{21} & a_{22}b_{22}
\end{bmatrix}
Python 中可以使用 np.kron(A, B) 计算克罗内克积。
参考文章
[1] 矩阵乘法 - 维基百科,自由的百科全书
[2] 带你一次搞懂点积(内积)、叉积(外积)- CSDN 博客
评论