矩阵在搬什么:从 3D 立方体到数据点云

一个 3D 立方体到底被搬到哪儿去了

「矩阵代表一种变换」这句话在课本里反复出现,但当维度从 2 升到 3 时,脑子里那张网格图就失灵了。一个平面上画得清清楚楚的「房子被矩阵压扁」,到了三维只剩一个立体盒子,里面的顶点关系不容易一眼看出。

不过,「搬空间」这件事的规矩没变。我们这一篇要做的,就是把这条口号从二维画面升级到三维、并用同一条口诀继续往上推。先在 3D 里把直觉吃透,然后去 4 维、去看行列式与秩,最后落到 PCA(Principal Component Analysis,主成分分析)——把读者原本想问的「对数据做线性变换」一句话答完。 PCA PCA PCA PCA

在进入 3D 之前,先看一张 2D 的图。在 Strang 18.06 Lecture 30 的「房子被线性变换」画面里,矩阵 A 作用到房子的每个顶点上。下方 YouTube thumbnail 这一帧里写的是 A = [[0.7, 0.3], [0.3, 0.7]],标注 shrink toward y=x——这是该录像某帧呈现的矩阵与标注,未必是 Strang 选定的 canonical 例子,但能看到「房子被往 y = x 这条线方向压扁」的效果:

二维坐标系里一座被矩阵压扁的房子

图注:黑底坐标系里一座房屋的整体形状,图上方写着 T(H) = AH、A = [[0.7,0.3],[0.3,0.7]],下方注明 shrink toward y=x——房子在 y=x 这条线方向被「压扁」。完整的动画演示可看 MIT OCW 18.06 Lecture 30 录像(视频 ID _dKlN-qoofM)。

从这张图能直观看到一件事:矩阵不是在改数字,是在搬整个图形;房子上的每一个顶点,都被这个矩阵「一起」移到了新位置。这是所有后续讨论的起点——把矩阵当成「空间的一种搬动方式」来想,而不是当成一个装数字的方块。

搬空间这件事,有一条规矩叫「线性变换」(linear transformation)。它的定义只有三条:网格线不能弯、间距不能变、原点不能动。满足这三条的搬动,就叫线性变换。在 2D 里,这三条规矩可以画成下图:黑底上原本是正交的灰网格,被搬动之后变成两组平行且等距的蓝白斜线——网格线仍然平行、间距仍然均匀,只是方向变了。

2D 网格变形示意:线性变换的"平行+等距"规则

图注:3Blue1Brown 课程页配图:黑底上同时呈现一组浅灰正交网格和两组互相平行、各自等距的蓝白斜线——这是把「平行 + 等距」作为线性变换的视觉定义同时叠在画面上,并不展示 before/after 对比。这是「线性变换」几何定义三要素中的「平行 + 等距」两项视觉证据。

不过,2D 的画面只能让我们看到「搬」。从二维往三维走,规矩还是那三条,但画面从一张「纸」变成了一个「盒子」。下图把视角从 2D 拉到 3D:原来的坐标系被淡灰色留在背景里当底图,三个彩色的箭头分别是 x 方向(绿色 î)、y 方向(红色 ĵ)、z 方向(蓝色 k̂)——这是三维空间里的三条基向量,每一条都从原点出发,标记空间里的「初始位置」。

三维坐标系里 î、ĵ、k̂ 三个基向量和它们的新位置

图注:3Blue1Brown 第 5 章配图。左半是原坐标系(淡灰)和三个基向量;中间三路箭头把每个基向量映到一组新的坐标(Î→[1,0,−1]ᵀ、Ĵ→[1,1,0]ᵀ、Κ̂→[1,0,1]ᵀ);右半是同一坐标系下三个基向量按映射结果放置的样子。颜色与原图一致:绿色 î、红色 ĵ、蓝色 k̂。

从这一张图里能看出三件事。

