小叶手里有一批只有左右两格的灰度图像。每张图用两个数记录,分别表示左格和右格的亮度。现在想给每张图只留一个数,之后还能够大致还原。可以取左格,可以取两格的平均,也可以保留两格的差。究竟选哪一种,不能只凭“看起来像一个重要特征”。

上一章讨论过:保留方向已经确定以后,把一条记录投影到这个方向,可以找到离原记录最近的近似。本章往前再走一步:怎样用整批数据选方向,让有限的坐标尽可能保留数据的变化?

主成分分析,简称 PCA,给出一种选择标准;奇异值分解,简称 SVD,帮助我们把选择、编码、重建放到同一套矩阵关系里。理解它们,能够看懂不少“把高维数据压到较低维”的处理究竟做了什么,也能判断 AI 提议的压缩办法是否适合当前任务。

本章的图像、记录及数值均为教学虚构。两格使用同一种无量纲亮度刻度,各条记录和两个字段在误差中权重相同。这个小例子是为了把关系看清,不代表真实图像只需要两个方向。

一、先把共同底色和每张图的变化分开

小叶先拿四张图做试验。表里一行是一条记录,一列是一个字段。

记录 左格亮度 右格亮度
1 7 9
2 9 7
3 11 13
4 13 11

这四张图有两种变化。记录1和2整体较暗,记录3和4整体较亮;同时,每一组内部又有“左边亮些”和“右边亮些”的区别。只留一个坐标时,这两种差异可能无法同时保存。选方向,实际就是决定优先保留哪种变化。

不过,原始数值还包含大家共有的亮度底色。左格的平均亮度是10,右格也是10。小叶可以先保存一个全体共用的平均图像 (10,10),然后记录每张图相对平均图像的偏离。这个过程叫中心化:每个字段减去它在这批记录中的平均值。

中心化后的四行是 (-3,-1)、(-1,-3)、(1,3)、(3,1)。第一行的负数表示左右格都比相应平均值暗,不是亮度真的变成了负数。以后把平均图像加回去,仍能回到原来的亮度刻度。

把原始表记为 ,中心化后的表记为 。本章的单条数学向量按列写,数据表则把这些向量转置后排成行。均值向量记为 ,于是:

这里的 是四个1组成的列向量,作用是把同一份均值复制到四行。这个写法记录的只是“大家先扣除同一张平均图像”,不需要另为每一行保存一个均值。

为什么这一步会影响选方向?假设拍摄时给每个格子的亮度都加上100,图与图之间的差别并没有改变。如果目的是研究它们怎样变化,就不应仅因共同底色变亮而换一套主要方向。中心化让方向选择围绕各条记录的共同中心进行,保留的重点落在差异上。

它也限定了我们稍后要找的近似图形:在中心化空间里找经过原点的直线;加回均值以后,就是原始空间里经过平均图像的直线。中心化没有删除均值的使用价值,只是把共同部分单独保存,让每张图不必重复承担同一份信息。

二、什么叫一个方向对整批数据“更好”

小叶先比较两个容易理解的压缩方案。第一个只记录左格相对均值的偏离,右格一律还原为平均值10。第二个记录两格一起变亮或变暗的程度,还原时让左右格亮度相同。

第一个方案的四张重建图是 (7,10)、(9,10)、(11,10)、(13,10)。第二个方案的重建图是 (8,8)、(8,8)、(12,12)、(12,12)。第二个方案没有逐格照抄,但同时照顾了两格,可能更接近整张原图。

要比较,需要先约定怎样计算“接近”。本章把每一格的重建偏差平方,再把所有格子的结果相加,叫总重建平方误差。平方使正负误差不会抵消,也使较大的偏差对总误差的影响更大。按这个标准,只留左格的方案总误差是20;两格共同变化的方案总误差是8。

这两个数字说明,在当前四张图、当前误差标准下,记录共同亮暗比只留左格更合适。但小叶还没有证明它比所有斜着的方向都好。我们需要一个能比较任意方向的办法,而不是挑几个顺眼方案以后宣布最优。

用单位向量 表示候选方向。单位向量的长度为1,这样各个方向使用相同的刻度。对于一条中心化记录 ,压缩坐标是它沿这个方向的有符号投影坐标 ,重建向量是 。

