一、表格多了两列,真的多知道了两件事吗

小叶整理校园设备借用记录,准备让AI帮助分析归还后的清点工作。每笔借用可以包含相机套装和录音套装。相机每套固定有两件登记器材;录音套装按整套登记,本讲不再展开它的内部零件。下面四笔记录、器材规定和后续工作时间都是教学设定。

记录 相机套数c 录音套数r 总套数t 相机器材件数k
第1笔 1 0 1 2
第2笔 0 1 1 0
第3笔 1 1 2 2
第4笔 2 1 3 4

表格有四个数值字段,但总套数由前两列相加得到,相机器材件数由相机套数乘二得到。一旦知道某笔有几套相机、几套录音设备,另外两项也就确定了。让AI再生成十列类似的换算,并不会因此获得十种新的观察。

这不妨碍总套数对人有用。值班同学想快速看一笔需要交接几套设备,总数列比每次心算方便。这里需要分清的是:一列可以方便阅读,却未必增加独立的线性变化。 是否保留在业务表格中,和是否把它当作另一份独立特征交给分析程序,是两个相连但不同的判断。

小叶真正想知道的是:哪些列可以从已有列算回来,哪些列记录了原来没有的变化;如果让AI根据这四列拟合工作时间,为什么它可能给出几组不同的权重,却得到完全相同的预测?回答这些问题,需要认识线性相关和矩阵的秩。

秩听起来像一个专门用于考试的整数,但它在这里问得很具体:一张表中,最多能保留多少列,使得其中没有一列可以由其余列作线性组合得到?这个数比列数更能反映当前表格的线性结构。本讲就从这四笔记录出发,把这个判断做出来。

二、线性相关,关键在于能否用同一套系数重建

把一列当作一个向量

先沿表格往下读。相机套数列成为向量c=(1,0,1,2),录音套数列成为r=(0,1,1,1)。它们都有四个分量,每个位置对应同一笔记录。总套数向量t=(1,1,2,3),件数向量k=(2,0,2,4)。这里列向量的四个位置是四笔观察,和一行中的四个字段不是同一种含义。

整列之间满足:

这两个等式使用的是固定系数。无论看第几笔,总套数都是相机套数加录音套数,件数都是相机套数的两倍。它们没有为第1笔选一套系数、到第3笔又临时改规则。

线性组合就是将若干向量分别乘以固定数,再相加。系数决定每个向量参与多少。若一列能由其余若干列作这样的组合得到,它就没有给这组列增加新的线性方向。c、r、t放在一起时,t可以重建,所以这组三个向量是线性相关的。

为什么强调固定?假如给每笔记录单独设计系数,看到结果后总能想办法凑出许多数值。这样的逐条解释并没有找到列与列之间共同成立的关系。检验线性相关,要用一套系数同时解释所有位置;某个位置不满足,原来的精确重建就失败了。

这里的加减是在比较数列的关系,不是在安排把两笔真实借用合并或相互抵消。第3笔的数值恰好是前两笔相加,并不使第3笔失去自己的借用人、日期和记录身份。后面讨论行向量时,还会用到这一区别。

不成比例,仍然可能相关

c与r不是倍数关系。第一笔只有相机,第二笔只有录音设备;把c乘任何一个固定数,都不能在第二个位置得到r的1。t也既不是c的倍数,又不是r的倍数。但这三个向量合起来仍相关,因为t是另外两个的和。

所以只两两查看“这两列是不是完全一样”“是否差一个倍数”,会漏掉由三列或更多列共同形成的冗余。总数量、若干分项和若干汇总经常以这种方式相互约束。冗余关系可能藏在组合中,而不在任何一对字段之间。

把t=c+r移到同一边,会得到c+r−t=0。这给出线性相关的统一检验方式:能否让向量按照一组不全为零的系数组合以后,恰好得到零向量?

若存在不全为零的系数满足它,这组向量线性相关;若只有所有系数都为零才行,就称为线性无关,也叫线性独立。一定要排除“所有系数为零”这一种情况,因为任何一组向量都能被全零系数消成零,那样无法分辨它们的关系。MIT线性代数讲义用这一条件定义线性独立。

这个零组合为什么等价于可重建?在一组不全为零的系数中,选一个非零系数,把对应向量留在等号一边,其余项移过去,再除以这个系数,就能用其他向量表示它。检验零组合把“究竟删哪列”暂时放下,先问这组列有没有可替代的关系。

