矩阵秩衡量 AI 特征中的独立信息
通过主元或特征计算矩阵的秩,联系行与列的视角,并用奇异值识别冗余数据特征。
一个数据集可以有三列特征,却只包含两个独立的变化方向。当模型试图为总是一起变化的特征分别分配效应时,这一区别就很重要。矩阵的秩计算矩阵中的独立方向数,无论我们考察的是特征列还是样本行。
学完本课后,你将能够通过寻找主元计算矩阵的秩,解释为什么行和列的视角会得到同一个数,并读懂奇异值预览,而不把每个小值都当成精确的零。
**学习目标:**计算秩,并联系行与列的视角。
本课汇集了行阶梯形和维数的概念:主元标识独立方向,秩则对它们计数。《Mathematics for Machine Learning》第 2.6.2 节通过线性无关的行和列定义秩。此处的数据矩阵、特征解释、奇异值图表、计算和练习均为原创内容。
三列特征只承载两个方向
设想有四次会话,记录用户在移动应用、网站上的使用分钟数,以及总活跃分钟数。每行代表一次会话,每列代表一项测量:
每一行的总时长都由移动端时长加上网站时长得到:
因此,这三列彼此相关。总时长这一命名测量仍然有用,但在这个特定矩阵中,它没有增加新的线性方向。前两列线性无关:第三行中只有网站列非零,因此可以排除网站列的非零倍数;随后看第一行即可排除移动端列的非零倍数。所以,列空间的维数是二。
这里 表示四次会话, 表示三个特征,因此秩最多为三。我们已经证明三列彼此依赖,而前两列线性无关,所以 。
用行中的主元计算秩
解线性方程组时,为了保持解不变,行变换也必须施加在等号右边。在这个特征矩阵上,消元会保持秩并揭示主元。先用第 2 行减去第 1 行的两倍来替换第 2 行,再用第 4 行减去第 1 行来替换第 4 行。然后用新第 4 行减去第 3 行,并把非零的第三行移到第二行:
有两行非零,也有两列主元,所以秩为二。原矩阵的第一、二列构成其列空间的一组基;第三列等于前两列之和,因此该列没有主元。
直接从行的视角也能得到相同结果。把样本行写作 。第二行等于 ,第四行等于 。第一行和第三行线性无关,因此行空间的维数也是二。一般来说,对每个有限矩阵(包括长方形矩阵),行秩和列秩都相等;转置会交换这两个空间,却不会改变其中独立方向的数量。
奇异值预览这些方向
面对含噪声或规模较大的矩阵,软件通常通过奇异值分解(SVD)估算秩。SVD 将矩阵表示为 ,其中 的对角元素是非负奇异值,按从大到小排列。每个值表示矩阵沿一对方向作用的强度。精确的零表示相应方向不存在。
在本例中,奇异值约为 、 和零(浮点舍入误差范围内)。除以最大值可以得到不受整体尺度影响的预览:、 和约等于 。第三条柱消失,是因为总时长特征恰好等于另外两项之和。第二个方向比第一个弱,但仍然非零。这些比值不是解释方差的百分比:奇异值表示尺度,而它们的平方是 的特征值。对于中心化数据,这些平方值与相应方向上的方差相关,差别只在共同的归一化因子。
奇异值预览
特征矩阵中仍有两个方向
每根柱表示一个奇异值除以最大奇异值后的结果。由于总时长等于其他特征之和,考虑浮点舍入误差后,第三个方向为零。
- 第一个方向1.000
- 第二个方向0.059
- 第三个方向≈ 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. 是四舍五入后的输出,并不表示每台计算机算出的奇异值都逐位精确为零。
秩能识别模型权重中的冗余
一个不带截距的线性模型使用权重 ,将四次会话的预测写为 。设权重 分别对应移动端、网站和总时长。由于总时长是前两项之和,
尽管模型存储了三个权重,影响预测的只有两个组合权重。对任意数 ,把 替换为 ,所有预测都会保持不变。因此,在这个数据集上,秩为二意味着单凭这些预测无法唯一确定三个系数。正则化可以选出一组权重,但秩计算本身无法判断哪个特征应该具有因果或语义解释。
这就是 AI 应用:秩衡量数据矩阵中有效的线性特征多样性。在冗余派生特征影响系数解释或最小二乘拟合之前,秩可以帮助发现它们。这个数并不衡量数据集中的全部信息,也不能预测模型准确率或捕捉非线性关系。改变数据行、特征定义或预处理方式,都可能改变秩。
判断近似依赖时要说明容差
本例构造出的总时长是精确之和。现实测量则可能满足 。此时,数学上的精确秩可能为三,即使最小奇异值很小。如果某个方向低于选定的容差,数值秩可能会把它视为可忽略。当这一区别会影响决策时,应报告容差和数据尺度。
特征缩放也会改变奇异值大小。将某个特征列乘以非零常数会保持精确秩不变,却可能改变用于数值秩或近似秩判断的奇异值比值。因此,解释小奇异值时,标准化并非无关紧要的步骤。秩描述的是所选编码下矩阵中的线性依赖;它不会给每列分配固定数量的语义信息。
如果矩阵有 列特征但只有 个独立方向,行阶梯形可以显示哪些列能构成一组基,而奇异值则显示这些方向在数值上有多强。接下来要问矩阵把什么映射到哪里,以及它会丢失哪些输入方向:核与像能明确表达这两个问题。
检查理解情况
问题 1
对于一个 5 × 3 矩阵,最大可能秩是多少?秩为 2 对它的列和行意味着什么?
显示分步解答
最大秩是 。如果秩为二,列空间的维数就是二,因此只有两列线性无关,三个列中至少有一列是其他列的线性组合。行空间的维数也为二,即五行中只有两行线性无关。这并不表示矩阵只有两个元素或两条记录。
问题 2
在会话矩阵中,验证导致一个特征冗余的列关系。哪两列线性无关?
显示分步解答
把列看作向量:、、。逐个分量相加可得 ,因此三列线性相关。前两列线性无关:若 ,第三个分量给出 ,再由第一个分量得到 。它们张成一个二维列空间。
问题 3
第二行是第一行的两倍,第四行是第一行与第三行之和。为什么由此可知行秩为 2?
显示分步解答
这两个等式说明第二行和第四行没有提供新方向。第一行与第三行线性无关:如果 ,由第一个分量得到 ,再由第二个分量得到 。所以两条线性无关的行构成行空间的一组基,其维数是二。
问题 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
当总时长等于移动端时长加网站时长时,说明为什么有无穷多组三个系数会产生相同预测。
显示分步解答
预测向量为 ,化简后为 。对于任意 ,替换为 后,两个组合权重都保持不变:,网站权重也同理。因此预测不变,原来的三个权重无法由这些预测唯一确定。
问题 7
一个矩阵的奇异值为 8、0.4 和 0.001。这能证明它的精确秩为 2 吗?判断数值秩还需要哪些信息?
显示分步解答
不能。三个奇异值都是正数;如果这些是精确值,精确秩就是三。第三个值很小,近似秩或数值秩判断可能会把它视为可忽略,但这需要依据矩阵尺度、浮点精度、测量噪声和后续任务选择容差。仅凭这些比值无法得出通用的截断标准。
问题 8
如果训练矩阵中的两个特征严格成比例,单凭秩能否断定其中一个对所有未来预测都没有用?请说明结论适用范围。
显示分步解答
秩描述的是所分析矩阵中特征列之间的线性依赖。如果这种比例关系来自一个对未来记录也成立的公式,那么其中一列就不会增加新的线性方向。也可能只是样本范围很窄造成的偶然现象,在新数据中不再成立。秩本身无法判定是哪种情况,也不能单独说明非线性用途或预测准确率。