投影把每条记录分成两部分:留在线上的部分,以及垂直于直线、没有留下来的部分。它们相互垂直,因此原来的长度平方,正好等于这两部分长度平方之和。把四条记录一起加起来,得到:

左边由原始数据决定,不随候选方向变化。也就是说,同一批数据的变化总量已经固定:投影保留得越多,重建时丢失得越少。让压缩坐标的平方和最大,与让整批重建平方误差最小,是同一个选择。

这里的“变化总量”有明确口径:中心化表里所有数的平方和。本例是40。它不表示有40条信息,也不是某种物理能量;有些材料把这种平方和简称为“能量”,指的仍是这个数学量。

为何必须规定方向长度为1?如果把方向向量加倍,未经归一化的内积也会加倍,平方和跟着变成四倍,但直线本身没有换位置。我们不能把换了一把更长的尺子当作保留能力变强。比较方向之前统一长度,才是在比较朝向。

三、方差把“散得开”变成可比较的量

压缩后,每条图像只剩一个坐标。如果四个坐标几乎相同,这个坐标就很难区分这些图;如果它们在轴上展开,至少有一部分原有差异被保留下来了。PCA 正是从这种展开程度中选择方向。

因为原数据已经中心化,任何固定线性投影得到的这批坐标,平均值也为0。因此,上一节的坐标平方和除以共同的分母,就成为这些坐标的方差。本章采用样本方差口径,四条记录除以3;一般 条记录除以 。

分母在比较方向时相同,不会改变谁大谁小。PCA 所说的最大方差方向,就是压缩坐标在这批样本上散得最开的单位方向。它能够保留最多的总变化量,也能够达到最小的总重建平方误差。

在主案例里,描述这两种变化的单位方向是:

第一个方向同时增加两格亮度;第二个方向增加左格亮度、减少右格亮度。它们长度都为1,而且相互垂直。沿 观察,四条压缩坐标是 ,平方和为32;沿 观察,坐标是 ,平方和为8。

这些坐标的作用比具体根号更值得留意。第一组坐标把整体暗的两张图归到一起,把整体亮的两张归到另一边;第二组坐标则区分左格较亮还是右格较亮。两种变化在原数据里同时存在,只是第一种的幅度更大。

四条原记录、共同亮暗方向及其重建点
图 A09-01|四条原记录、共同亮暗方向及其重建点

图中的虚线把原记录连接到它在首方向上的重建点。每条虚线表示这张图没有保存的差异。记录1和2虽然在同一个重建点汇合,原来两点的左右差异仍然存在;只是这个一维方案没有保留它。

这里要区分两个对象。主方向是一条供所有记录共同使用的轴;主成分得分是各条记录投影后得到的坐标。很多场合会把轴或新变量都简称为“主成分”,阅读时要看它是在说一套字段权重,还是在说各条记录的取值。本章用“方向”和“得分”把它们分开。

只画出两个自然方向还不够。下一步要让数据自己告诉我们:为什么共同亮暗恰好应该排在第一位?

四、协方差矩阵怎样把共同变化汇总起来

假如有成千上万条记录,逐条观察它们朝哪里偏,很难稳定地选出方向。协方差矩阵把各个字段自己的波动,以及字段之间一起变化的情况,汇总成一张行数和列数都等于字段数的表。

对两个已经中心化的字段,同一行的两个数相乘,可以看出这一行的偏离是否同向:两个都高于均值或都低于均值,乘积为正;一高一低,乘积为负。把所有记录的乘积加起来,就能比较同向偏离与反向偏离各自贡献的总幅度。偏离较大的记录影响更大,这里并不是只数哪一种出现次数多。

主案例的四个跨字段乘积都是3,因此总和是12。左右格各自的偏离平方和都是20。将这些汇总值除以样本方差使用的同一分母3,得到:

对角线上的 分别是左右字段的样本方差;非对角线上的4是它们的样本协方差。两处非对角线相同,因为左格乘右格与右格乘左格得到同一个乘积,所以这张矩阵是对称的。

协方差为正,表示这批数据里两格偏离均值的变化有同向倾向。它没有说两格总是相等,更没有证明一格的亮度导致另一格变化。眼前四张图就有左右不相等的差异。协方差保留的是整体联动特征,不是逐条记录的完整历史。