在本表中,若ac+br=0,第一笔的位置要求a=0,第二笔的位置要求b=0。因此c、r线性无关。这不是一句“它们看起来不同”的判断,而是由具体记录排除了所有非零组合。若一组向量包含零向量,它必然相关:只给零向量一个非零系数,其他系数取零,就已经得到零组合。

三、秩数的不是字段,而是能保留下来的线性方向

从一组列到列空间

将四列按c、r、t、k的顺序排成矩阵X:

X的形状是4×4,因为有四笔记录和四个数值字段。这个形状告诉我们存了多少个位置,却没有告诉我们四列能提供多少种独立的线性变化。

由c和r的所有线性组合组成的集合,是一个二维的线性空间。t和k已经在其中,加入它们不会扩大这个集合。全部列向量的所有线性组合构成矩阵的列空间;列空间的维数就是矩阵的秩,记作rank(X)。也可以把它理解为最多能从原列中选出的线性无关列数。

本例最多选两列,因为所有列都能由c、r重建;又确实能选出无关的c、r,所以rank(X)=2。前半说明不超过二,后半说明至少为二,两者一起才把秩确定下来。只看到四列里有一组相关关系,还不足以直接断言秩是多少。

一组线性无关、又能重建全部列的列向量,可以作为列空间的基。选择未必唯一。本表保留c、r最直观;保留c、t也可以,因为r=t−c,k=2c。哪种基方便,要看后续工作需要读取什么,而不是根据哪个字段在原表里排得更靠前。

如果只保留t,则不能唯一恢复两种套数。总数为两套,可能是一套相机加一套录音,也可能是两套相机。t只保留总量方向,丢掉了组成差别。要声称“删列不损失这些数值”,必须说明留下哪些列、用什么规则、能恢复哪些原字段。

换成几何语言看同一个限制

暂时忽略第四列k,只看每笔记录的(c,r,t)。这些点虽然写成三个坐标,却都满足总量等于两种套数之和。它们只能落在同一个过原点的平面上。增加一笔仍遵守总量定义的借用记录,可以让点在平面内换个位置,却不能让它跑出这个平面。

两种套数决定总数,记录落在同一个平面上
图 A07-01|两种套数决定总数,记录落在同一个平面上

图一:坐标依次为相机套数、录音套数、总套数。半透明平面满足t=c+r,四个点是表中的四笔记录。为便于显示只画了非负坐标的一部分;用于讨论线性空间时,这个平面还向其他方向延伸。

这幅图展示的是行记录所在的平面,而刚才列空间中的向量有四个分量。两者不是同一个空间。不过,它们给出了同一个秩:这张表的行空间维数与列空间维数相等。接下来用行消元看清这一点,避免把“都等于二”误读为行列向量本身相同。

一般而言,m行、p列矩阵的秩不会超过m,也不会超过p。列向量只有m个位置,不可能在这个空间中找到超过m个线性无关方向;而可选列本来只有p条。所谓满秩,是秩达到min(m,p)。在数据分析里,通常还会更具体地说满列秩或满行秩,说明关注的是哪一边。

例如只有十笔记录却放了二十个特征,二十列不可能全部线性无关。即使每列都起了不同名字,也无法突破这个线性代数限制。但十条记录、秩为十,并不保证数据已经足够代表未来情境;秩没有检查样本怎样抽取,也没有检查目标是否值得预测。

四、消元为什么能把冗余显出来

把已经解释过的部分扣掉

看X的行。第3行是第1行加第2行,第4行是第1行的两倍加第2行。将这些已经由前两行提供的数值关系扣掉,得到:

这一步叫行消元。此处不需要背复杂的操作序列:第3行减去前两行,第4行减去两倍第1行及第2行。留下的两个非零行是独立的;后两行变成零,说明它们原来的数值方向已经被前两行解释完了。

把一行减去另一行的倍数是可逆的,反向加回去就能恢复。因此这些可逆的行操作保留了原来的行空间,独立方向的数量不变。一般消元会得到阶梯形矩阵,其中每个非零行从左向右第一个非零数的位置,称为主元位置;主元个数等于秩。本例的主元在第一、第二列。

这里有一个很实用的区别:R的非零行可以给出原矩阵行空间的一组基,但要选原矩阵列空间的基,应按主元列的位置回到原X中取列。本例应取原来的c、r,不能把消元后前两列(1,0,0,0)、(0,1,0,0)直接说成原表的特征向量。行操作会改变列向量的分量值,但保留原列之间的线性关系。

