AI 数学课程 · 第 33 课,共 180

矩阵秩衡量 AI 特征中的独立信息

通过主元或特征计算矩阵的秩,联系行与列的视角,并用奇异值识别冗余数据特征。

分享这篇文章

一个数据集可以有三列特征,却只包含两个独立的变化方向。当模型试图为总是一起变化的特征分别分配效应时,这一区别就很重要。矩阵的秩计算矩阵中的独立方向数,无论我们考察的是特征列还是样本行。

学完本课后,你将能够通过寻找主元计算矩阵的秩,解释为什么行和列的视角会得到同一个数,并读懂奇异值预览,而不把每个小值都当成精确的零。

**学习目标:**计算秩,并联系行与列的视角。

本课汇集了行阶梯形和维数的概念:主元标识独立方向,秩则对它们计数。《Mathematics for Machine Learning》第 2.6.2 节通过线性无关的行和列定义秩。此处的数据矩阵、特征解释、奇异值图表、计算和练习均为原创内容。

三列特征只承载两个方向

设想有四次会话,记录用户在移动应用、网站上的使用分钟数,以及总活跃分钟数。每行代表一次会话,每列代表一项测量:

X=[123246011134]=[∣∣∣xmobilexwebxtotal∣∣∣]∈R4×3.X=\begin{bmatrix} 1&2&3\\ 2&4&6\\ 0&1&1\\ 1&3&4 \end{bmatrix} = \begin{bmatrix} \vert&\vert&\vert\\ \boldsymbol{x}_{\text{mobile}}& \boldsymbol{x}_{\text{web}}& \boldsymbol{x}_{\text{total}}\\ \vert&\vert&\vert \end{bmatrix} \in\mathbb{R}^{4\times3}.

每一行的总时长都由移动端时长加上网站时长得到:

xtotal=xmobile+xweb.\boldsymbol{x}_{\text{total}} =\boldsymbol{x}_{\text{mobile}}+\boldsymbol{x}_{\text{web}}.

因此,这三列彼此相关。总时长这一命名测量仍然有用,但在这个特定矩阵中,它没有增加新的线性方向。前两列线性无关:第三行中只有网站列非零,因此可以排除网站列的非零倍数;随后看第一行即可排除移动端列的非零倍数。所以,列空间的维数是二。

这里 m=4m=4 表示四次会话,n=3n=3 表示三个特征,因此秩最多为三。我们已经证明三列彼此依赖,而前两列线性无关,所以 rank⁡(X)=2\operatorname{rank}(X)=2。

用行中的主元计算秩

解线性方程组时,为了保持解不变,行变换也必须施加在等号右边。在这个特征矩阵上,消元会保持秩并揭示主元。先用第 2 行减去第 1 行的两倍来替换第 2 行,再用第 4 行减去第 1 行来替换第 4 行。然后用新第 4 行减去第 3 行,并把非零的第三行移到第二行:

[123246011134]∼[123011000000]∼[101011000000].\begin{bmatrix} 1&2&3\\ 2&4&6\\ 0&1&1\\ 1&3&4 \end{bmatrix} \sim \begin{bmatrix} 1&2&3\\ 0&1&1\\ 0&0&0\\ 0&0&0 \end{bmatrix} \sim \begin{bmatrix} 1&0&1\\ 0&1&1\\ 0&0&0\\ 0&0&0 \end{bmatrix}.

有两行非零,也有两列主元,所以秩为二。原矩阵的第一、二列构成其列空间的一组基;第三列等于前两列之和,因此该列没有主元。

直接从行的视角也能得到相同结果。把样本行写作 r1,…,r4\boldsymbol{r}_1,\ldots,\boldsymbol{r}_4。第二行等于 2r12\boldsymbol{r}_1,第四行等于 r1+r3\boldsymbol{r}_1+\boldsymbol{r}_3。第一行和第三行线性无关,因此行空间的维数也是二。一般来说,对每个有限矩阵(包括长方形矩阵),行秩和列秩都相等;转置会交换这两个空间,却不会改变其中独立方向的数量。

奇异值预览这些方向

面对含噪声或规模较大的矩阵,软件通常通过奇异值分解(SVD)估算秩。SVD 将矩阵表示为 X=UΣVTX=U\Sigma V^\mathsf{T},其中 Σ\Sigma 的对角元素是非负奇异值,按从大到小排列。每个值表示矩阵沿一对方向作用的强度。精确的零表示相应方向不存在。

