一、两个数压成一个数,留下的究竟是什么

小叶想给一批校园图示制作更小的预览图,准备让AI协助编写处理程序。先不考虑复杂图片,只取一个由左右两格组成的灰度片段。两格亮度分别为6和2,数值越大表示越亮。这里的亮度采用统一的无量纲刻度,所有图片、记录和后续数值都是教学设定,不对应真实相机测量或某种图片格式。

如果只允许为这个片段保存一个数,最容易想到的办法是保存平均亮度4。需要显示时,把两格都填成4。原片段是左亮右暗,重建片段则两格一样亮。平均亮度保住了,左右差别没有保住。

再看另一个片段:左格2、右格6。它与第一个片段的平均亮度也相同。如果程序最后只收到那个4,就无法知道原来究竟哪边更亮。即使接上一个能力很强的AI,它也不能仅凭同一个4,确定两种可能中的哪一种曾真实出现;若作出选择,还要依靠另给的信息或额外假设。

这就是降维需要面对的问题。我们想用更少的坐标表示数据,却不可能只凭“数组变短了”判断处理是否合适。要说明保留了哪种变化、舍弃了哪种变化,以及舍弃的部分是否影响后面的工作。

若预览只要求显示大致明暗,这个平均值可能有用;若任务是识别左右方向,压掉的差别恰好就是要用的内容。同一种表示,在两种任务中会得到不同评价。线性代数可以先帮助我们把“保留”和“丢失”说清,再讨论用途。

本讲从这个两格片段开始。先固定想保留的方向,学习怎样找到距离原数据最近的表示;随后把方法扩展到多个方向、整批数据和最小二乘。如何从大量数据中自动选择方向,留到下一章主成分分析与奇异值分解继续讲。

二、投影:在允许的重建结果里,找离原数据最近的一个

先规定可以重建成什么样

把两格亮度写成列向量x=(6,2)ᵀ。若重建时两格必须同亮,那么允许的结果只能是(c,c)ᵀ,其中c是共同亮度。几何上,这些向量落在过原点、方向为a=(1,1)ᵀ的直线上。

暂时让c可以取任意实数,以便讨论完整的线性空间;本例最终得到的4符合非负亮度要求。真实应用若另有限幅、非负或整数约束,需要把这些约束加入重建规则,不能默认为下面的线性空间计算已经处理了它们。

这里的“最近”,按两个位置的误差平方相加衡量。重建成(4,4)时,左格少了2,右格多了2,平方误差为8;若重建成(3,3),一个位置差3,另一个差1,平方误差为10。两个格子受到同等对待,误差越大,平方后的影响也越大。

更完整地,把共同亮度记作c,误差平方和可以写成:

这个式子显示的关系是:左右亮度原有的差异,决定了同亮度重建至少要损失多少;在此基础上,若共同亮度再偏离4,还会额外增加误差。右边第二项不可能为负,因此4是最好的共同亮度,而8是这个重建限制下无法消除的误差。

正交投影就是这样的最近点:给定一个线性子空间,在其中找到与原向量欧氏距离最小的向量。因为距离和距离平方在非负范围内同增同减,最小化它们会选中同一个点。下文提到投影,若没有另作说明,指的就是这种正交投影。

剩下的误差,为什么刚好垂直

将投影记为p=(4,4)ᵀ,原向量与投影的差叫残差,记为e=x−p=(2,−2)ᵀ。p代表保留下来的共同亮度,e代表重建时舍弃的左右差异。原数据可以完整地拆成x=p+e;只有不再保存e时,才发生了信息丢失。

两格亮度向共同变化直线作正交投影
图 A08-01|两格亮度向共同变化直线作正交投影

图一:横轴和纵轴分别是左格、右格亮度。蓝色直线表示两格同亮的所有重建结果。原点到p表示保留部分,从p到x的箭头表示残差;该箭头与蓝线垂直。

用内积可以检查这件事:(1,1)与(2,−2)的内积为零。残差中左格多出的量,与右格少掉的量相互抵消,没有剩余的共同增亮或共同变暗成分。若残差还沿着共同亮度方向留有分量,就能继续调整c,靠近原片段;到了最优位置,这种可调整的余地已经用完。

这种解释比把“垂直”只当作图上的直角更有用。它告诉我们,在已经允许保留的方向上,投影没有再漏下一段可以通过移动重建点来消除的误差;留下的误差属于所选空间之外的方向。MIT关于子空间投影的讲义也从残差与保留空间正交的条件建立投影。

三、投影公式,记录的是方向与剩余误差的关系

普通方向向量与单位方向向量