行秩和列秩相同的关系,就可以通过消元建立:同一组主元既数出了独立的非零行,也指出了能独立解释原列的主元列。完整证明可以继续展开,但本例已经能让我们跟着可逆操作检查这个结论。MIT关于四个基本子空间的讲义进一步说明了行消元、行空间与列空间维数的关系。

程序能算秩,人要说明算的是什么

下面用NumPy检查这张明确给出的数值表。程序输入的是四个字段的数值,没有把记录编号、字段名称或单位文字混进矩阵。

可复制模板
import numpy as np

X = np.array([[1., 0., 1., 2.],
              [0., 1., 1., 0.],
              [1., 1., 2., 2.],
              [2., 1., 3., 4.]])
print(X.shape, np.linalg.matrix_rank(X))
print(np.allclose(X[:, 2], X[:, 0] + X[:, 1]))
print(np.allclose(X[:, 3], 2 * X[:, 0]))
# (4, 4) 2
# True
# True

第一行输出形状与秩,后两项检查已知的生成规则。这里计算得到二,与逐行、逐列的推理一致。它们承担的工作仍不同:秩告诉我们独立列有多少,后两项说明本例具体哪列可以怎样重建。

allclose是允许微小数值差异的程序检查,不是任意数据上精确等式的数学证明。在眼前这组小整数中,等式还可以逐项精确核对。后面遇到测量误差时,“几乎能重建”与“完全能重建”将需要不同处理,不能只看函数返回了一个整数就结束判断。

五、为什么权重不同,预测却可以完全一样

四个系数,未必能分别识别四种作用

小叶先建立一个极简的清点时间模型:每套相机需要3分钟,每套录音设备需要5分钟,本阶段不计固定准备、排队、维修或跨校区交接。它只是用来观察系数关系的教学模型,不是对实际人员效率的测量。四笔对应时间为3、5、8、11分钟。

若只使用两列,预测写成3c+5r,含义明确。若把四列全放进去,一般形式为:

每个系数把对应字段换成分钟贡献。c、r、t以套计,k以件计,所以相关系数分别以分钟/套、分钟/件理解;这里只比较同一表内各种代数分配,并未测得四种独立的真实工作环节。

有几组权重都能给出原来的四笔时间:

权重方案 相机列 录音列 总套数列 相机器材件数列
方案甲 3 5 0 0
方案乙 2 4 1 0
方案丙 1 5 0 1

乙把每套设备共同的一分钟放到总数列,再分别计剩下的工作;丙把一部分相机时间分给件数列,因为一套相机对应两件。每种写法的贡献相加,仍是每套相机3分钟、每套录音5分钟。相同预测并不迫使四个位置的系数各自相同。

所以看到AI报告“相机列权重为2,总量列权重为1”,不能直接解释成它发现了一个独立于相机和录音清点之外的总量效应。数据允许同一作用在相互重叠的字段之间重新分配。拟合程序输出一个数值解,和数据唯一确定了每项解释,是两件不同的事。

更一般地,把总量列系数增加λ,同时把相机列、录音列系数各减去λ,预测仍不变。这是同一个总数关系在系数空间中的表现。图二固定件数列权重为零,只展示这一条连续变化的权重族。

一组权重连续变化,四笔预测保持不变
图 A07-02|一组权重连续变化,四笔预测保持不变

图二:左图显示(3−λ,5−λ,λ)三项权重随λ变化;右图显示四笔预测一直为3、5、8、11分钟。它不是四次训练实验,而是由t=c+r直接算出的同预测关系。

即使再要求这些系数非负,取λ从0到3,仍然有很多组满足条件。附加“系数都不能负”未必足以辨认每种贡献。要获得唯一解释,需要检查真正增加了什么限制或证据,而不能只期待换一个更强模型就把重叠关系自动拆开。

零空间保存了哪些看不见的改变

若有一个非零向量z满足Xz=0,沿着z改变权重,不会改变Xw的输出。所有满足Xz=0的向量,包括零向量,组成矩阵的零空间。在本表中,两种基本变化可以写成:

第一种把相机和录音各一份系数挪到总量;第二种把相机两份系数挪到件数。它们分别对应t=c+r、k=2c。只要原权重能解释数据,再加上这些变化的任意线性组合,仍给出同样预测。