这张小表怎样帮助比较任意方向?候选坐标是左右字段按方向权重加起来的结果。它的平方既包含两格各自的平方,也包含两格相乘的交叉项。这些量恰好都已被 汇总,因此:

这里 是整批投影坐标的样本方差。若方向的两项权重记作 ,上式在本例中就是 。其中的交叉项说明:两格本来常常同向偏离,用同号权重把它们合起来,能够让共同变化得到加强;用异号权重相减,共同变化则相互抵消。

这就是协方差在这里的用途。它不是另外一份必须背完的统计术语,而是把“每个方向都重新遍历所有图像”转化为“根据一张汇总表比较方向”。两个字段只需一张二阶矩阵;字段更多时,同样记录每对字段之间的这种关系。

用 代替 也能形成另一种常见口径,全部数会按相同比例改变。本章固定用样本协方差,避免混算;换分母不会改变主方向,也不会改变后面各方向方差的占比。

五、特征向量为什么能找到最大的方差

现在引入特征向量。对一个方阵,若某个非零向量经过矩阵作用后,仍沿原来的直线,只改变倍数,就称它是这个矩阵的特征向量;这个倍数叫特征值,写作 。

这个定义在本章不是让我们开始刷特征多项式。我们关心的是:协方差这张汇总表,有没有一些方向,可以把变化分开看,而不再相互混合?

直接让本例的 作用于共同亮暗方向,会得到原向量的 倍;作用于左右差异方向,会得到原向量的 倍。因此,前面的 正好是 的两条单位特征向量,对应特征值 。

为什么特征值正好等于该方向的方差?因为方差由 计算,而 在这个方向上等于 ;方向长度已经定为1,结果就剩下 。在协方差矩阵这里,一个特征值告诉我们:沿对应单位方向,这批数据有多大的方差。

还差最后一环:排第一的特征值,真的比其他斜向组合都大吗?本例的两条特征向量相互垂直且都归一化,所以任何单位方向都能写成 ,且 。这里用新的系数表示沿两条主方向的组合,区别于前面按左右字段展开的权重。用这两个方向组合时,得到:

这时不必反复试角度了。候选方向把同一份总权重分给两种变化,第一种每份对应的方差更大。只要拿出一部分给第二种,整体就不可能超过全部放在第一种时的方差。因此 确实是最优方向;它不是碰巧赢过了只看左格的方案,而是赢过了所有单位方向。

实对称协方差矩阵可以选出一组相互垂直的单位特征向量。把特征值从大到小排列,依次保留对应方向,就是普通 PCA 的主要计算思路。最大方差与协方差特征方向的关系,可参看 MIT 的 PCA 讲义。

第二主方向为什么不能继续选第一主方向?因为小叶已经保存了共同亮暗,再存一次同样的变化,不会增加新内容。PCA 要求后续方向与前面方向正交,在尚未保留的部分中继续选方差最大的方向。本例只有二维,第一条轴确定以后,剩下的就是与它垂直的左右差异轴。

在这组坐标里,不同主成分的样本协方差为0,表示它们在这批样本中的线性共同变化已被分开。这里并没有自动证明统计独立;“不相关”和“独立”的区别仍然有效。PCA 能整理线性变化关系,不会凭一次换轴消除所有可能的依赖。

六、SVD 把一张数据表拆成三部分

通过协方差可以找到方向,但小叶还要给每张图编码,并保存重建所需的量。SVD 把这些关系一起呈现出来。

奇异值分解把矩阵写成 。本例 是四行两列,使用简化形式时, 为四行两列, 为二行二列, 为二行二列。它们的乘法形状连起来,仍是一张四行两列的表。

先看右侧的 。它的两列,就是前面两条字段空间的单位方向 。每一列有两个分量,说明这个方向怎样把左格、右格组合起来。它不是四张图各有一个值的记录清单,而是全体图像共用的两种变化方式。

中间的 只有对角线上有数,其他位置为0。本例对角线是 和 。这两个非负数叫奇异值,按从大到小排列,分别表示两种变化在整批数据中的强度。

左侧的 则说明每种变化怎样分布到四张图。为了看清其含义,本例可以选:

的第一列在前两张图为负、后两张为正,对应整体较暗和整体较亮;第二列按负、正、负、正排列,对应左暗右亮和左亮右暗。每一列的长度也被归一化为1,因此这些 还不是原本的亮度坐标。