第一,三维比二维多了一条 z 轴,画面从平面变成了盒子。但搬动的规矩没变——网格线还是平行、还是等距、原点还是不动。

第二,三维空间里给一组线性变换,只需要告诉它三个基向量飞去了哪,剩下的空间自动跟着走。这就是矩阵的「列向量口诀」——矩阵的第 1 列是 î 飞去了哪、第 2 列是 ĵ 飞去了哪、第 3 列是 k̂ 飞去了哪——下一章会专门拆这一句。

第三,3D 还能画出来。立方体里每个顶点都还能在屏幕上看到一个具体位置,旋转、缩放、切变、反射这些变换还能用人脑追得上的方式走一遍。4 维起就不行了——这一点留到第三章。

所以这一章拿走的是:矩阵做的不是改数字,是搬整个空间;3D 的「空间」从一张图变成了一个盒子,但规矩没变。

那么,矩阵究竟是怎么搬的?这件事要怎么落到具体数字上?

拆开口号:矩阵的每一列其实就是「基向量飞去了哪」

上一章末尾留了一个问题:「矩阵究竟是怎么搬的?」这一章给出最直接的答案:看矩阵的列。

在 2D 里这件事最干净。一个 2×2 矩阵 [a b; c d] 作用在向量 (x, y) 上,等于 x·(a, c)ᵀ + y·(b, d)ᵀ——这是把矩阵乘到向量这件事展开后的等式:

矩阵乘向量的代数展开:「列向量读法」的代数形式

图注:3Blue1Brown 第 3 章配图。代数示意图,写出「一个 2×2 矩阵乘以向量 (x, y)」按列展开的等式,并把展开式重新合写成两项线性组合 + 一个 (ax+by, cx+dy)ᵀ 形式的结论向量;下方大括号指向「x·第一列 + y·第二列」,文字标签为「Where all the intuition is」。这是代数图,不是几何示意图,没有画 î/ĵ 箭头。

这条等式的意思是:一个矩阵乘以一个向量,可以拆成「按列读」——第一列是 î 飞去了哪,第二列是 ĵ 飞去了哪。要想知道矩阵在做什么,只要看它的列;列决定了一切。3Blue1Brown 在图下方直接写「Where all the intuition is」,意思是:矩阵所有的心智模型都在列里3Blue1Brown EOLA Ch3。

从 2D 迁移到 3D,口诀本身不变,只是多了一条 z 轴、第三列。3Blue1Brown 在第 5 章里给出 3D 版的同一个口诀:「Record the coordinates of these three resulting vectors as the columns of a 3x3 matrix. This gives a matrix that completely describes your transformation using nine numbers.」——即把三个基向量的新坐标按列写下,就得到完整描述一个 3D 变换的 3×3 矩阵3Blue1Brown EOLA Ch5. 一个 3×3 矩阵的 9 个数字 = 3 列 × 3 行 = 3 个基向量的新位置各用 3 个坐标写出。

来看 3D 里最经典的「worked example」:绕 y 轴旋转 90°。把这个旋转变成矩阵,按列读就是——

  • î(x 方向基向量)转 90° 后落到 z 的反方向 → (0, 0, −1)ᵀ
  • ĵ(y 方向基向量)原地不动 → (0, 1, 0)ᵀ
  • k̂(z 方向基向量)转到 x 方向 → (1, 0, 0)ᵀ

把这三列拼起来就是旋转矩阵:

$$R_y = \begin{pmatrix} 0 & 0 & 1 \ 0 & 1 & 0 \ -1 & 0 & 0 \end{pmatrix}$$

下图把这件事用画面钉住了:左边是原坐标系里的立方体(三个基向量从原点出发),中间一个白色右箭头,右边是同一个立方体绕 y 轴 90° 之后的样子——î 和 k̂ 在 x-z 平面里互换位置,ĵ 不动。

绕 y 轴 90° 旋转的 worked example:左边原坐标系,右边旋转后