现在把方法写成可以复用的形式。设a是一个非零方向向量,要将x投到a张成的直线上。投影一定是a的某个倍数,可以写成p=αa。这里α是沿所用方向向量的组合系数;a的长度怎么规定,会影响α的数值。

我们已经知道,最优残差x−αa应与a垂直。把这个条件用内积写下,便有aᵀ(x−αa)=0,整理得到:

分子检查原数据沿保留方向的共同成分,分母则消除所用方向向量自身长度的影响。同一条直线可以由a表示,也可以由2a表示;换一个长度,不应改变最近点。分母正是让重建结果保持一致的必要部分。

在两格片段中,用a=(1,1),系数α为4,得到p=(4,4)。若改用a′=(2,2),系数变成2,重建仍为(4,4)。这两个系数不同,却没有保存不同的亮度信息,因为它们搭配的方向向量也不同。

如果预先把方向缩成长度为1的单位向量u=a/‖a‖,分母就等于1。此时沿该方向的带符号坐标为z=uᵀx,投影为uz:

因此,平均亮度4与单位方向坐标4√2并不是两个互相矛盾的答案。前者搭配方向(1,1),后者搭配长度为1的方向u。只要解码规则对应,它们可以表示同一个投影;若混用系数和方向,重建的亮度就会错。

坐标带有符号,是因为方向本身有正反。若把u换成−u,坐标也变成−z,二者相乘仍得到p。系数的正负并不单独意味着图像好坏;它首先表示相对于所选坐标方向的位置。在围绕基线表示变化时,负坐标也很常见。

一次短计算,检查三个不同的对象

下面分别保留低维坐标、原空间中的投影和残差。程序中的u是一维NumPy数组,含两个元素,所表示向量的欧氏长度为1;数学上仍按列向量理解。@在这里计算内积。

可复制模板
import numpy as np

x = np.array([6., 2.])
u = np.array([1., 1.]) / np.sqrt(2)
z = u @ x
p = u * z
e = x - p
print(round(float(z), 6))
print(np.round(p, 6).tolist())
print(np.round(e, 6).tolist())
print(round(float(e @ e), 6), np.allclose(u @ e, 0))
# 5.656854
# [4.0, 4.0]
# [2.0, -2.0]
# 8.0 True

z只有一个数,p和e各有两个数。这里真正适合作为一个数保存的是z,或与它等价的平均亮度;p是需要展示时重建出的两格向量。不能因为p仍写了两个位置,就说没有降维;也不能把p的两个位置当成两份独立保存的信息。

四、为什么最近点唯一,为什么留下的部分不等于有用的部分

勾股关系给出了最优性的理由

在蓝色直线上另选一个重建向量q。原向量与q的差x−q,可以拆成残差x−p和保留直线内的变化p−q。两部分垂直,因此它们的平方长度相加:

这说明,一旦得到投影p,在允许空间内再换成别的位置,只会在既有残差上增加另一项非负误差。只有q=p时,新增项才为零。所以最近点是唯一的。即使用来表示这个点的方向向量存在重复,使组合系数不唯一,最近的重建向量本身仍唯一;这与上一章“同预测、不同权重”的区别相通。

同样的道理适用于平面以及更高维的线性子空间。关键不是图片画得出几条坐标轴,而是残差与所选空间里的每个方向都正交。只与某一个方向正交,在还有其他保留方向时未必已经最优。

把q取为原点,还得到x的平方长度等于投影与残差的平方长度之和。在本例中,原来的40分成保留的32和舍弃的8。对于固定刻度、固定原点下的这一个向量,可以说保留了80%的平方长度。

这80%不是“保留了80%的意思”,也不是图像识别有80%正确率。左右片段(6,2)和(2,6)都被重建为(4,4),它们的方向区别已经完全消失。如果目标恰好是判断左亮还是右亮,平方长度比例不能替这个目标作答。

误差标准改变,最近点也可能改变

前面把左右位置看得同样重要。现在另设目标:左格的平方误差按三倍计,右格按一倍计,共同亮度仍只能取一个数c。新的误差是3(6−c)²+(2−c)²,可以整理为12+4(c−5)²,所以最优共同亮度变成5。

这时重建更照顾左格,允许右格多承担一些偏差。它在新标准下优于共同亮度4,却不再是原欧氏标准下的最近点。没有任何一个算法同时无条件满足所有“最近”的含义。

对AI输入作压缩也是如此。某些字段尺度大,某些差别对任务代价高,某些错误必须单独检查,这些都可能改变合理的误差标准。本讲继续使用等权欧氏距离,以便看清几何结构;选择其他权重时,要一起改变所讨论的最优性,不能只改评价口号而沿用原结论。