把 的每列乘上相应奇异值,才得到整批主成分得分:

这个关系对理解代码尤其重要。 给出共同使用的字段方向; 是四张图在这些方向上的坐标; 只保存得分列归一化以后的样子。若小叶把 直接当成未缩放的压缩坐标去重建,原有变化幅度就会丢掉。

为什么奇异值平方会出现在协方差里?将 代入 ,利用 的列相互正交且长度为1,中间会留下 。所以 的特征值是奇异值的平方;再除以 ,就是协方差特征值。本例的 与 由此接上。

SVD 对一般实矩阵也成立,不要求原矩阵是方阵,也不要求它先中心化。中心化是当前 PCA 目标选择的一部分。方向、两边的单位向量与奇异值的基本关系,可参看 MIT 的 SVD 讲义。

七、把乘法展开,就能看见一张张秩一表

三张矩阵相乘仍有些抽象。把 SVD 按方向拆开,就变成两张小表相加:

这里 是 的第 列, 是 的第 列, 是对应奇异值。一个列向量乘一个行向量叫外积。它会生成整张表:行向量给出共同模板,列向量提供每一行使用这个模板的倍数。

第一张表记录四张图共同变暗或变亮的部分。每一行的左右格相同,只是使用模板 (1,1) 的倍数不同。第二张表记录左右差异,每行都是模板 (1,-1) 的倍数。这两张表各自只有一种独立行方向,且不是全零表,因此各自的秩是1。

一个“成分”不是原表中的一列,也不只是某一张图的局部。它可以影响全部记录和全部字段。小叶保留第一项时,没有选出一张最有代表性的原图来复制;他保存的是一种共用变化模板,以及各张图使用它的程度。

中心化数据由共同亮暗和左右差异两张秩一表相加得到
图 A09-02|中心化数据由共同亮暗和左右差异两张秩一表相加得到

把两项都留下,再加回均值,原来的四张图能够完整重建。完整分解改变了表示方法,本身没有进行有损压缩。从分解中只留下前面若干项、舍弃后面的项,叫截断 SVD。舍弃非零奇异值对应的项才会造成重建损失;删去本来就是零的项,不会改变原表。

若保留前 个方向,把这些方向排成 ,压缩坐标是 ,中心化重建为 。在主案例中 ,保留下来的正是图中共同亮暗那张表,加回均值就得到 (8,8)、(8,8)、(12,12)、(12,12)。

这也能帮助理解存储是否真的减少。假设原数据有 条记录、每条 个字段,原来要保存 个数。采用这里的 PCA 表示,需要保存 个坐标、 个方向分量,以及 个均值,合计约 个数,暂不计文件格式和数字精度。

本例只有四条两字段记录,原来8个数;保留一个坐标,加上方向和均值,也有8个数。它展示了降维关系,却还没有获得存储节省。记录很多时,共同方向和均值的成本才容易摊薄。判断压缩有没有收益,要把重建依赖的公共参数一起算进去。

八、“最佳低秩”究竟保证了什么

现在我们知道,舍弃第二项会留下总平方误差8。但会不会存在另一张秩一表,不按这套分解构造,却比它更接近原表?这个问题比“从现有两项里选哪项”更强。

最佳低秩逼近的结论是:在秩不超过 的所有矩阵中,截断 SVD 给出的 ,能够使所有元素重建偏差的平方和最小。这个平方和也写作 Frobenius 范数的平方,记为 。本章始终使用这一个误差口径。MIT 关于 Eckart–Young 定理的课程讨论了这一结论。

可以沿已经理解的投影来看原因。任何秩不超过 的候选重建表,它的所有行都落在某个至多 维的共同空间里。先固定这个空间,每条原记录在其中最近的位置,就是正交投影。若候选表的某行没有用最近点,把那一行改成投影,只会减小或保持误差,而且所有行仍在同一空间里。

因此,没有必要到所有可能的表格里逐项乱找。只需比较不同的共同保留空间,并在选定空间里用最近点重建。这就回到了 PCA 所解决的问题:有限的正交方向,怎样保留最大的总变化量?