在本例中,奇异值约为 9.8829.882、0.5810.581 和零(浮点舍入误差范围内)。除以最大值可以得到不受整体尺度影响的预览:1.0001.000、0.0590.059 和约等于 00。第三条柱消失,是因为总时长特征恰好等于另外两项之和。第二个方向比第一个弱,但仍然非零。这些比值不是解释方差的百分比:奇异值表示尺度,而它们的平方是 XTXX^\mathsf{T}X 的特征值。对于中心化数据,这些平方值与相应方向上的方差相关,差别只在共同的归一化因子。

奇异值预览

特征矩阵中仍有两个方向

每根柱表示一个奇异值除以最大奇异值后的结果。由于总时长等于其他特征之和,考虑浮点舍入误差后,第三个方向为零。

  1. 第一个方向1.000
  2. 第二个方向0.059
  3. 第三个方向≈ 0
归一化前的数值约为 9.882、0.581 和 0。小方向不一定就是零方向;判断秩需要采用精确规则或数值规则。

该图只是一个矩阵的预览,并不代表通用的截断标准。NumPy 的 matrix_rank 会计算高于容差的奇异值个数。默认容差会根据最大奇异值、矩阵的最大维度以及数据类型的浮点精度缩放。这种做法可以处理精确依赖关系中的舍入误差;如果测量噪声大于浮点误差,其他容差可能更合适。svd 例程会按降序返回奇异值。

import numpy as np

X = np.array([
    [1, 2, 3],
    [2, 4, 6],
    [0, 1, 1],
    [1, 3, 4],
], dtype=float)

singular_values = np.linalg.svd(X, compute_uv=False)
rank_columns = np.linalg.matrix_rank(X)
rank_rows = np.linalg.matrix_rank(X.T)

print(X.shape)                              # (4, 3)
print(np.round(singular_values, 3))          # [9.882 0.581 0.   ]
print(rank_columns, rank_rows)               # 2 2

浮点 SVD 在精确算术结果为零时,也可能返回一个很小的正数。NumPy 的容差会在秩估算中把该值归为零。显示出来的 0. 是四舍五入后的输出,并不表示每台计算机算出的奇异值都逐位精确为零。

秩能识别模型权重中的冗余

一个不带截距的线性模型使用权重 w∈R3\boldsymbol{w}\in\mathbb{R}^3,将四次会话的预测写为 y^=Xw\hat{\boldsymbol{y}}=X\boldsymbol{w}。设权重 (wm,ww,wt)(w_m,w_w,w_t) 分别对应移动端、网站和总时长。由于总时长是前两项之和,

Xw=(wm+wt)xmobile+(ww+wt)xweb.X\boldsymbol{w} = (w_m+w_t)\boldsymbol{x}_{\text{mobile}} + (w_w+w_t)\boldsymbol{x}_{\text{web}}.

尽管模型存储了三个权重,影响预测的只有两个组合权重。对任意数 cc,把 (wm,ww,wt)(w_m,w_w,w_t) 替换为 (wm+c,ww+c,wt−c)(w_m+c,w_w+c,w_t-c),所有预测都会保持不变。因此,在这个数据集上,秩为二意味着单凭这些预测无法唯一确定三个系数。正则化可以选出一组权重,但秩计算本身无法判断哪个特征应该具有因果或语义解释。

这就是 AI 应用:秩衡量数据矩阵中有效的线性特征多样性。在冗余派生特征影响系数解释或最小二乘拟合之前,秩可以帮助发现它们。这个数并不衡量数据集中的全部信息,也不能预测模型准确率或捕捉非线性关系。改变数据行、特征定义或预处理方式,都可能改变秩。

判断近似依赖时要说明容差

本例构造出的总时长是精确之和。现实测量则可能满足 x3≈x1+x2\boldsymbol{x}_3\approx\boldsymbol{x}_1+\boldsymbol{x}_2。此时,数学上的精确秩可能为三,即使最小奇异值很小。如果某个方向低于选定的容差,数值秩可能会把它视为可忽略。当这一区别会影响决策时,应报告容差和数据尺度。

特征缩放也会改变奇异值大小。将某个特征列乘以非零常数会保持精确秩不变,却可能改变用于数值秩或近似秩判断的奇异值比值。因此,解释小奇异值时,标准化并非无关紧要的步骤。秩描述的是所选编码下矩阵中的线性依赖;它不会给每列分配固定数量的语义信息。

如果矩阵有 pp 列特征但只有 rr 个独立方向,行阶梯形可以显示哪些列能构成一组基,而奇异值则显示这些方向在数值上有多强。接下来要问矩阵把什么映射到哪里,以及它会丢失哪些输入方向:核与像能明确表达这两个问题。

检查理解情况

问题 1

对于一个 5 × 3 矩阵,最大可能秩是多少?秩为 2 对它的列和行意味着什么?

显示分步解答