五、换一套坐标还没有丢失信息,舍弃坐标才开始降维

共同亮度方向之外,还有一个很自然的方向:左格增亮、右格变暗。用单位向量v=(1,−1)ᵀ/√2表示,它与u垂直,两者长度都为1。这种相互垂直且各自长度为1的方向组,称为正交归一组。

对于x=(6,2),沿u的坐标是4√2,沿v的坐标是2√2。如果两个坐标都保存,重建为:

此时我们只是把“左格、右格”改写成“共同亮度、左右差异”,两个数仍是两个数,可以完整还原。对于这两个正交单位方向,坐标变换还保留欧氏长度和距离。换一套观察方式,不等于已经压缩。

若只保留共同亮度坐标,就相当于把左右差异坐标设成零,于是得到p=(4,4)。先换到适合描述数据的方向,再舍弃其中一些坐标,是许多线性降维方法的基本做法。它也让损失更容易命名:本例丢掉的是左右反向变化,而不是笼统地说“丢了一半数据”。

两格原值本身也构成一套坐标,直接删除右格当然也是降维。若按坐标轴正交投影重建,结果是(6,0),平方误差为4;投到共同亮度线则误差为8。这并不推翻前面的最优性:前面只在同亮度直线上找最近点,并没有宣称那条直线对这个样本优于所有其他直线。

事实上,对单个非零向量,直接选择它自身所在的方向,就能用一个系数零误差地表示它。但若每条记录都单独保存一条方向,方向本身也要占用空间;若统一使用这条方向,其他记录又未必接近它。我们真正想找的是对一批资料或一个任务有用的共同表示,不能把每个样本各自换一种规则所得的零误差,算成免费压缩。

这也解释了为什么本章把“给定空间怎样投影”和“怎样选择空间”分开。前者有清楚的最近点答案,后者还要考虑数据分布、任务、保存成本与验证结果。理解投影,能让我们看清选择方向之后必然发生什么,却不会自动替我们选出最佳任务表示。

六、投影矩阵,把保留方向和舍弃方向写进一次运算

投过一次,再投一次为什么不变

单方向投影可以写成p=Px。对于单位方向u,矩阵P=uuᵀ;在两格共同亮度例中:

P的每一行都把左右亮度平均后填入一个输出位置。它是2×2矩阵,但秩只有1,因为两个输出总是相同,只有一个可独立变化的方向。

已经同亮的片段再做一次同样平均,不会继续改变;左右恰好反向的变化(2,−2)则被送成零。用矩阵关系表示,就是P²=P。这个性质叫幂等,意思是同一操作重复一次,结果不再变化。

幂等不代表第一次没有损失,也不代表多做几次会越来越好。本例第一次已经抹掉左右差异,之后重复同一投影不会把它找回来。若实际程序每次还叠加舍入、截断或换一套方向,整个程序也就不再只是同一个精确矩阵P,结果未必保持不变。

残差同样可以用矩阵表示为e=(I−P)x,I是保持原向量不变的单位矩阵。P取出共同亮度,I−P取出左右差异,两者合起来仍是原数据。我们不是发现原数据只有一部分存在,而是在选择把哪部分传给后续程序。

幂等还不足以保证欧氏最近

正交投影矩阵还有Pᵀ=P,也就是矩阵对称。对于实数欧氏空间,幂等与对称一起刻画正交投影。只检查重复运算不变,还不够判断它是不是最近点。

例如另一个规则E把左格复制到右格:E=[[1,0],[1,0]]。对(6,2),结果为(6,6);再做一次仍是(6,6),因此它也幂等,而且输出仍落在两格同亮的直线上。但它的平方误差为16,大于平均重建的8。

区别在于,E舍弃变化的方向不是与目标直线垂直的方向。它完全服从左格,改变右格;P则在当前等权误差标准下同时考虑两个位置。看到某个处理叫“投影层”,不能只凭名字套用最近点和长度不增的结论,还要看它实际是哪种映射。

这个小反例也提醒我们检查程序的动作。一个结果已经落在目标空间里,只证明输出形式符合要求;它是不是该空间内的最好近似,还需检查残差和误差标准。把“符合表示限制”与“在限制下最优”分开,后面的多方向情形才不会混乱。

七、保留多个方向:少量坐标怎样重建一个长向量

从两格扩展到四格

现在小叶处理一个四格片段,按从左到右的顺序记录亮度x=(6,2,1,3)ᵀ。另设一个明确的压缩规则:前两格保存一个平均值,后两格保存另一个平均值。重建时,每组内部同亮,但两组之间可以不同。

