奇异值分解 SVD
再乱七八糟的矩阵,说穿了也不过是三个干净的动作:先转一次 (Vᵀ),再沿两个轴各自拉伸 (Σ),最后再转一次 (U)。把整个单位圆放进这个矩阵,出来的是一个规整的椭圆。这个椭圆的半轴长度就是奇异值。而最大的那个奇异值,几乎包揽了椭圆的全部形状。图像压缩和 PCA 正是建立在这一个事实之上。在第一张图里,一步步走完各个阶段,看圆怎样变成椭圆。
用按钮一步步往下走。第 0 步只是单位圆,上面标着右奇异向量 v1, v2。第 1 步 Vᵀ 转动这个圆,可圆还是圆,形状不变;不过 v1, v2 会恰好落到 x, y 轴上。第 2 步 Σ 只沿这两个轴各自拉伸,做出沿 x 轴为 σ1、沿 y 轴为 σ2 的规整椭圆。第 3 步 U 再把这个椭圆转一次,得到倾斜的最终椭圆,也就是矩阵把单位圆送去的样子。这个椭圆的两条半轴就是 σ1·u1 和 σ2·u2。旋转、拉伸、旋转,这三个动作能造出任何矩阵。
这次去掉全部旋转,只留下拉伸 (U = V = I)。滑块 σ1 和 σ2 分别决定把虚线单位圆沿横轴和纵轴拉多少,两个值正好就是金色椭圆的半轴长度。所谓奇异值,归根结底就是那根轴被拉长了几倍。调大 σ1,椭圆横向变长;调小 σ2,椭圆纵向变扁。把其中一个滑块降到接近 0,椭圆就沿那根轴被完全压扁,成为一条线段。这时矩阵的秩从 2 降到 1,椭圆变成红色,并出现警告。
现在亲手握住这三块。用滑块定下第一次旋转角 (V)、两个拉伸倍数 (σ1, σ2)、最后的旋转角 (U),它们合起来就是 A = U Σ Vᵀ。舞台上同时画出网格怎样变形,以及单位圆变成了哪个金色椭圆,下方的读数栏显示这个矩阵的四个分量。把角度和倍数随意转一转就会发现,不管矩阵的数值看起来多么随意,最终都出自干净的两次旋转和一次沿轴拉伸。任何 2×2 矩阵,都逃不开旋转 → 沿轴拉伸 → 旋转这个分解。
这个分解里有两组方向:进去的一侧是 v1, v2(右奇异向量),出来的一侧是 u1, u2(左奇异向量)。用开关选择一对。把 v1 放进矩阵,出来的恰好是 σ1·u1;放进 v2,出来的是 σ2·u2。也就是说,输入方向变成输出方向,长度乘上了奇异值。虚线单位圆上的蓝色箭头是输入 v,金色椭圆上的箭头是它的输出,两者之间用淡淡的虚线相连。V 方向进去,U 方向出来,奇异值决定大小。这就是 SVD 的一句话总结。
最后,看看椭圆的形状是不是真的几乎全装在一个大奇异值里。开关中的“秩 2”是完整的 A,也就是整个倾斜的椭圆。切换到“秩 1”,只留下 σ1·u1·v1ᵀ 这一块,椭圆完全落到最长的长轴上,成为长度为 σ1 的线段。小的 σ2 那一块被丢掉了。下方以百分比显示这一大块所含的能量比例 σ1²/(σ1²+σ2²)。通常仅凭这一块,形状的大部分就保留了下来。只留下最大的奇异值,形状也几乎不变,这正是压缩和 PCA 的核心构想。