矩阵的性质 矩阵是承载数据集、编码变换、并定义每一个神经网络层的数据结构。本文件讲解矩阵的维度、元素、转置、迹、行列式、逆、秩与零空间——这些基础性质贯穿整个线性代数与机器学习。 从本质上讲,矩阵(matrix)就是按行列排成网格的一组数。如果向量是一列数,那矩阵就像一摞向量叠在一起。 如果用向量 $[\text{age}, \text{height}, \text{weight}]$(年龄、身高、体重)来描述一个人,那么三个人就组成一个矩阵,每一行代表一个人: 这个矩阵有 3 行 3 列,所以我们称它是一个 $3 \times 3$ 矩阵。 网格中的每一个数称为一个元素(element)或项(entry),由它所在的行和列来确定:$A{ij}$ 表示第 $i$ 行、第 $j$ 列的元素。
矩阵是承载数据集、编码变换、并定义每一个神经网络层的数据结构。本文件讲解矩阵的维度、元素、转置、迹、行列式、逆、秩与零空间——这些基础性质贯穿整个线性代数与机器学习。
A = \begin{bmatrix} 1 & 2 & 3 \\ 4 & 5 & 6 \end{bmatrix}
\begin{bmatrix} 25 & 170 & 65 \\ 30 & 180 & 80 \\ 22 & 160 & 55 \end{bmatrix}
这个矩阵有 3 行 3 列,所以我们称它是一个 3 \times 3 矩阵。
网格中的每一个数称为一个元素(element)或项(entry),由它所在的行和列来确定:A_{ij} 表示第 i 行、第 j 列的元素。
矩阵的**转置(transpose)**是沿主对角线把它翻转,行变列、列变行。若 A 是 m \times n,则 A^T 是 n \times m。
A = \begin{bmatrix} 1 & 2 & 3 \\ 4 & 5 & 6 \end{bmatrix} \quad \Rightarrow \quad A^T = \begin{bmatrix} 1 & 4 \\ 2 & 5 \\ 3 & 6 \end{bmatrix}
把一个矩阵和它的转置相乘,结果总是一个方阵:AA^T 是 m \times m,A^TA 是 n \times n。
方阵的**迹(trace)**是它对角线元素之和:\text{tr}(A) = A_{11} + A_{22} + \cdots + A_{nn}。迹等于特征值之和(后面会讲到)。
对于上面那个矩阵,\text{tr}(A) = 1 + 4 + 9 = 14。只有高亮的那条对角线才起作用。
如果两个矩阵表示同一个线性变换(只是在不同的基下表示),它们的迹会相同。迹是「与基无关」的量。
矩阵的**秩(rank)**是线性无关的行(等价地,列)的个数。它告诉你这个矩阵到底携带了多少「有用信息」。
例如,下面这个矩阵秩为 2,因为两行都不是对方的倍数:
\begin{bmatrix} 1 & 2 \\ 3 & 4 \end{bmatrix}
而这个矩阵秩为 1,因为第二行只是第一行的两倍,没有带来任何新信息:
\begin{bmatrix} 1 & 2 \\ 2 & 4 \end{bmatrix}
方阵可逆(有逆)当且仅当它满秩。
秩通过**秩-零化度定理(rank-nullity theorem)与零空间(null space)**联系起来:\text{rank}(A) + \text{nullity}(A) = \text{number of columns of } A。矩阵「保留的」(秩)加上「消灭的」(零化度)等于总维度。
矩阵的**列空间(column space)**是用任意向量乘以该矩阵所能得到的全部输出。它由矩阵的各列张成。如果一个矩阵有 3 列但只有 2 列线性无关,那它的列空间是一个二维平面,而不是整个三维空间。
**行空间(row space)**是同样的想法,只是从行的角度看。秩等于列空间和行空间的维度,所以两者始终一致。
列空间告诉你「这个矩阵能产生哪些输出?」,零空间告诉你「哪些输入会被映射为零?」。这两个空间共同完整地刻画了矩阵所做的事。
方阵的**行列式(determinant)**是一个单一的数,刻画了矩阵如何缩放空间。把一个 2 \times 2 矩阵想象成把单位正方形变换成一个平行四边形,行列式就是这个平行四边形的面积(带正负号)。
\det\begin{bmatrix} a & b \\ c & d \end{bmatrix} = ad - bc
\det\begin{bmatrix} 2 & 1 \\ 0 & 3 \end{bmatrix} = 2 \cdot 3 - 1 \cdot 0 = 6
这个变换把单位正方形拉伸成一个面积为 6 的平行四边形。
如果行列式为正,说明变换保持了朝向(东西没有被「翻转」)。如果为负,则翻转了朝向(就像镜像反射)。如果为零,说明矩阵把空间压扁到了更低维度——平行四边形坍缩成一条线或一个点。
行列式为零的矩阵称为**奇异(singular)**矩阵。它没有逆,信息被永久丢失。
对于大于 2 \times 2 的矩阵,行列式要用**余子式(minors)和代数余子式(cofactors)**来计算。余子式 M_{ij} 是删去第 i 行第 j 列后得到的小矩阵的行列式。
代数余子式 C_{ij} = (-1)^{i+j} M_{ij} 给每个余子式配一个正负号(像棋盘一样交替:+, -, +, \ldots)。整个矩阵的行列式就是沿任意一行或一列求和:\det(A) = \sum_j A_{1j} \cdot C_{1j}。这叫作代数余子式展开(cofactor expansion)。
方阵 A 的逆(inverse),记作 A^{-1},是「撤销」A 所做之事的矩阵:AA^{-1} = A^{-1}A = I(单位矩阵)。只有非奇异矩阵才有逆。
对于 2 \times 2 矩阵,逆有直接的公式:
\begin{bmatrix} a & b \\ c & d \end{bmatrix}^{-1} = \frac{1}{ad - bc}\begin{bmatrix} d & -b \\ -c & a \end{bmatrix}
注意分母里的行列式——这正是奇异矩阵(行列式为零)没有逆的原因。
**条件数(condition number)**衡量一个矩阵对输入微小变化的敏感程度。定义为 \kappa(A) = \|A\| \cdot \|A^{-1}\|。
条件数接近 1 意味着矩阵是良态(well-conditioned)的:输入的微小变化只会引起输出的微小变化。条件数很大则意味着病态(ill-conditioned):极小的误差会被巨大地放大。正交矩阵和单位矩阵的条件数为 1,而奇异矩阵的条件数为无穷大。
例如,下面这个矩阵的条件数为 10^8。一个方向被正常缩放,另一个方向几乎被压成零,所以沿那个方向的微小扰动会被严重扭曲:
\begin{bmatrix} 1 & 0 \\ 0 & 10^{-8} \end{bmatrix}
\|A\|_F = \sqrt{\sum_{i}\sum_{j} A_{ij}^2}
\left\|\begin{bmatrix} 1 & 2 \\ 3 & 4 \end{bmatrix}\right\|_F = \sqrt{1 + 4 + 9 + 16} = \sqrt{30} \approx 5.48
谱范数(spectral norm) \|A\|_2 是 A 的最大奇异值。它衡量矩阵最多能把任一单位向量拉伸多少。在 ML 中,矩阵范数被用于权重正则化(惩罚过大的权重)以及监控训练的稳定性。
对称矩阵 A 是**正定(positive definite)**的,如果对任意非零向量 \mathbf{x} 都有:\mathbf{x}^T A \mathbf{x} > 0。这个二次型总是产生正数。
例如,下面这个矩阵是正定的:
A = \begin{bmatrix} 2 & 1 \\ 1 & 3 \end{bmatrix}
随便取一个向量,比如 \mathbf{x} = [1, -1]^T:\mathbf{x}^T A \mathbf{x} = 2 - 1 - 1 + 3 = 3 > 0。无论你试哪个非零的 \mathbf{x},结果总是正的。
正定矩阵之所以重要,是因为它们能保证优化问题有唯一的最小值。
如果把条件放宽为 \mathbf{x}^T A \mathbf{x} \geq 0(允许等于零),矩阵就叫半正定(positive semi-definite,PSD)。半正定矩阵在 ML 中无处不在:协方差矩阵、SVM 中的核矩阵、以及局部最小值处的 Hessian 矩阵都是半正定的。区别在于半正定允许某些方向是「平坦」的(曲率为零),而不是严格地向上弯曲。
import jax.numpy as jnp A = jnp.array([[1.0, 2.0], [3.0, 4.0]]) print(f"Trace: {jnp.trace(A)}") print(f"Rank: {jnp.linalg.matrix_rank(A)}") print(f"Determinant: {jnp.linalg.det(A):.2f}")
import jax.numpy as jnp A = jnp.array([[1.0, 2.0], [3.0, 4.0]]) A_inv = jnp.linalg.inv(A) print(f"A * A_inv:\n{A @ A_inv}")