这次保留空间有两个独立方向。用q₁=(1,1,0,0)ᵀ/√2表示前组共同变化,用q₂=(0,0,1,1)ᵀ/√2表示后组共同变化。它们没有重叠的位置,各自长度为1,内积为零。将两个方向作为列,组成4×2矩阵Q:

先用Qᵀ读出两个方向的坐标,再用Q把坐标放回原来的四个位置。本例z=(4√2,2√2)ᵀ,对应两组平均亮度4和2。重建p=(4,4,2,2)ᵀ,残差e=(2,−2,−1,1)ᵀ,平方误差为10。

四格片段的两坐标表示与重建残差
图 A08-02|四格片段的两坐标表示与重建残差

图二:原值与重建值按相同位置排列,下面画出原值减重建值的残差。每组的残差都一正一负、合计为零;它们不能靠调整该组共同亮度再减小平方误差。

这里留下的两个坐标分别控制两个互不重叠的变化方向。虽然没有保存组内明暗差异,但前组整体比后组亮这一关系仍在。这比直接给四格取一个总平均值保留得更多,也比原四个坐标保留得更少。

为什么可以逐个方向读取坐标

若Q的列都是正交单位向量,就有QᵀQ=I。这个关系的每个对角位置为1,表示各方向长度为1;非对角位置为零,表示读取一个方向时,不会把另一个保留方向的坐标混进来。

因此,对p=Qz再次读取坐标,Qᵀp=z。它说明低维坐标可以从重建结果中完整取回。另一边的QQᵀ却是原空间里的投影矩阵,通常不是单位矩阵:本例它是4×4,而QᵀQ是2×2。两个乘法方向承担不同工作,不能因符号相近就互换。

一般地,原向量有d个分量,保留k个正交单位方向,Q形状为d×k。Qᵀ把d维输入变为k维坐标,Q把k维坐标重建成d维近似。重建后向量有d个位置,但只能在一个k维空间里变化。

如果x恰好属于保留空间,残差为零,虽然只保存k个数,也可以完全还原它。若x还有空间外的成分,那部分不会出现在z中。能否无损不由d和k两个整数独自决定,还要看当前数据落在哪里。

整批数据的行列方向

实际数据表通常每行放一条记录。若X形状为N×d,同样一组保留方向Q用于每条记录,低维表应写成Z=XQ,形状N×k;重建为ZQᵀ,形状N×d。这与单个列向量的Qᵀx没有矛盾,只是记录在矩阵中横着排还是竖着排的区别。

可复制模板
Q = np.array([[1., 0.], [1., 0.],
              [0., 1.], [0., 1.]]) / np.sqrt(2)
X = np.array([[6., 2., 1., 3.],
              [2., 6., 3., 1.]])
Z = X @ Q
X_hat = Z @ Q.T
error = X - X_hat
print(Z.shape, X_hat.shape)
print(np.round(X_hat, 6).tolist())
print(np.round(np.sum(error ** 2, axis=1), 6).tolist())
print(np.allclose(error @ Q, 0))
# (2, 2) (2, 4)
# [[4.0, 4.0, 2.0, 2.0], [4.0, 4.0, 2.0, 2.0]]
# [10.0, 10.0]
# True

两条不同记录在这里得到相同的低维坐标和重建值,因为它们只有组内顺序相反,组平均相同。最后一项检查每条残差在保留方向上的内积是否接近零;它是检查当前计算的证据,不是断言真实图片已经适合这种压缩。

如果把Q的两列交换,Z的两列也必须随之交换;如果把一个方向改为反向,该坐标也应改符号。方向、坐标与解码规则成套使用,才表示同一件事。把不同版本的低维表直接拼在一起,即使列数一样,也可能是在混合两套不同含义的坐标。

八、方向不垂直时,为什么不能把几个单独投影直接相加

小叶接到另一段AI生成的程序。程序收到几个方向后,分别计算x在每个方向上的投影,再将结果相加。对于刚才的q₁、q₂,这样做成立,因为两个方向正交。若方向之间有重叠,直接照搬就可能出错。

回到二维向量x=(6,2),另设a₁=(1,0)、a₂=(1,1)。它们线性无关,可以张成整个平面,所以投到它们共同张成的空间,结果理应仍为x,没有任何分量需要舍弃。

但是,x向a₁单独投影得到(6,0),向a₂单独投影得到(4,4)。直接相加却成为(10,4),并不等于原向量(6,2)。两个方向都读到了部分相同的变化,逐个读取时没有扣除重叠,相加就重复计入了它。

问题不在于两个方向不能使用,而在于不能把普通基的组合系数一律当成各方向的内积。相同空间可以有许多组基,其中只有正交单位基能直接用Qᵀx读出不互相混合的坐标。

