向量

向量点积

点积(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 @ Bnp.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 博客