对于有p列、秩为r的矩阵,零空间维数为p−r。本例四列、秩二,因此有两个独立的权重变化方向不被当前输出察觉。这里数的是变化方向,不是说只有两组可用参数。每个方向都可以走连续不同的幅度,于是通常有无穷多组同预测权重。

这也帮助理解“某个解已经算出来”与“问题已经唯一确定”的差别。有些方法会选择长度较小的一组权重,或者惩罚过大的系数。这样可以选择较稳定、符合额外偏好的结果,但偏好是方法增加的,不是原来重复的观测忽然变成了独立证据。scikit-learn线性模型文档介绍了用系数惩罚改善相关特征问题的思路;怎样选损失与惩罚将在A12继续讲。

能重新分配贡献,也不能随意解释任意目标

现在改变教学条件:第3笔额外需要一分钟跨校区交接,其余三笔不需要。新的工作时间为(3,5,9,11),原来只按两种套数的模型少算了第3笔。这不是把上一段的八分钟测错了,而是明确加入了一个原模型未计的工作。

保留原四列,不管怎样换w,都不能精确得到这个新时间向量。因为原X第3行等于前两行之和,任何线性预测也必须让第3笔等于前两笔预测相加。前两笔若仍是3、5,第3笔就只能是8,不能单独变成9。

加总数、加件数没有帮助,它们仍受原关系约束。若要表达这个额外环节,应记录相应条件,或改变模型形式,而不是让AI对四个旧系数反复换写法。秩和列空间在此告诉我们:有些输出差异根本没有进入当前表示允许的范围。

六、增加数据时,哪些变化真的会提高秩

复制记录与获得新观察不是同一件事

若把四笔记录复制一百遍,矩阵行数大幅增加,秩仍是二。原来的总量与换算关系没有改变,重复行也没有提供新的线性方向。由复制得到的四百行,不能充当四百次独立测量。

但这不表示“秩不增加的记录都没有价值”。如果另一天确实发生了相同套数的借用,并实际测量了清点耗时,这是一笔新观察。即使输入行相同,新的耗时结果也可能帮助了解波动。秩只描述输入数值的线性结构,不负责统计观测是否独立、误差有多大。

同样,新加入一笔三套相机、两套录音的记录,它仍满足t=c+r、k=2c,不能把这四列的秩提高到三。但它可以扩大我们见过的数量范围,检验原时间模型在较大借用量下是否仍合适。增加观察覆盖与增加线性方向,各自解决不同问题。

相反,若开始只有前1笔记录,矩阵秩只能为一;加入只借录音设备的第2笔以后,秩升到二,因为我们终于见到了不能由原行倍数解释的组成。不是每加一行都升秩,而是新行是否走出了已有行空间。

新字段要有原字段解释不了的变化

回到第3笔的额外交接。增加一列h,记录是否需要该交接:四笔依次为(0,0,1,0)。它不是原表根据套数算出来的总量,而是另行核实的条件。

若试图用ac+br重建h,第一笔要求a=0,第二笔要求b=0;这样第3笔只能得到零,却需要一。这就说明h不在原列空间内。加入h以后,新表的秩从二升到三,预测可以写成3c+5r+h,得到刚才的(3,5,9,11)。

新增字段的作用因此十分明确:它记录了第3笔与“前两笔相加”相比多出的条件,而不是单纯让表格更宽。当然,四笔教学数值只展示如何表达这种差异,不能证明现实中跨校区交接永远恰好多一分钟。新字段是否改善实际预测,还要在后续记录中检验。

如果加的是每笔记录独有的编号,也可能使当前小表的秩上升。可编号高低未必与清点时间有稳定关系。甚至给每笔记录单独设一个指示列,就能把这几笔的任意目标分别记住;面对新记录,却没有因此学会如何估算。提高秩提供了更多表达自由,不自动提供更好的规律。

一个较低秩的表可能简洁地记录真实结构,一个满秩表也可能只是塞进了噪声和编号。小叶关心的仍是哪些变化与任务有关、怎样取得、能否在新数据上保持意义。秩帮助查清表示,不能取代任务评价。

七、有常数偏移时,先弄清有没有算上那一列

两种温标,为何可能被算成两列独立数据

换一个独立的小例子。小叶整理三次温度记录,摄氏数值为(0,10,20),对应华氏数值为(32,50,68)。华氏温度由摄氏温度乘1.8再加32得到,它显然没有提供另一份温度观察。