前面用两个方向的权重解释过一维最优。推广到 维,先把每一条单位主方向投影到候选保留空间,计算投影的长度平方。它表示这个方向有多少被捕捉:完整落在空间里时为1,与空间垂直时为0,倾斜时在两者之间。这里的主方向取遍字段空间的一套完整正交基,零方差方向也包括在内。

为什么这些捕捉比例加起来是 ?候选空间可以选出 条相互垂直的单位轴。任取其中一条,按完整主方向展开,它的各个坐标平方和是1,正如前面二维例子的两个平方系数之和为1。把这件事对 条轴分别做一遍,全部平方系数合计就是 ;再按原主方向分组,每组正好是那条方向被候选空间捕捉的投影长度平方。

于是,每个主方向贡献给重建的变化量,等于它自身的奇异值平方乘以这个捕捉比例。不同主方向的贡献可以相加,因为它们的得分在这批中心化数据中互不相关,交叉乘积的合计为0。

有限的总比例优先分给变化量最大的方向,能够保留最多。于是直接完整保留前 个主方向就达到上限,任何倾斜的混合都无法超过它。这里使用的是各方向相互正交、以平方和衡量误差的条件;如果换成业务评分,这个比较理由不会自动照搬过去。

分解中的各个秩一项也相互正交:把两张不同成分表的对应元素相乘,再把乘积相加,结果为0,因而不会在误差平方和里产生交叉贡献。因此,只保留前 项时,最小误差就是尾部奇异值平方之和:

主案例里只丢第二项,误差就是8。保留两项,误差为0;一个方向也不保留,只用平均图像代表所有记录,误差则是40。这三个选择对应不同保留能力,不是算法算得好不好造成的波动。

“最佳”还对应当前整张数据表。假如未来图像的变化方式不同,旧方向在新数据上可能不再最好。假如表里有缺失值,把缺失处随手补成0再做 SVD,优化的就是补过零的那张表,也不是直接解决“未知值应该是什么”的问题。先明确被逼近的对象,才能使用最优结论。

九、保留80%的方差,为什么可能丢掉任务的全部线索

本例第一方向保留32,全部变化量为40,因此第一方向的解释方差比例是80%。这个名称的意思是:原数据围绕均值的总平方变化中,80%落在保留方向上。它不表示分类准确率有80%,也不表示保留了80%的信息熵。

小叶给这套表示安排两种不同任务。第一种只需把四张图按整体明暗分成两组,第一坐标就够用了:整体暗的得分为负,整体亮的得分为正。第二种要判断哪一格更亮,这时第一坐标就不够。

看记录1和2。它们沿第一方向得到完全相同的坐标,但一张右格较亮,另一张左格较亮。记录3和4也一样。只接收这个一维坐标的下游程序,无论计算多复杂,都无法根据相同输入稳定地区分这两个相反答案。若四条记录等权,每个相同坐标对应两种标签各一条,最好的确定分类也只能答对其中一半。

沿第二方向的得分虽然变化量较小,正负却正好区分左右谁亮。在这个任务中,需要保留的恰好是被普通一维 PCA 舍弃的方向。算法没有算错;它一直在最小化重建平方误差,而小叶现在在乎的是另一种结果。

这使“主要”一词有了准确边界。PCA 的主要方向是大方差方向,不是经过任务验证的重要方向。它不读取“左右谁亮”这种标签,也不会从这四条记录的数值关系里自行决定小叶更关心哪一个问题。

选择维数时,可以先看累计方差,再看实际任务。另设一批教学数据,它有四个非零方向,各自的奇异值平方为64、25、9、2,总和100。保留前一个方向是64%,两个是89%,三个是98%,四个才是100%。

四个方向的累计保留方差与剩余平方误差
图 A09-03|四个方向的累计保留方差与剩余平方误差

如果事先确定“至少保留95%的训练数据方差”,这组数据应取三个方向;若要求至少85%,两个已经满足。这种阈值把候选范围缩小,却仍然不是任务验收。小叶还需要在没有参与拟合的数据上,比较实际要完成的检索、识别或重建效果。

此外,小奇异值是否对应噪声,需要额外依据。某些测量误差确实只带来细小、分散的变化;某种罕见但重要的缺陷,也可能因为出现次数少而贡献较小。仅凭排列靠后,不能把它命名为噪声。删去它能否改善结果,应回到数据来源和任务测试中判断。

十、中心、尺度与方向稳定性,会改变你对结果的解读