联立处理方向之间的重叠

令A把a₁、a₂作为列,拟用系数向量w重建p=Aw。要求残差与每个保留方向都正交,可以一起写成Aᵀ(x−Aw)=0,也就是:

AᵀA的元素,是各个方向彼此之间的内积。因此它既记录每个方向的长度,也记录不同方向的重叠。右边读取原向量与各方向的关系,左边则检查一组组合系数在这些相互重叠的方向上会产生什么结果。

在当前例中,AᵀA=[[1,1],[1,2]],Aᵀx=(6,8)ᵀ。联立得到w=(4,2)ᵀ,重建为4a₁+2a₂=(6,2)。用第二个方向承担两格共同的2,再由第一个方向补左格剩下的4,就能看清这组系数为什么与两个单独投影的系数不同。

当A的列线性无关时,AᵀA可逆,于是正交投影可以写成:

这个公式不是比QQᵀ更高级的另一套目标。它仍在寻找同一保留空间里的最近点,只是适应了基向量不垂直、不等长的表示。当A本来就是正交归一的Q时,中间的AᵀA变成单位矩阵,公式自然简化为QQᵀ。

也可以先换成同空间内的正交方向

在这个小例中,从a₂中扣除它沿a₁的部分,便得到(0,1)。于是原来的两个方向可以改成(1,0)与(0,1),它们张成的仍是整个平面,却不再互相重叠。这种“扣掉已覆盖部分,再规范长度”的思路,是正交化的入口。

处理较大的数值矩阵时,可以用QR分解等方法取得正交基,不必手工对每个方向反复消元。NumPy的QR文档说明了Q的正交列及不同输出形状。这里不展开算法实现,但需要知道:若原列本来相关,就应先识别有效秩,不能把软件为补齐维度而给出的所有方向,都当作原数据实际张成的方向。

同样,公式中出现逆矩阵不等于编程时应该显式求逆。下一节会直接求最小二乘解。我们保留上述公式,是为了说明方向之间的关系怎样影响坐标,而不是要求把每次投影变成一串矩阵求逆题。

九、最小二乘:目标不在可表达空间里,就找最接近的输出

三条时间记录,未必有一条直线全都穿过

现在切换到一个独立的时间估计例子。小叶记录某个简化文本处理步骤:输入页数依次为1、2、3页,对应时间为5、5、11秒。假定只考虑这一步,不计上传、人工复核和其他流程;这些数值仍是教学设定。

小叶先试一个线性形式:预测时间为c+dn,其中n是页数,c表示模型里以秒计的固定部分,d表示每多一页增加的预测时间,单位为秒/页。这里是在选择一种近似表达,不是已经证明真实耗时总按这条规律增长。

若想三笔都精确拟合,前两笔同为5秒会要求斜率为零,第三笔却又升到11秒,三条要求无法同时满足。此时让AI反复换c和d,也不能使这条直线穿过三个点。我们可以改变模型形式,也可以先在当前形式中找一个误差最小的近似。

把三个预测一起写成向量,便有:

A的第一列让三个预测共同移动,第二列让预测按页数变化。所有Aw构成一个二维列空间;三项实际时间b不在这个空间中。最小二乘寻找使‖b−Aw‖²最小的w,也就是把目标向量b正交投到A的列空间,得到最接近的可表达输出。

这个例子中的两个空间要分清。在“页数—时间”的二维图上,我们画一条拟合直线,测量各记录的纵向时间偏差;在三个时间组成的R³中,我们把整个b投向一个过原点的平面。前者的误差不是数据点到图中直线的最短几何距离,后者的残差才与列空间正交。MIT的最小二乘讲义也区分了这两种观察方式。

最好的近似仍然留下明确的残差

计算得到c=1、d=3,三个预测为p=(4,7,10),残差b−p=(1,−2,1),误差平方和为6。残差相加为零,按页数加权相加也为零,所以它同时与A的两列正交。

这两条关系有具体含义:仅把所有预测整体抬高或压低,不能再减少误差平方和;仅调整页数斜率,同样不能再改善。固定部分与斜率已经在当前等权平方误差标准下达成最佳配合,但这不意味着每笔误差都很小,更不意味着每笔误差都相同。

固定线性形式下的最小二乘预测和纵向时间残差
图 A08-03|固定线性形式下的最小二乘预测和纵向时间残差

图三:横轴是输入页数,纵轴是该步骤耗时。实心点为三笔教学记录,直线对应预测1+3n;虚线只沿纵向连接每条记录与它的预测,分别对应残差1、−2、1秒。