但直接把这两列放成3×2矩阵,矩阵的秩是二。它们不是线性相关吗?关键在于,前面说的线性组合只有乘系数和相加,并没有默默附带一个常数偏移。摄氏列的第一个位置为零,乘任何数仍是零,无法得到华氏列的32;两个非零列不成比例,所以这两列线性无关。

若同时放入全为一的列,关系就完整了:

此处c、f只用于温度例,分别是三次记录的摄氏和华氏数值,1是三个分量都为一的向量。三列合起来秩为二,华氏列可由摄氏列与常数列重建。在回归模型中,这个全一列对应截距:让预测即使在其他输入为零时,也可以有一个固定起点。

另一种处理是分别减去各列均值,称为中心化。摄氏列减去10,变成(−10,0,10);华氏列减去50,变成(−18,0,18)。中心化后两列恰为1.8倍关系,秩降为一。此时我们比较的是偏离各自平均值的变化,固定温标偏移已被移开。

所以“这两列只记录同一件事”并不保证未经处理的矩阵秩为一。它可能包含固定偏移,也可能包含非线性换算。看程序输出前,应知道输入是原值、中心化后的值,还是包含截距列的设计矩阵。这些约定会改变数值结构,不能把不同输入算出的秩当成程序互相矛盾。

中心化也不是必须对所有字段统一执行的清洗仪式。记录数量的绝对起点、某个固定基线可能对任务有意义。若保留均值和变换规则,中心化后的数据可以还原;若直接丢掉这些信息,后面就未必知道原数据从哪里起算。

类别指示与截距,也会产生精确重复

再看三种互斥的归还地点:北区服务台、南区服务台、集中仓库。对每笔记录各设三列,属于哪一类,那一列写1,其余写0。这叫独热编码。假设每笔恰属于其中一类,且三类在数据里都实际出现。

三种类别列本身线性无关,因为每一类都有一笔记录,能分别检验对应系数。但若再加上全一的截距列,总共有四列,就会出现关系:三个类别指示列相加,恰好等于全一列。因此这四列的秩为三,四个系数无法全部独立辨认。

一种常见表示是保留截距,再保留其中两种类别,把第三种作为参照。例如截距表示北区的基准,另两项表示相对北区的差别。也可以不放截距,直接让三列各承担各类别的水平。这些写法并不意味着现实中少了一种地点,而是用不同坐标表达同一组类别水平。

是否删去一列仍要结合模型及其约束。若某种类别根本没在样本中出现,对应列全为零,又多了不能由这些记录估计的部分。把字段名称写进程序,不等于数据已经提供了该类别的经验。独热编码的结构性依赖也不能拿来证明类别出现的概率相互独立。

八、差一点点就能重建,为什么仍可能很难分析

精确秩相同,稳定程度可以相差很大

前面的总数由程序严格相加,关系精确成立。实际测量却常带有微小差异:两路信号测到几乎相同的变化,但不是每个小数都一致。如果只问能否用固定系数把其中一路精确重建出来,答案可能是“不能”;如果要分别估计两路贡献,结果却可能非常不稳定。

另设一个已经统一尺度的无量纲教学系统。它有两个输入系数w₁、w₂,两次观测对应的矩阵为:

若目标b=(2,2.0001),解为w=(1,1)。第一条观测只告诉我们两个系数相加为2;第二条与它几乎一样,只对第二个系数多给了极小的一点区分。两条式子相减,便得到0.0001w₂=0.0001,w₂由这个很小的差值决定。

现在只将第二个目标数增加0.0001,改成b=(2,2.0002),矩阵M保持不变。新解变为(0,2)。观测数只是很小地变动,原先平均分担的两个系数却变成一个为零、另一个为二。

几乎相同的两条观测,对微小差异十分敏感
图 A07-03|几乎相同的两条观测,对微小差异十分敏感

图三:横轴δ表示在原第二个目标2.0001上增加多少,第一目标始终为2。曲线显示w₁、w₂怎样变化;δ从0移到0.0001,两系数便从(1,1)变为(0,2)。图中的数值均无量纲。

重要的关系在于:要把两种几乎重合的贡献分开,系统只能依赖很小的差异;这个差异如果受到测量误差影响,估计的分配就会大幅变化。这比单独说“两个输入很像”更具体,也解释了为什么训练数据拟合得很好,某个系数却可能一换样本就跳动。