普通 PCA 先中心化;直接对原始矩阵做 SVD,则是在逼近原始数值本身。这两个操作有关系,但目标不同。用前面的矩阵约定,可以写出:

后面多出的一项来自整批数据共有的均值。若均值很大,原始 SVD 可能优先描述共同底色。为了看清区别,另设四条记录,保留原案例的中心化偏离,只把共同均值改成 (100,0)。四条原始记录便是 (97,-1)、(99,-3)、(101,3)、(103,1);这里数字只是两个一般测量字段,第二字段允许为负。

此时研究围绕均值的变化,PCA 仍选择两字段一起变化的方向。但原始矩阵第一字段有很大的共同底值,不先扣除它,直接做 SVD 的首方向就会接近第一字段轴。不能因为两个结果不同,就说其中一个分解程序出了错;先看双方试图保留的是变化还是原始幅度。

**中心化也不等于标准化。**中心化减去均值,仍保留各字段原有的变化尺度。本章按字段标准化时,进一步除以各自的样本标准差,让每个非恒定字段按同一口径计算的样本方差变为1。

假设小叶把一列距离从米改记为厘米,这列的数扩大100倍,误差平方会扩大一万倍。如果算法仍把各列误差直接相加,相当于在新的数字尺度里大幅提高了这一列的影响。实际距离没变,所用的衡量方式却变了,主方向自然可能改变。

标准化常用于让量纲、数值规模不同的字段在相近尺度上参与比较。但它也作出了选择:把每个字段相对自身波动的偏离拿来比较。一项本来波动很小、主要是测量误差的字段,标准化以后也可能得到与稳定信号相近的影响。应该按任务决定误差怎样计入,不能把标准化当成永远正确的一键修复。方差为0的恒定字段不能直接除以0,要单独处理。

方向的正负号是另一种常见困惑。用 和用 指向同一条轴,只是坐标正负相反。如果方向和对应得分一起变号,重建完全不变。看到软件把一整列符号翻转,不要只因正负与纸上不同就判断结果错误。

若两个特征值恰好相等,在它们共同张成的空间里旋转坐标轴,保留的总方差也相同。此时数据没有选出唯一的单条轴。两个特征值非常接近时,小幅数据变化就可能使各条轴明显转动;若关心的是两条轴共同保留的空间,它仍可能比较稳定。解释结果时,要分清是在追踪一条具体方向,还是一整个保留空间。

十一、从一次计算变成可重复使用的表示

下面用 NumPy 完成主案例。代码中的数组按行保存记录;mu 是每列均值组成的一维数组,减法会把它应用到每一行。Vt 对应数学里的 ,因此取它的前几行并转置,才得到以主方向为列的 Vk。

可复制模板
import numpy as np

R = np.array([[7, 9], [9, 7], [11, 13], [13, 11]], dtype=float)
mu = R.mean(axis=0)
X = R - mu
U, s, Vt = np.linalg.svd(X, full_matrices=False)
k = 1
Vk = Vt[:k].T
Z = X @ Vk
reconstructed = Z @ Vk.T + mu
ratio = s**2 / np.sum(s**2)
print(np.round(s, 4))
print(np.round(ratio, 4))
print(np.round(reconstructed, 4))
print(round(float(np.sum((R - reconstructed)**2)), 4))

奇异值约为 [5.6569, 2.8284],解释方差比例为 [0.8, 0.2],重建的四行是 [8,8]、[8,8]、[12,12]、[12,12],总平方误差为8。计算方差占比时使用奇异值的平方,而不是直接用奇异值相加作分母。零变化数据的全部奇异值都为0,不能直接用这段比例公式除以0。

full_matrices=False 使用简化形状,避免把重建不需要的完整方阵一起返回。这里输入是实数,所以接口里的 Vh 可以按 理解。输出含义及形状可查 NumPy 的 SVD 官方文档。

如果想验证正负号的影响,可以单独运行下面这段。它把第一条方向和对应得分同时反转,再比较重建。

可复制模板
import numpy as np

X = np.array([[-3, -1], [-1, -3], [1, 3], [3, 1]], dtype=float)
v = np.array([1., 1.]) / np.sqrt(2)
z = X @ v
before = np.outer(z, v)
after = np.outer(-z, -v)
print(np.allclose(before, after))