残差是当前模型尚未表达的差别,不能仅凭正交就把它叫作无用噪声。它可能包含测量变化,也可能包含遗漏条件或不合适的模型形式。比如第二笔存在题面未记录的缓存条件,这只是一个可以调查的假设,不能因为需要解释−2就把它写成已经发生的事实。

程序直接求解,不把空数组当成零误差

可复制模板
A = np.array([[1., 1.], [1., 2.], [1., 3.]])
b = np.array([5., 5., 11.])
w, reported_residuals, rank, singular_values = np.linalg.lstsq(A, b, rcond=None)
p = A @ w
e = b - p
print(np.round(w, 6).tolist(), rank)
print(np.round(p, 6).tolist())
print(np.round(e, 6).tolist(), round(float(e @ e), 6))
print(np.allclose(A.T @ e, 0))
# [1.0, 3.0] 2
# [4.0, 7.0, 10.0]
# [1.0, -2.0, 1.0] 6.0
# True

lstsq直接返回最小二乘系数,同时给出秩等信息。我们仍显式计算b−Aw,才能知道各笔残差是什么;一个误差总数不能说明偏差集中在哪些记录。NumPy返回的reported_residuals是特定条件下的残差平方和数组,并不是逐条残差向量。

当矩阵列不独立,或行数不大于列数时,那个返回数组可能为空;空数组不能直接解释成拟合误差为零。若最小二乘系数有多组,函数会返回其中欧氏范数最小的一组。NumPy的lstsq文档给出了这些规则。它们是程序接口的选择,不改变“最近输出向量唯一、冗余系数可能不唯一”的区别。

十、数据不围绕原点变化时,要把基线一起保存

前面共同亮度方向穿过原点。真实记录可能围绕某个固定水平变化。仍用两个分量作独立例子:已给定参考基线μ=(10,2),新记录为x=(13,3)。这次想保留的是围绕该基线的共同变化,而不是强迫两个原始值相等。

先看相对基线的变化x−μ=(3,1),向(1,1)方向投影得到(2,2),再把基线加回来,重建为(12,4)。它与原记录的残差为(1,−1),平方误差为2。

如果漏掉基线,直接将原值(13,3)投到过原点的同值直线上,会得到(8,8),平方误差为50。两个运算优化的是不同的重建集合:前者允许的结果是(10+c,2+c),后者允许的是(c,c)。不能把后者的较大误差归咎于投影公式算坏了。

像μ加上一个线性子空间这样平移后的集合,叫仿射子空间。它保留了原来方向之间的关系,但整体不一定穿过原点。给定正交单位列Q,围绕基线编码与重建可以写成:

前面的例子把μ作为已经给定的参考,不是从这一条记录估出了总体均值。对一批资料,也常用每个字段的样本均值作为中心,先研究围绕中心的变化;怎样从这样的变化选择主方向,是下一章的重要内容。

无论基线怎样确定,都要与方向、坐标一起保存。若后来只剩z,却不知道当时减了哪个μ,同一组坐标可能还原到许多不同的原始水平。丢掉基线不是又多压缩了两个可随时找回的数,而是改变了能够恢复的信息。

应用于新记录时,也要使用约定的基线和方向。若每来一条数据就随意更换中心,旧坐标与新坐标所指的原始状态可能不同。为比较新旧表示,至少要保留各自转换规则,或者统一重新编码;相同维数不能保证坐标可直接比较。

这里还要区分“减去一批数据的共同字段均值”和“每条记录各自减去自己的平均值”。后一种做法会主动去掉每条记录自己的整体水平,例如每张图片各自有多亮;前一种保留了记录之间相对于共同中心的亮度差。两种操作都可能被叫作中心化,但丢掉或保留的差别并不相同。

十一、投影后距离变小,为什么近邻反而可能换了

如果同一个正交投影用于两条向量,它们之间的欧氏距离不会变大。原因仍是正交分解:两条向量的差,也被拆成保留部分与舍弃部分;去掉其中一部分,不会增加平方长度。

若两条记录低维坐标分别为z₁=Qᵀx₁、z₂=Qᵀx₂,Q的列正交归一,那么低维坐标距离等于原空间两个投影的距离,且不超过原距离:

然而,每一对向量缩短多少可以不同。靠近被舍弃方向的差别可能大量消失,靠近保留方向的差别则几乎原样留下。因此“每个距离都不增”并不等于“距离排序不变”。

另设一个二维检索例子:查询为(0,0),候选甲为(1,5),候选乙为(3,0)。原平方距离分别为26和9,所以乙更近。若只保留横轴坐标,平方距离变成1和9,甲反而更近了。两种距离都没有增加,最近对象却换了。