图注:3Blue1Brown 第 5 章配图。两个并排的 3D 立方体线框,中间一个白色右箭头。左边原坐标系里 î(绿)、ĵ(红)、k̂(蓝)三个基向量从原点出发;右边的立方体绕 y 轴旋转 90°,î 与 k̂ 在 x-z 平面互换,ĵ 不变。配合正文的三列数值 (0,0,−1)ᵀ、(0,1,0)ᵀ、(1,0,0)ᵀ 一起读。

3D 里能「画出来」的变换家族有五种。下面用一张表把每种变换的「基向量飞去哪」和几何口诀并列出来——重点不是记住矩阵,而是能盯着任一矩阵说出它属于哪一类:

变换基向量去哪(口诀)几何口诀
旋转三条基向量长度不变、方向变把立方体转一个角度,体积不变
各向同性缩放三条基向量等比拉长或压短立方体均匀变大变小,形状不变
各向异性缩放三条基向量各按不同倍数拉/压立方体被拉成不同边长的「盒子」
切变一条基向量不变,另一条往第三方向斜推立方体被「斜推」成平行六面体
反射一条或多条基向量方向翻转立方体被镜像翻转,行列式变负
投影一条基向量被压成 0立方体塌成平面,体积归零

这里最后一行「投影」要给一个特别提醒:上面五种变换里,旋转 / 缩放 / 切变 / 反射都是「方阵在同维空间里搬动」——输入是 3D 空间,输出还是 3D 空间。但投影不一样:把 3D 投到 2D 时,输入空间是 3 维,输出空间是 2 维,矩阵就不是方阵而是矩形的(行数 ≠ 列数)。

3Blue1Brown 在第 8 章里专门补上了这条边界。一个 3×2 矩阵的几何含义是:输入 2 维、输出 3 维——把平面映到三维空间里的一张平面。下图把这件事一次讲清:左边是 2D 输入网格 + 两个基向量,中间两路同色箭头把它们映到右边的 3D 坐标架:

2D → 3D 的非方阵映射:列向量读法在维间变换里的应用

图注:3Blue1Brown 第 8 章配图。黑底画面,左半是 2D 输入网格 + 绿色 î 与粉色 ĵ;中间两路同色箭头把 [1,0]ᵀ→[2,−1,−1]ᵀ、[0,1]ᵀ→[0,1,1]ᵀ;右半是 3D 坐标架(x/y/z)+ 两个列向量落到 3D 位置。这个 3×2 矩阵的几何动作是「把 2D 平面映到 3D 空间里的一张平面」——这正是 PCA 投影那一步的概念基础3Blue1Brown EOLA Ch8.

所以这一章拿走的是:拿到任何矩阵,只要读它的列就知道它在做什么;方阵在同维空间里搬,矩形矩阵在不同维空间之间搬。

3 维里这套都还行,4 维以上呢?

4 维以上为什么看不见——但还是能算

把口诀从 3 维往 4 维推,第一反应是「画不出来了」。确实——4 维空间没有「画面」。我们盯着屏幕,永远只能看到 3 维空间里的东西(再被投影到 2D 屏幕上)。这是这门学问的工作方式,不是缺陷。

但「看不见」和「不能算」是两件事。低维结论原样适用:网格线还是不能弯、间距还是不能变、原点还是不能动;列向量读法也原样适用——第 1 列是 î 飞去了哪、第 2 列是 ĵ、第 3 列是 k̂、第 4 列是 ŵ(w 方向的基向量)。规则没破,只是列数从 3 涨到 4。3Blue1Brown 在第 5 章开篇引言段直接写明:「once you get all the core ideas in two dimensions, they carry over pretty seamlessly to higher dimensions」。

不过读者会问:那 4 维的真东西到底长什么样?tesseract(4 维超立方体)就是 3 维立方体的 4 维版本。可以用一个「组合学计数」来回答——4 维立方体有多少顶点、多少棱、多少面、多少「体」:

部分计数公式来源
顶点162⁴ = 16
棱324 · 2³ = 32
面(正方形)242 · 4 · 3 = 24
cell(立方体)82 · 4 = 8

「8 个 cell」这一项由 tesseract-explorer 的 README 直接确认;其余三项由 4-cube 组合公式直接推出tsherif/tesseract-explorer.

那「看到」4 维是怎么回事?看下面这张图:

4D 超立方体被投到 3D 再投到 2D 的画面

图注:tesseract-explorer 项目官方 logo。一个倾斜的彩色立方体,六个面各有一个红色描边的圆形开口,内部嵌红/绿/黄三色环形结构。这张图本质是项目 logo,不是带维度标注的精确几何示意图;它给读者「4 维超立方体在屏幕上长这样」的第一眼印象。

但要明确一件事:这张图不是 4 维本身,而是 4 维被投到 3 维再投到 2D 屏幕后的影子。tesseract-explorer 的页面侧栏直接写明免责声明:「What is rendered here is not the actual tesseract, but its projection into 3D space in a process similar to photographing a 3D world onto 2D camera film」。换句话说,看到的永远不是本体,是投影——这条规则在 4 维如此,在机器学习里把 100 维数据投到 2 维屏上看 PCA/t-SNE 也是如此。

tesseract-explorer 的真正价值是「可玩」。在 https://tsherif.github.io/tesseract-explorer/ 这个网页里,6 个独立旋转平面(XY、XZ、XW、YZ、YW、ZW)对应 4 维空间里 6 个由两条坐标轴组成的平面——每个平面在数学上对应一个 4×4 旋转矩阵,和 3 维里 XY/XZ/YZ 三个旋转平面是同一个模式推广到 4 维。同时它提供两种投影模式:透视投影(4D 相机沿 W 轴放置,w 坐标越远的 cell 投影后越小)和正交投影(不做距离缩放)。读者可以拖鼠标转一转、自己感觉「4 维旋转」是什么样的——这是「看不见也能算」最干净的具象化。

所以这一章拿走的是:4 维没有画面不是缺陷,是这门学问的工作方式;低维结论原样适用,看不见时靠坐标算;高维的可视化本质都是投影,而看到的永远不是本体。

不过口诀再漂亮也还是抽象的——能不能拿一组具体数据点和一个具体矩阵真跑一遍?

实操一遍:拿一个 3×3 矩阵套到几个数据点上

这一章做一件事:把第二章的列向量口诀和第一章的画面合到一组具体数字上,验证一遍。具体做法是——给定 3-5 个三维点,写出一个具体的 3×3 矩阵,逐点手算新坐标,然后去 GeoGebra 拖滑块对照画面。

先选一组点(用一个单位立方体的 5 个顶点,加上一个偏离立方体的外点):

点原坐标 (x, y, z)
P₁(1, 0, 0)
P₂(0, 1, 0)
P₃(0, 0, 1)
P₄(1, 1, 1)
P₅(2, 1, −1)

再选一个矩阵。还是用第三章出现过的绕 y 轴 90° 旋转——但这次按行写出来,方便逐点计算:

$$R_y = \begin{pmatrix} 0 & 0 & 1 \ 0 & 1 & 0 \ -1 & 0 & 0 \end{pmatrix}$$