M在精确数学中仍是满秩,秩为二。因为0.0001不等于零,理论上仍能区分两个方向。若把这里的1.0001改成1,两行便完全相同,精确秩降为一。但满秩只保证某些代数问题能唯一求解,不保证解对数据误差不敏感。scikit-learn对多重共线性的说明也指出,近似线性依赖会使系数估计对观测误差敏感。

数值秩必须和容差一起看

电脑存数和运算都有精度限制,测量本身也有误差。因此软件通常不靠小数是否恰好等于零来判秩,而是用一个门槛判断某个方向是否小到可被视为零。

NumPy的matrix_rank通过奇异值判断数值秩。奇异值的完整分解方法留到A09,这里先理解它所记录的作用:矩阵沿不同输入方向能够产生多大的输出变化。某个奇异值很小,就表示存在一个方向,输入变了不少,输出却几乎察觉不到。

本例M的两个奇异值约为2.00005和0.00005。第二个方向比第一个弱得多。使用足够小的数值容差时,程序仍会把二者都计入,得到二;若明确设定门槛0.001,第二个就被视为可以忽略,数值秩为一。

可复制模板
M = np.array([[1., 1.], [1., 1.0001]])
print(np.linalg.matrix_rank(M))
print(np.linalg.matrix_rank(M, tol=0.001))
for b in ([2., 2.0001], [2., 2.0002]):
    w = np.linalg.solve(M, b)
    print(np.round(w, 6).tolist())
# 2
# 1
# [1.0, 1.0]
# [0.0, 2.0]

两次秩输出使用了不同的判断门槛,不是矩阵在两行代码之间发生变化。默认门槛主要考虑浮点计算误差;手工设定的门槛则应结合数据尺度、测量不确定性及后续用途。tol=0.001只是本例展示规则变化,不能当成所有资料的通用设置。NumPy的matrix_rank文档专门区分了计算误差门槛与可能来自测量过程的其他门槛。

如果改用更小的计量单位,使某列数值统一放大一千倍,却保持原绝对门槛不变,软件对“多小算小”的判断也可能改变。因此近似冗余分析要先对齐量纲和尺度,再说明允许多大的误差。不能挑一个恰好让秩符合预期的门槛,却不解释为什么该差异对当前任务可以忽略。

至于怎样处理几乎重复的输入,可以把同类测量合为一项输入、保留更可靠的一路、重新设计观测,或对系数施加合适约束。不同方法改变的条件不同:合并使模型不再分别估计两路贡献;重新设计观测则争取取得更容易区分两路作用的数据;系数惩罚会限制估计可以怎样分配。它们都需要回到原来为什么难区分,而非只把报错消掉。

九、表示可以更宽,却没有更多线性自由

复制和线性混合不会制造新方向

回到设备表。令B只保存c、r两列,另用一个小矩阵记录如何生成四个字段:

这里C的每一列分别说明如何从两项原始套数得到相机数、录音数、总套数和相机器材件数。原表的四个字段经过两项中间数就能完整生成,因而不可能拥有超过两个独立线性方向。

一般地,两个矩阵相乘,乘积的秩不会超过任一因子的秩。就像本例,输出列都由B的列组合得到,C再怎样安排系数,也不能让输出列跑出B原有的列空间。一个纯线性流程若先把输入压到两个数,再线性扩成二百个数,也不能仅凭最后有二百个位置就宣称保留了二百个独立输入方向。

这能帮助理解AI系统中的一些小型适配层、线性压缩或中间表示。我们关心的不只是输出数组有多长,还要看它是经过多窄的线性通道生成的。低秩并非一定是坏事;如果任务本来只需要少数共同变化,用较少参数表达它们可能更经济。若重要差别恰好被通道丢掉,后面的线性扩展则无法把它重新创造出来。

这种分解在大矩阵中还有存储意义。假设一个1000×100的矩阵确实秩为二,且已取得对应的两个因子,保存1000×2和2×100两个矩阵,只需2200个数,而原矩阵有100000个位置。本例4×4分解成4×2与2×4,则前后都是16个数,并没有因写成乘积就自动节省存储。实际是否划算,要计算真正保存的内容及使用成本。

当数据只是近似低秩时,少量方向的表示可能舍弃一部分变化。舍弃了什么、保留多少以及怎样选择方向,是下一章投影和后续分解要继续解决的问题。本讲先建立能够检查的边界:线性重建是否成立,允许什么误差,少了哪些可区分的变化。

非线性构造,是另一种变化