最大秩是 min⁡(5,3)=3\min(5,3)=3。如果秩为二,列空间的维数就是二,因此只有两列线性无关,三个列中至少有一列是其他列的线性组合。行空间的维数也为二,即五行中只有两行线性无关。这并不表示矩阵只有两个元素或两条记录。

问题 2

在会话矩阵中,验证导致一个特征冗余的列关系。哪两列线性无关?

显示分步解答

把列看作向量:xm=(1,2,0,1)T\boldsymbol{x}_m=(1,2,0,1)^\mathsf{T}、xw=(2,4,1,3)T\boldsymbol{x}_w=(2,4,1,3)^\mathsf{T}、xt=(3,6,1,4)T\boldsymbol{x}_t=(3,6,1,4)^\mathsf{T}。逐个分量相加可得 xm+xw=(3,6,1,4)T=xt\boldsymbol{x}_m+\boldsymbol{x}_w=(3,6,1,4)^\mathsf{T}=\boldsymbol{x}_t,因此三列线性相关。前两列线性无关:若 axm+bxw=0a\boldsymbol{x}_m+b\boldsymbol{x}_w=\boldsymbol{0},第三个分量给出 b=0b=0,再由第一个分量得到 a=0a=0。它们张成一个二维列空间。

问题 3

第二行是第一行的两倍,第四行是第一行与第三行之和。为什么由此可知行秩为 2?

显示分步解答

这两个等式说明第二行和第四行没有提供新方向。第一行与第三行线性无关:如果 ar1+br3=0a\boldsymbol{r}_1+b\boldsymbol{r}_3=0,由第一个分量得到 a=0a=0,再由第二个分量得到 b=0b=0。所以两条线性无关的行构成行空间的一组基,其维数是二。

问题 4

一个矩阵行化简后有三行非零行,主元列为第 1、2、4 列。它的秩是多少?原矩阵的哪些列构成列空间的一组基?

显示分步解答

主元数是三,所以秩为三。要得到原矩阵列空间的一组基,应取原矩阵的第 1、2、4 列,而不是行化简后矩阵中的对应列。行变换能揭示原矩阵中哪些列线性无关,但行变换本身可能会改变列。

问题 5

对于本课中的精确特征关系,为什么 <code>np.linalg.svd</code> 可能返回一个很小的正第三奇异值,而 <code>np.linalg.matrix_rank</code> 却返回 2?

显示分步解答

浮点运算会舍入中间计算结果,因此即使输入列按存储值来看精确相关,SVD 也可能无法得到逐位精确的零值。matrix_rank 会用容差比较奇异值;这个很小的值低于 NumPy 的默认阈值,因此会被计为零。该估算是数值结果,取决于容差和数据类型。

问题 6

当总时长等于移动端时长加网站时长时,说明为什么有无穷多组三个系数会产生相同预测。

显示分步解答

预测向量为 wmxm+wwxw+wt(xm+xw)w_m\boldsymbol{x}_m+w_w\boldsymbol{x}_w+w_t(\boldsymbol{x}_m+\boldsymbol{x}_w),化简后为 (wm+wt)xm+(ww+wt)xw(w_m+w_t)\boldsymbol{x}_m+(w_w+w_t)\boldsymbol{x}_w。对于任意 cc,替换为 (wm+c,ww+c,wt−c)(w_m+c,w_w+c,w_t-c) 后,两个组合权重都保持不变:(wm+c)+(wt−c)=wm+wt(w_m+c)+(w_t-c)=w_m+w_t,网站权重也同理。因此预测不变,原来的三个权重无法由这些预测唯一确定。

问题 7

一个矩阵的奇异值为 8、0.4 和 0.001。这能证明它的精确秩为 2 吗?判断数值秩还需要哪些信息?

显示分步解答

不能。三个奇异值都是正数;如果这些是精确值,精确秩就是三。第三个值很小,近似秩或数值秩判断可能会把它视为可忽略,但这需要依据矩阵尺度、浮点精度、测量噪声和后续任务选择容差。仅凭这些比值无法得出通用的截断标准。

问题 8

如果训练矩阵中的两个特征严格成比例,单凭秩能否断定其中一个对所有未来预测都没有用?请说明结论适用范围。

显示分步解答

秩描述的是所分析矩阵中特征列之间的线性依赖。如果这种比例关系来自一个对未来记录也成立的公式,那么其中一列就不会增加新的线性方向。也可能只是样本范围很窄造成的偶然现象,在新数据中不再成立。秩本身无法判定是哪种情况,也不能单独说明非线性用途或预测准确率。

资料来源

  1. Mathematics for Machine Learning book PDF
  2. NumPy documentation: numpy.linalg.matrix_rank
  3. NumPy documentation: numpy.linalg.svd