按列读的话:î 飞到 (0, 0, −1),ĵ 飞到 (0, 1, 0),k̂ 飞到 (1, 0, 0)。按行算「点 × 矩阵」用的是矩阵乘法规则:新坐标 = 原坐标的每个分量去匹配矩阵的行。具体手算如下:

  • P₁ = (1, 0, 0):0·1 + 0·0 + 1·0 = 0,0·1 + 1·0 + 0·0 = 0,-1·1 + 0·0 + 0·0 = -1 → (0, 0, −1)
  • P₂ = (0, 1, 0):0·0 + 0·1 + 1·0 = 0,0·0 + 1·1 + 0·0 = 1,-1·0 + 0·1 + 0·0 = 0 → (0, 1, 0)
  • P₃ = (0, 0, 1):0·0 + 0·0 + 1·1 = 1,0·0 + 1·0 + 0·1 = 0,-1·0 + 0·0 + 0·1 = 0 → (1, 0, 0)
  • P₄ = (1, 1, 1):0·1 + 0·1 + 1·1 = 1,0·1 + 1·1 + 0·1 = 1,-1·1 + 0·1 + 0·1 = -1 → (1, 1, −1)
  • P₅ = (2, 1, −1):0·2 + 0·1 + 1·(-1) = -1,0·2 + 1·1 + 0·(-1) = 1,-1·2 + 0·1 + 0·(-1) = -2 → (-1, 1, −2)

注意一件事:P₂ = (0, 1, 0) 在变换后没动——这和第二章的「ĵ 原地不动」是同一件事。P₃ = (0, 0, 1) 跑到了 (1, 0, 0) 的位置——k̂ 被映到了 î 的位置;而 P₁ = (1, 0, 0) 跑到了 (0, 0, −1)——并不是单纯互换,而是 î 被映到 −k̂ 的方向、k̂ 被映到 î 的方向,这是右手系绕 y 轴旋转 90° 的方向不对称性。

想把这个手算结果对照画面?GeoGebra 上有一个免费的 3D 交互工具可以拖。打开 https://www.geogebra.org/m/g5av6fng,进入界面后默认看到一个红色单位立方体,旁边写着 T(î) = (1,0,0)ᵀ、T(ĵ) = (0,1,0)ᵀ、T(k̂) = (0,0,1)ᵀ——这是「什么都不做」的恒等变换状态。下图就是这个界面的样子:

GeoGebra 3D 交互界面入口:identity 状态下的单位立方体

图注:GeoGebra applet g5av6fng 预览图。3D 视窗里有红色半透明单位立方体(第一象限),三个等式 T(î)=(1,0,0)ᵀ、T(ĵ)=(0,1,0)ᵀ、T(k̂)=(0,0,1)ᵀ(恒等变换状态)。这是一个可编辑的 3D 沙盒——读者可以改三个等式右侧的坐标,立方体会实时变形GeoGebra — Linear Transformations and Determinant in 3D.

要做的事情是:把三个等式右侧的坐标改成 (0,0,-1)、(0,1,0)、(1,0,0)——这就是上面那个绕 y 轴 90° 的旋转矩阵的列向量读法。改完一瞬间,红色立方体会按预期转过去。

这里有一个细节要诚实说明:图里看到的立方体是「单位立方体」,意味着原矩阵是恒等变换 T = I;读者要做的是把三个等式右侧改掉,看立方体怎么动。这正是这一章的核心动作——「按列读、按点算」,结果和画面一对一。

所以这一章拿走的是:拿到任何 3×3 矩阵,按列读、按点算,得到一张可以拖出来对照的画面;列向量口诀在具体数字和具体画面之间起桥接作用。

到这里,搬动的动作已经清楚。但还有一个判断题没解决:这套搬动有没有把信息弄丢、空间有没有被压扁?

什么变换把空间压扁了:行列式、秩、不可逆

第四章末尾留了一个问题:搬动有没有把信息弄丢?要回答它,需要三个工具——行列式(determinant)、秩(rank)、不可逆(non-invertible)。这一章把这三件事用最直觉的方式讲清楚。

先看行列式。GeoGebra 上有一个现成的硬例子:把矩阵设成 T = 2I = [[2,0,0],[0,2,0],[0,0,2]],也就是把每条基向量都拉长 2 倍。下图就是按 Apply T 按钮之后看到的样子:

T = 2I 把单位立方体每边 ×2,体积变 8 倍