若映射中加入平方、阈值等非线性处理,前面的纯线性结论不能照搬。另设三条输入x=(−1,0,1),再构造x²=(1,0,1)。这两列线性无关,因为平方列不能由原列乘一个固定系数得到。

新表的线性秩从一变成二,但平方值仍完全由x决定。我们没有新增一次观测,只是把原来不便用线性权重表达的形状,变成一项直接可用的特征。例如目标若本来就是x²,单独对x乘一个系数无法同时解释两端都为正;提供平方列后,就可以直接用这列表示目标。

这说明“线性独立”不等于“在所有意义上互不依赖”,也不等于概率论中的独立。两个字段可以由确定的非线性关系连接,却在线性代数中算作无关。秩是针对线性组合的概念,不能拿它单独衡量一张表包含了多少新事实、多少随机信息或多少真实知识。

冗余还会改变度量,不能只看能否恢复

复制一列没有增加秩,却可能改变后续计算。另设两个原始坐标,查询为(0,0),候选甲为(2,0),候选乙为(0,3)。按未加权的欧氏距离,甲距查询2,乙距查询3,甲更近。

如果把第一个坐标共保留三份,而第二个仍只保留一份,表示变成(x,x,x,y)。甲与查询的平方距离成为12,乙仍为9,结果换成乙更近。复制没有增加独立变化,却让第一种差异在距离里被重复计了三次。

因此“这列可以从其他列算回”并不表示“加上或去掉它,任何程序的结果都不变”。若后续算法直接在全部坐标上平均、算距离或施加系数惩罚,冗余会改变各项的相对作用。要保持原来的比较意义,还需同步设计权重或变换规则。这也是为什么整理AI输入不能只数列数,而要看数据怎样进入具体计算。

十、回到小叶的表,决定怎样保留和使用字段

现在可以给最初的四列表作一个明确安排。业务记录保留c、r、t、k,便于同学查看套数和器材件数;把t=c+r、k=2c作为可核对的生成规则。若导入后不再满足规则,先查是否有漏项、字段口径变化或套装组成改变,而不是立即把异常认成一个新的独立因素。

若当前模型只想表达两类套数与基础清点时间的关系,用c、r作为输入已经能表达原四列允许的全部线性预测。t、k仍可在展示时算出来。这个取舍保留了两类数量的区别,又避免把同一种作用分摊到几列之后,对单列权重作过度解释。

遇到第3笔额外交接,小叶增加经过核实的h字段,并明确把模型的工作范围从基础清点扩大到包含这一交接。新的条件需要新的记录与验证;不能把原3、5分钟参数自动说成已覆盖所有归还工作。若后续真实耗时有测量误差,也应评估稳定性,而非要求每一条都被精确拟合。

同一张表可以保留供人阅读的汇总列、供模型使用的原始字段和供检查使用的生成关系。它们各有作用,不必为了“没有冗余”把原始业务资料删得难以追溯。将表格交给AI时,小叶可以说明这些字段的关系,让分析围绕真实变化展开,而不是让程序把每一个名字都当成另一种独立因素。

以后再遇到“特征增加了”“向量升到更高维”“参数更多了”,我们就能追问:新增部分能否由旧部分线性重建,是否引入常数或非线性,数据有没有足够变化来区分这些贡献,以及后续计算怎样使用它们。秩给出的价值,是帮助我们看清表达中的自由与约束;最后保留什么,仍要由任务需要和实际证据决定。

十一、练习与参考分析

练习一:三列都不成比例,为什么仍有冗余

三个列向量分别为a=(1,0,1)、b=(0,1,1)、d=(2,3,5)。它们两两都不是倍数。三列组成的矩阵秩是多少?若保留b、d,能否恢复a?再加入e=(0,0,1),秩怎样改变?

参考分析: d=2a+3b,所以前三列最多提供两个独立方向;a、b的前两个位置又分别要求其零组合系数为零,二者无关,故秩为二。保留b、d可以由a=(d−3b)/2恢复a,这不是只允许保留最左边两列的问题。

若e能由a、b组合得到,它前两个分量均为零便迫使两个系数都为零,第三分量也只能为零,与e不符。因此e增加了一个新方向,四列组成的3×4矩阵秩为三。它已满行秩,但四列仍不可能全部独立。两两不成比例不能排除多列共同相关;字段更多也不改变行数给出的上限。

练习二:新记录什么时候能拆开原来分不清的作用