结果为 True。这不是说任何不一致都可以用“符号任意”解释。如果只翻方向、不翻坐标,或者把某条方向配上另一条的得分,就破坏了重建关系。核对分解结果时,能够重建、方向正交、强度对应,比逐项要求符号相同更可靠。

拟合完成后,新图像应怎样处理?用已经保存的均值和方向。假设新图是 (12,14),先减去训练时的均值 (10,10),得到 (2,4);沿共同亮暗方向编码,再加回同一均值,重建为 (13,13)。它保留这张图整体较亮的程度,舍弃左右差异。

可复制模板
import numpy as np

mu = np.array([10., 10.])
v = np.array([1., 1.]) / np.sqrt(2)
new_record = np.array([12., 14.])
score = (new_record - mu) @ v
restored = mu + score * v
print(round(float(score), 4))
print(np.round(restored, 4))

输出约为 4.2426 和 [13., 13.]。若为了处理每条新记录,都临时拿它自己作为均值,相减会直接得到零向量,原本需要识别的变化也消失了。如果每批数据分别拟合不同方向,各批坐标也未必具有可直接比较的意义。

训练与应用因此需要分开:先用训练数据确定均值、需要时的尺度、保留方向;把这些共同参数保存下来,再用于新数据。若要评估对未来数据的效果,验证数据就不应先参与这些参数的拟合。常用 PCA 工具同样保存训练集的字段均值,且中心化不自动等于逐字段缩放,可核对 scikit-learn 的 PCA 文档。

十二、小叶现在怎样选择这一个坐标

回到最初的问题:小叶希望每张两格图像只保留一个数,之后大致还原。如果“大致还原”明确按这四张图所有亮度格子的平方误差评判,那么选择共同亮暗的第一主方向,保存均值、方向以及每张图的得分,有充分依据。总误差是8,比只保存左格偏离的20更小,而且已经达到这个一维重建问题的最小值。

小叶也知道这个选择的代价是什么。重建后的每张图左右一样亮,原来的左右差异被舍弃。若这些压缩坐标接下来只是用来按整体亮暗分组,四条教学记录上的目标可以完成;若要区分左亮还是右亮,就必须改变表示,保留第二方向,或者专门保存左右差值。

若要求这四张图经同一套线性编码和重建后,两格亮度都准确还原,就需要保留两维,因为中心化后的四点不在同一直线上。若只要完成明暗和左右两项分类,则不能直接断言一定要两维:四条记录的左格数值各不相同,专门设计分类规则也能用这一列区分它们。这种表示是否适合后续数据,需要另作任务验证;它也不具备第一主成分的最小重建误差保证。

面对更大的向量表,同样的理解能够帮助小叶审视 AI 提出的方案。看到“用 PCA 压到几十维”,他能继续追问:数据按什么尺度参与计算,均值是否保存,维数依据是变化量还是任务验证,未来记录是否沿同一规则处理。每一个问题都对应前面一段具体关系,不只是往方案后面加一句“注意效果”。

本章也留下了一个明确的新问题:如果重要变化本身沿着弯曲关系展开,少量直线方向可能无法同时保留它们。继续增加主方向是一种办法,改变特征表示则是另一种办法。下一章讨论升维与特征构造时,会从这个区别往前走。

练习与参考分析

练习一:只保留一列,是否就是第一主成分

主案例里,左右字段各自的样本方差都为 。小叶说:“既然两列方差一样大,随便留一列,就是一维 PCA。”这句话成立吗?请说明判断依据,并指出保留一列与保留一个主成分的区别。

**参考分析:**不成立。两列方差相同,只说明两个原始坐标轴在这个指标下打平;PCA 还允许把字段作线性组合。共同亮暗方向的方差为 ,高于任何一列单独的方差,因此一维 PCA 会选组合方向。只保留左格时,右格回到均值,总平方误差20;保留首方向时,两格共同重建,总平方误差8。

两种操作都让每条记录剩一个数,但存的不是同一个对象。保留列是在现有字段中挑选;保留主成分是在字段空间中构造共同方向,再为每条记录计算坐标。如果未来任务特别需要原字段的直接含义,也可以主动选择保留列,只是不要把它的目标和 PCA 的最优重建混为一谈。

练习二:哪一个数才是方差比例