甲原来沿纵轴离查询很远,这段差别在降维时全部被舍弃;乙与查询的差别恰好全沿横轴,被完整保留。这个反转有明确的几何原因,不是低维计算更粗心,也不是只要提高浮点精度就能消除。

对于资料匹配,不能仅展示“向量从几百维变成几十维、计算更快”,还要查看原来要区分的资料是否被挤到一起。保留相近对象、保留类别差别、重建原数值,各自是不同目标。一个为重建误差设计的表示,未必自动满足每种检索或分类要求。

也可以利用残差判断某些距离变化有没有可能很大。若两条记录的重建残差都很小,二者丢失部分之间的距离不会超过两个残差长度之和。因此原距离与投影后距离相差多少,也受这个和约束。这里“小”应相对当前需要区分的距离间隔:两个候选原本只差极少,即使很小的失真也可能换序。

这些结论要求两条记录使用同一个正交投影和同一种欧氏尺度。若投影后又各自归一化长度、改变字段权重,或为查询和候选使用不同映射,就要重新分析整个流程。不是这些做法一律不可以,而是原来的距离不增证明不再自动覆盖新的操作组合。

残差可以提醒我们检查什么,却不会自动说明原因

小叶可以在试用压缩规则时,保留一批原始片段,逐条比较重建残差。哪些片段出现大误差,意味着哪些变化没有被当前方向容纳。再查看这些片段是否共同含有细线、方向标记或其他任务需要的区别,才知道是否该增加方向或改变表示。

单看平均误差可能掩盖少数重要片段。假如大量纯色片段几乎无损,而少数箭头片段失去方向,平均表现仍可能很好;对于找方向的任务,这些少数情况却可能决定方案是否可用。因此需要把数学误差与具体任务结果对应起来,而不是不断增加维度直到一个平均数字变漂亮。

若某个保留空间确定有用,再增加一个不在这个保留空间中的方向,会扩大允许的重建集合,最优重建误差不会上升。但前提是新空间包含旧空间。两个维数不同却互不包含的空间,不能只按维数比较某条数据的误差;重新训练或重新选方向后,也应检查实际结果。

维数的选择因此是有代价的取舍。少几个坐标,可能减少保存和后续运算;多几个坐标,可能保留更多必要变化。保留方向本身、共同基线、转换程序及必要的原始资料也需要管理。投影帮我们明确损失从哪里来,是否值得接受仍需回到实际任务。

十二、回到预览图:先给表示一个清楚的用途

现在小叶可以把最初的压缩请求写得更具体。若目标只是保存每个两格片段的大致共同亮度,就用平均值或对应的单位方向坐标编码,同时固定重建规则。预览时得到同亮度片段,明确它不能代表原来的左右细节。

若目标是判断哪边更亮,单独保留平均值就不合适。对于这个极简任务,可以改为保留左右差异坐标;若既需要共同亮度又需要差异,就要保存两个坐标,或在更大范围重新寻找适合任务的表示。不是每一个要求都能在原来的一维限制下免费实现。

当任务扩大到更多像素或整批资料时,小叶应说明:使用哪个共同中心,保留哪些方向,低维坐标怎样排列,重建后损失用什么标准衡量。先在保留的样本上检查数值重建与任务需要,再决定是否让新表示替代原输入。原始资料是否保留,也由后续是否需要重新编码和核验决定,不能因为当前预览看起来还行就默认原细节永远不再需要。

至此,投影不只是一个乘法公式。它把原数据拆成当前表示能够保留的部分,以及当前表示无法区分的部分。正交条件说明,在给定空间和欧氏误差标准下,重建已经到达最近点;降维则决定我们最终只保存哪些坐标。下一章要继续解决的,就是怎样从一批数据出发选择这些方向,以及这种选择保留了什么、可能忽略什么。

十三、练习与参考分析

练习一:系数变了,投影是否也变了

将x=(4,2)投到a=(1,2)张成的直线上。求组合系数、投影和残差,并检查正交。若改用a′=(3,6),系数和投影分别怎样改变?

参考分析: aᵀx=8,aᵀa=5,所以α=8/5,投影p=(8/5,16/5),残差e=(12/5,−6/5)。残差与a的内积为12/5−12/5=0,误差平方为36/5。原向量平方长度20,投影平方长度64/5,两者相差也是36/5。

将方向向量放大三倍,同一条直线没有改变;系数缩为原来的三分之一,即8/15,乘回a′仍得到同一p。若把原系数8/5直接搭配a′,重建就会被放大三倍。要比较编码数值,必须同时检查它使用的方向及长度约定。

练习二:同一个平面内换基,会不会改变最近点