图注:GeoGebra applet hfrdwrb9 预览图。3D 视窗里是青色立方体(红色顶面),下方面板显示 T = [[2,0,0],[0,2,0],[0,0,2]]、|T| = 8、Apply T 按钮。矩阵把每条基向量都拉长 2 倍,所以边长 ×2、体积 ×8 = 2³ = 8。这是「行列式 = 单位体积被拉大成多少倍」的硬示例。

注意一个细节:图里的青色立方体不是单位立方体,而是 T = 2I 应用后的「2 单位立方体」。体积从 1 变成了 8,行列式 |T| = 8 直接读出。这是「行列式 = 单位体积变化倍数」最干净的画面证据GeoGebra — Activity 4: Matrices as linear transformations.

但行列式不只是一个正数。它还有两个额外含义,串起来就是「行列式回答三件事」:

行列式几何后果立方体看起来
det > 0保留定向(orientation preserved)立方体没被翻面
det < 0镜像翻转(handedness reversed)立方体里外倒置
det = 0压成低维(collapsed to lower dimension)立方体塌成平面或线,体积归零

第三档是真正重要的:当 det = 0 时,至少有一条方向被「压」成 0,整个立方体塌成一张平面(如果压掉一条方向)或一条线(如果压掉两条方向),体积归零。这件事和「秩」直接挂钩。

秩的几何含义只有一句话:「变换后还剩几条独立方向」。3 维空间的单位立方体本来在 x、y、z 三条方向上独立——每条方向都不被另外两条的组合替代。变换之后,如果三个新方向里有两条落在同一条线上,秩就降到 2;如果三条全塌到一张平面,秩就降到 1;如果全塌到一个点,秩就是 0。

把两件事合在一起:「秩 < 维数 ⇔ 行列式 = 0 ⇔ 变换不可逆 ⇔ 信息丢」。这是一个等价链,每一环都和下一环一样真。

为什么?因为行列式等于 0 意味着至少一条基向量被压成 0 向量——被压成 0 的方向上,原来的所有信息都没了,没法「反推」回去。所以这个变换不可逆(invertible 指能反推回去;不可逆 = 反推不回去)。在 GeoGebra 里实操一遍就能看到:把矩阵里某两列设成线性相关的(比如第二列 = 第一列),立方体立刻塌成一张平面,行列式 readout 跳到 0。

那么这个「行列式 + 秩」的判断力,在数据上有什么用?

回到数据:为什么机器学习里要对数据做线性变换

第五章末尾留了一个问题:如果搬的对象不是立方体而是一团数据点呢?这一章回答这个问题,把前面所有的工具箱用到一个具体的例子——PCA(主成分分析),也就是「对数据做一次线性变换」的最标准答案。

数据是什么?在机器学习里,数据就是高维空间的点云。每一行是一个样本(比如一只企鹅),每一列是一个特征(比如嘴峰长度、嘴峰深度)。如果只有两个特征,那就是平面里的一团散点;如果有几十个特征,那就是几十维空间里的一团散点——看不见,但可以算。

下面这张图是 PCA 教程里的经典入口——Shlens 教程 Figure 3。三张并排的 2D 散点子图,每张图里都画了一条带负斜率的虚线:

2D 数据云 + 第一主方向虚线:PCA 几何动机图

图注:Shlens 2003 PCA 教程 Figure 3。三张并排 2D 散点子图,横轴 r₁、纵轴 r₂。每张图里都画了一条负斜率虚线(最佳拟合方向 = 第一主成分方向)。三张图从 (a) 到 (c),散点沿虚线方向的相关性依次增强——左到右箭头标注「low redundancy → high redundancy」。这是「为什么 PCA 找最大方差方向」的动机图Shlens — A Tutorial on Principal Component Analysis.

每张图里的虚线就是「第一主成分」——让数据沿这条线方向投影时,方差最大。要做的事情是:找到这样一条线(在高维空间里就是一个方向 / 单位向量),让所有数据点沿这条线方向上的投影分散得最开。