另有一张已经中心化的数据表,非零奇异值为6和2。保留第一个方向的解释方差比例是多少?总重建平方误差是多少?如果这张表共有5条记录,第一方向的样本方差又是多少?

**参考分析:**两个方向的平方变化量为36和4,总和40,所以第一方向比例为90%,舍弃第二方向的总误差为4。5条记录按样本方差口径除以4,第一方向方差是9。

三个结果回答不同问题。90%描述保留量相对总量的占比;4是当前整张表被舍弃的平方变化量;9是首坐标按样本方差口径衡量的波动。不能用 当方差比例,也不能把舍弃的奇异值2直接当成平方误差。至于90%是否足以完成任务,题目没有提供相关证据。

练习三:方向变了,是不是算法不稳定

两个程序分解同一张表。程序甲把某条主方向记为 ,该方向的得分列为 ;程序乙使用 ,得分列为 。它们的重建有什么区别?若有两个相同的最大特征值,却只要求保留一维,不同程序选出不同方向又说明什么?

**参考分析:**第一种情况下,重建项分别为 和 ,完全相同,差别只是轴的正向约定。应比较配对以后的重建,不能只看某个分量正负。

第二种情况下,两个最大特征值相同,说明它们对应平面里没有唯一的最大方差单轴。不同程序可以给出不同但同样最优的一维方向。它们的具体重建可能不同,最小总误差却相同;这与第一种“连重建都完全相同”的变号情形不同。若保留的是整个对应平面,换一套正交基不会改变投影到这个平面的结果。

练习四:存储账要把哪些量算进去

小叶有1000条记录,每条20个字段,准备保留3个主成分。只按本章的坐标、方向与均值计数,原来和压缩后各需保存多少个数?如果重建后仍把完整的1000行20列表长期保存,是否实现了这里讨论的存储节省?

**参考分析:**原表需要20000个数。压缩表示需要3000个坐标、60个方向分量和20个均值,共3080个数。这个比较暂时假设每个数占用相同空间,不计文件元数据和不同精度。它说明公共参数需要计入,也说明在记录较多时可以摊薄其成本。

若长期保存完整重建表,还另外保存压缩表示,总存储不会仅由3080个数构成。要获得这项节省,应保存紧凑表示,需要时按方向和均值重建。与此同时,少存了多少与误差是否可接受是两项判断:本题没有给奇异值、数据内容或任务结果,因此只能核算数量,不能宣布压缩质量合格。

练习五:一维表示能不能判断左右谁亮

仍用主案例,设四条记录等权。只给分类程序第一主成分得分,要求它判断左格是否比右格亮。为什么不能靠“把分类模型换得更强”解决?如果允许重新选择一个坐标,你会选什么?

**参考分析:**记录1和2的第一得分相同,但标签相反;记录3和4同样如此。程序仅看到相同得分时,无法知道当前是哪条记录。对每一组给固定答案,必有一条答错,因此在四条等权记录上的准确率最多为一半。问题出在表示已经把需要区分的记录合并,不是分类程序缺少复杂计算。

可以保留第二方向的得分,或直接保存左格减右格。前者是归一化差值,后者没有除以 ,但两者符号都能回答左右谁亮。这个一维选择适合当前分类目标,却会失去整体亮暗信息,也不再是最小重建平方误差的一维选择。说明目标以后,才能评价哪种表示更合适。

练习六:新批次应该重新减谁的均值

训练时保存均值 (10,10) 和共同亮暗方向。新批次的两条记录是 (12,14)、(14,12)。小叶打算为了方便,先减掉新批次自己的均值再沿旧方向投影,并把得到的坐标与训练坐标直接比较。这样会漏掉什么?

**参考分析:**新批次自己的均值是 (13,13)。减掉它以后,两条记录变成 (-1,1) 和 (1,-1),沿共同亮暗方向的得分都为0。但它们相对训练均值的整体亮度确实提高了,使用训练均值时,两条得分都是 。逐批重新中心化,已经把这次整体变亮从坐标中扣掉。

若目标是比较相对训练分布的位置,应继续使用训练时保存的均值。若另一个任务只研究每批内部差异,逐批中心化可能有其用途,但必须说明坐标参考中心发生了变化,不能把两个口径的0解释成同一种状态。保存并使用共同参数,既是程序步骤,也是保持比较含义一致的条件。