在三维空间中,保留平面z=0。对于x=(2,3,4),先使用基a₁=(1,0,0)、a₂=(1,1,0),再改用正交单位基q₁=(1,0,0)、q₂=(0,1,0)。分别说明投影、残差和组合系数。能否将x对a₁、a₂的单独投影相加当成答案?

参考分析: 两组基张成同一个平面,欧氏最近点都是p=(2,3,0),残差e=(0,0,4),平方误差16。第一组基中,系数为(−1,3),因为−a₁+3a₂=(2,3,0);第二组中系数为(2,3)。系数不同是坐标规则不同,重建点并没有改变。

单独向a₁投影得到(2,0,0),向a₂投影得到(2.5,2.5,0),相加成为(4.5,2.5,0),不是最近点。它虽在目标平面中,仍留下平面内可调整的误差;残差与a₁的内积也不为零。方向线性无关,只保证它们能作为所张成空间的一组基,不能替代正交条件。

练习三:增加一个方向,误差一定会下降吗

对x=(1,2,3),先只保留第一坐标轴,再增加第二坐标轴。两次投影和误差平方各是多少?若改成只保留第三坐标轴,虽仍是一维,结果怎样?请说明“更多方向误差不增”的条件。

参考分析: 第一坐标轴的投影为(1,0,0),误差平方13;增加第二坐标轴后,投影为(1,2,0),误差平方9。新平面包含原直线,允许的选择更多,因此最优误差不可能更大。这里确有第二分量2,增加后误差减少4;若这部分原本为零,增加方向也可能不改变误差,而非严格下降。

只保留第三坐标轴时,投影为(0,0,3),误差平方5,反而比前面的二维平面误差小。因为这条直线并不包含在前面两个坐标轴组成的平面中,比较对象换了。对当前单个向量,方向位置与维数都重要,不能只按保留坐标个数排序。

练习四:有基线与没有基线,重建的是同一批对象吗

已给基线μ=(10,2),保留共同变化方向(1,1)。对于x=(13,3),写出低维单位方向坐标及重建。若只保存该坐标而删除μ,还能唯一恢复原始水平吗?若换另一组μ′与坐标,怎样判断两套表示是否实际给出同一重建?

参考分析: 相对变化为(3,1),单位方向u=(1,1)/√2,坐标z=2√2,投影变化为(2,2),加回基线得到(12,4)。坐标表示的是围绕已给基线的变化,不是两个原始值的平均数。

删除基线后,单凭z不知道应把这段变化放在哪里,不能唯一恢复原始水平。不同基线和坐标是否等价,要实际比较μ+uz与μ′+u′z′,并检查使用的是同一原始字段顺序和单位;不能只比较z和z′是否相等。例如基线沿u移动一段,同时把坐标反向补偿相同幅度,可能仍给出同一重建。若两套规则没有保存,这种对应关系就无法可靠核查。

练习五:拟合参数不唯一,投影结果会不会也不唯一

两条观察的目标为b=(1,3)。模型有两个完全相同的输入列,矩阵A=[[1,1],[1,1]]。最小二乘预测向量是什么?哪些权重能得到它?如果程序的residuals返回空数组,能否据此说误差为零?

参考分析: 所有预测都形如(s,s),其中s=w₁+w₂。与目标最近的共同值为2,所以投影p=(2,2),残差(−1,1),平方误差2。最近输出唯一,所有满足w₁+w₂=2的权重却都能得到它,参数不唯一。

在这组多解中,NumPy的最小范数选择会取(1,1)。可以从w₁=1+t、w₂=1−t的平方长度2+2t²看出这一点;这是一种系数选择,并未增加新观测。A列相关,且行数不大于列数,接口可以返回空残差汇总数组。直接计算b−Aw便能看到误差并非零,不能以空数组代替残差判断。

练习六:保留了大部分平方长度,能否保证识别任务不受影响

有两个两格片段,甲为(101,99),乙为(99,101)。任务是判断哪边更亮。若只保留共同亮度方向,两者各自的平方长度保留比例很高,这是否足以说明压缩合适?若只要求判断两格的平均亮度是否超过90,结论又怎样?

参考分析: 两者都被重建为(100,100),各自原平方长度20002,投影平方长度20000,保留比例约99.99%。但二者低维坐标相同,原本相反的左右方向无法由这个表示区分。极小比例的损失可能恰好包含任务全部需要的差别。

若任务只问平均亮度是否超过90,共同亮度表示保留了这个判断所需的数值,两者都可以确定回答超过。不能据第一个任务失败就说平均表示对所有任务都无用,也不能据第二个任务成功就说它保留了全部图像信息。需要保留什么,由问题及其允许的错误共同决定。