这件事的几何本质是什么?Bloem 在他的《Unraveling PCA》里给了一个干净的 1D 解释:每个数据点 xᵢ 都「正交投影」到这条 w 方向上,得到一个标量 xᵢ′——「沿 w 方向离原点多远」这一个数。下图把这件几何动作画了出来:

1D PCA:数据点 xᵢ 正交投影到最佳直线 w 上的 xᵢ′

图注:Bloem 2023《Unraveling PCA》§1.2 配图。两条黑坐标轴,从原点出发的红色实心箭头 w、红色点状虚线,虚线上有一个空心圆圈 xᵢ′、虚线外有一个深黄实心圆点 xᵢ。这就是「1D PCA = 把每个数据点正交投到 w 方向、用沿 w 方向的距离这一个数代表它」的图示Bloem — Unraveling Principal Component Analysis.

把 1D 推广到 k 维 PCA:选 k 条互相正交(orthogonal)的单位向量 w₁, …, wₖ,每个数据点 xᵢ 就被编码成一个 k 维向量 z = Wᵀx,再用 x′ = Wz 反推回去。约束条件 WᵀW = I(矩阵 W 的转置乘以它自己等于单位矩阵)把所有「正交 + 单位向量」这两件事打包成一行公式。

PCA 在数据上做了两件事,每件都是一个独立的线性变换:

第一步:协方差矩阵对角化(covariance diagonalization)= 旋转变换。把原始坐标系旋转到「沿新基方向方差最大」的位置。Wiskott 的讲义 Figure 5 把这件事画得很清楚——同一团点云,在标准轴下协方差矩阵是 [[1, -0.5], [-0.5, 0.3]](非对角,散点沿负斜率方向弥散);在同一团点上旋转坐标系之后,协方差矩阵变成 [[1.1, 0], [0, 0.1]](对角,散点在 x₁′ 方向方差最大、x₂′ 方向方差最小)。

同一团点云在标准轴和旋转轴下的协方差矩阵对比

图注:Wiskott PCA 讲义 Figure 5。两个并排散点图。左图:标准 x₁-x₂ 轴,协方差矩阵 [[1,-0.5],[-0.5,0.3]](非对角),散点沿负斜率方向弥散。右图:同一团点云在旋转后的 x₁′-x₂′ 轴下,协方差矩阵 [[1.1,0],[0,0.1]](对角)。1.1 = 沿 x₁′ 方向方差,0.1 = 沿 x₂′ 方向方差。下方一行 caption "Diagonalizing the covariance matrix by rotating the coordinate system."Wiskott — Principal Component Analysis lecture notes.

旋转后的协方差矩阵对角线上的两个数(1.1 和 0.1)就是「特征值」(eigenvalue),对应「沿各自新基方向的方差」。哪个方向的方差大,哪个方向就是「第一主成分」;方差小到几乎可以忽略的方向,就丢掉——这就是「PCA 降维 = 投影 + 丢最小方差方向」的几何。

第二步:白化 / 球化(whitening / sphering)= 各向异性缩放。把每条主成分方向按 1/√λ 拉伸,让数据在每条主成分上的方差都变成 1(「球形」)。这一步的矩阵形式是 W = U · diag(1/√λ₁, 1/√λ₂, …, 1/√λᴵ) · Uᵀ——其中 U 是第一步的旋转矩阵,diag(1/√λ) 是按特征值倒数平方根做的对角缩放矩阵。

合起来,PCA + whitening = 两次线性变换的串联。第一次是旋转(让数据沿新基方向方差最大),第二次是各向异性缩放(按 1/√λ 拉伸成球形)。每一步都是线性的,合起来还是线性的——这就是「对数据做线性变换」的标准答案。

落到代码上,只需要 5-10 行 Python:

from sklearn.decomposition import PCA
pca = PCA(n_components=2, whiten=False)
pca.fit(X)
X_new = pca.transform(X)            # 数据被旋转 + 投影到新基
X_back = pca.inverse_transform(X_new)  # 反推回原坐标系(n_components<原维度时不可逆)