另设三笔记录,只保留相机套数c=(1,2,3)与录音套数r=(2,4,6)。每笔目标时间为7c。有两种解释:每套相机3分钟、每套录音2分钟;或每套相机5分钟、每套录音1分钟。现有数据能区分吗?若新增一笔一套相机加一套录音的实际测量,为什么可能有所帮助?

参考分析: 原记录始终r=2c,输入矩阵秩为一。两个系数只通过w_c+2w_r共同进入预测;3+2×2与5+2×1都等于7,所以三个原目标都被同样解释。把原三笔复制很多遍也不能拆开它们。

新增组成(1,1)不在原行方向(1,2)上,输入秩变为二。两种解释分别预测5分钟和6分钟,因此这笔有实际目标值的新观察可以提供区分证据。题目未给新增测量结果,不能先断言哪种解释正确;真实数据若有噪声,还要考虑误差。升秩说明原来完全重合的解释有机会被区分,不是自动选出某个正确系数。

练习三:常数列是否在比较范围内

三次记录x=(0,1,2),另一列z=(5,7,9)。只用这两列时矩阵秩是多少?加入全一列后,三列秩是多少?若两列各减自己的均值,又会怎样?请解释结果没有矛盾的原因。

参考分析: x与z不是倍数,因为x第一个位置为零而z为5,因此两列秩为二。z=2x+5×1,加入全一列后仍只有两个独立方向;例如x与1可以作为重建依据。三列相关不意味着原来不带常数的两列必须相关。

中心化后x变成(−1,0,1),z变成(−2,0,2),两列成倍数,秩为一。变化来自比较对象:原矩阵含有固定偏移,中心化后只看围绕均值的变化。若要还原原始数据,还需保留各列均值,不能把中心化丢掉的平均水平当成从来不存在。

练习四:输出相同,能否把系数解释为唯一贡献

回到开头的X。权重(3,5,0,0)与(4,6,−1,0)是否给出同样预测?这种一致只限于表中四笔,还是对所有遵守t=c+r、k=2c的记录都成立?若某新记录的总数列误填,情况又怎样?

参考分析: 第二组的预测为4c+6r−t,代入t=c+r即为3c+5r,因此两组都输出(3,5,8,11)。只要生成关系继续成立,无论套数怎样变化,这两个表达都相同;它不是偶然碰巧拟合了四个位置。

若总数误填为比c+r多一,第二组会比第一组少预测一分钟,因为它给总数的系数为−1。这不表示错填总数造成了现实清点提速,而是两个本来依赖同一数据规则的表达,在规则被破坏后产生不同结果。应先核对字段口径与生成过程,不能把这种差异当成某组权重揭示了新的因果效应。

练习五:满秩为何仍会放大微小变化

另设M=[[1,1],[1,1.01]]。目标从(2,2.01)变为(2,2.02),矩阵不变。两次解分别是什么?如果后来把第二行改成与第一行完全相同,又应怎样判断可解性和唯一性?

参考分析: 原两行相减得到0.01w₂等于两个目标的差。第一次差为0.01,w₂=1,w₁=1;第二次差为0.02,w₂=2,w₁=0。两次精确秩都为二,唯一解却对目标差异敏感。

若两行完全一样,矩阵秩变为一。目标两项相同且为2时,只需w₁+w₂=2,有无穷多解;目标两项不相同,则没有精确解。同样的输入行不可能在一个固定线性模型里输出两个不同的值。可在带误差的任务中另求近似拟合,但那已改变“完全满足两条观测”的目标,不能把近似结果称为原方程的精确解。

练习六:提高秩与获得新信息是一回事吗

三条输入x=(−1,0,1),新增平方列z=(1,0,1)。有人认为“秩提高,所以新增了一份独立测量”;另一人认为“平方完全可计算,所以它对任何模型都没有作用”。分别判断。若把x原样复制为三列,情况与加入z有什么不同?

参考分析: x、z线性无关,矩阵秩从一升到二,但z由x确定,没有新增一次观察。它为线性模型提供了原来无法仅靠x的倍数表达的曲线形状,例如目标就是x²时,新增列能直接参与表示。两种说法各把一种意义扩大成全部意义,因此都不成立。

复制x三次则不增加线性秩,列空间仍是一维。不过复制可能改变距离、平均或正则化中这项输入的权重,不能无条件说所有程序结果都相同。判断新增字段时,应分别看生成关系、模型能表达什么以及计算如何计入各坐标。这样才能同时避免把重复包装误认成新知识,也避免因为字段可计算就把有用的表示全部删掉。