# 切换 whitening = True,等价于在旋转之后再做一次各向异性 1/√λ 缩放
pca_white = PCA(n_components=2, whiten=True)

scikit-learn 的 PCA 模块把这套抽象口诀落到具体的 API:fit 找主成分、transform 投影、inverse_transform 反推;whiten 一行 toggle 就是上面说的第二步「球化」。Inria 的 scikit-learn MOOC 笔记本「Geometric Intuitions of PCA」在 Chinstrap 企鹅嘴峰长 / 嘴峰深这两个相关特征上演示了完整流程——读者可以打开 https://inria.github.io/scikit-learn-mooc/python_scripts/dimred_intuitions.html 自己跑一遍,把上面 PCA + inverse_transform 之后散点坍缩到主轴线上的画面打印出来scikit-learn — PCA module docsInria scikit-learn MOOC — Geometric Intuitions of PCA.

写到这里,整套「矩阵在搬什么」的故事就完整了。立方体被矩阵搬到新位置(第一章),矩阵的列就是基向量飞去哪(第二章),4 维起没有画面但还能算(第三章),用具体点 + 具体矩阵 + 具体画面验证一遍(第四章),行列式和秩回答「变换有没有把空间压扁」(第五章),最后把这一整套工具落到数据上——PCA 是给一团高维点云换坐标系 + 丢最小方差方向,whitening 是这一步之后的独立线性变换。

从一座二维的房子被一个 2×2 矩阵压扁开始,到一团高维数据被一组矩阵旋转 + 投影 + 拉伸,串起来的是同一句口号——「矩阵代表一种变换」在 3 维、在 4 维、在高维数据上原样适用。

参考文献

本专题引用的核心资料如下,建议深入学习时阅读原文:

  1. Strang, G. — Introduction to Linear Algebra (5e 2016 / 6e 2023), Chapter 8: Linear Transformations — https://math.mit.edu/~gs/linearalgebra/ila6/indexila6.html
  2. 3Blue1Brown — Linear transformations and matrices, Essence of Linear Algebra Ch.3 — https://www.3blue1brown.com/lessons/linear-transformations/
  3. 3Blue1Brown — Three-dimensional linear transformations, Essence of Linear Algebra Ch.5 — https://www.3blue1brown.com/lessons/3d-transformations/
  4. 3Blue1Brown — Nonsquare matrices as transformations between dimensions, Essence of Linear Algebra Ch.8 — https://www.3blue1brown.com/lessons/nonsquare-matrices/
  5. GeoGebra — Linear Transformations and Determinant in 3D (Marcinek, 2019) — https://www.geogebra.org/m/g5av6fng
  6. GeoGebra — Activity 4: Matrices as linear transformations (Ponce Campuzano, 2020) — https://www.geogebra.org/m/hfrdwrb9
  7. Shlens, J. — A Tutorial on Principal Component Analysis (2003) — https://people.duke.edu/~hpgavin/SystemID/References/Shlens-PCA-tutorial-2003.pdf
  8. Wiskott, L. — Principal Component Analysis (lecture notes, 2004 / 2013) — http://graphics.stanford.edu/courses/cs233-24-winter-v1/ReferencedPapers/LectureNotes-PCA.pdf
  9. Bloem, P. — Unraveling Principal Component Analysis (book PDF v1.1.0, 2023) — https://peterbloem.nl/files/unraveling-pca.pdf
  10. tesseract-explorer (Sherif, T.) — 4D Hypercube Projection interactive demo + README — https://tsherif.github.io/tesseract-explorer/
  11. scikit-learn — PCA module documentation (v1.9.1) — https://scikit-learn.org/stable/modules/generated/sklearn.decomposition.PCA.html
  12. Inria scikit-learn MOOC — Geometric Intuitions of PCA notebook — https://inria.github.io/scikit-learn-mooc/python_scripts/dimred_intuitions.html
矩阵在搬什么:从 3D 立方体到数据点云