PCA:数据的主方向
心理学家给十万人做了 100 道题的问卷,分析后发现:100 个维度的答案,绝大部分变化能用五个方向概括——后来它们被叫作「大五人格」。这类「从高维数据里挤出少数主方向」的操作,标准工具叫主成分分析(PCA)。它是上一章 SVD 对准「数据云」扣动的扳机,是历史上被使用最多、也最常被用错的无监督学习算法,还是你见过的每一张「高维 embedding 摊平成二维」可视化图背后的第一原理——这一章连怎么用带怎么不被它骗,一起讲完。卷四的最后一章,我们把它从头到尾装配一遍——你会发现零件全是旧的。
问题:数据云朝哪边舒展
一团二维数据点(身高-体重、经度-纬度、任意两个联动的指标),通常不是正着摊开的圆盘,而是斜着的椭圆云:沿某个斜方向拉得很长(两个指标联手变化的主旋律),垂直方向薄薄一层(残余的杂音)。斜,说明当初选的特征轴不是数据的「天然轴」——身高和体重各自都不是人体尺寸的主旋律,「整体大小」和「胖瘦比例」才是。PCA 要做的,就是把这两根天然轴从数据里逆向工程出来。PCA 的问题只有一句:找出那个「拉得最长」的方向——数据投影(第 14 章!)到它上面时,散得最开、方差最大、信息保得最多。找到第一个后,在垂直于它的剩余空间里找第二个,依此类推——这正是上一章 SVD 存在性论证「逐个榨取最大方向」的剧本,一字未改,只是舞台从「变换的放大率」换成了「数据的方差」。
为什么偏偏用「方差」当信息的代理?一个诚实的辩护加一个诚实的限度。辩护:在「只准做线性投影、事先不知道任务」的约束下,方差是唯一说得通的赌注——散得开的方向,至少有机会装着区分度;缩成一个点的方向,肯定什么都装不下。限度:它终究是赌注不是定理,坑清单第②条会展示它输掉的姿势。「无监督方法都在赌某个代理指标与真实价值相关」,这句话适用于 PCA,也适用于聚类、对比学习和词向量——早点看破,少走弯路。
协方差矩阵:数据云的档案
要谈方差,先给数据云建档。把 n 个样本(每行一个,d 个特征)装进矩阵 X,先逐列减去均值(把云的中心平移到原点——PCA 关心形状,不关心位置),然后:
读它的格子:对角线 Σᵢᵢ 是第 i 个特征自己的方差(这一轴上散多开);非对角 Σᵢⱼ 是特征 i 与 j 的协方差——正,两者同涨同跌;负,此消彼长;零,互不搭理。把每个协方差再除以两根标准差,就是你更熟悉的「相关系数」(−1 到 1)——相关系数矩阵是协方差矩阵的「归一化亲民版」,BI 报表里那张五颜六色的相关性热力图,画的就是它。第 05 章风控一章里马氏距离坐着的那个矩阵、第 10 章动物园里「点积出身、天生对称」的标本、第 15 章谱定理的常客——都是它。协方差矩阵是数据云的全部二阶信息:形状、朝向、胖瘦,一网打尽。
顺带认领第 15 章那幅「等高线椭圆」肖像的最后一块拼图:协方差矩阵的特征方向就是数据椭圆的长短轴,特征值就是各轴上的方差——对高斯分布的数据,等概率密度线恰好是这族椭圆。看见斜椭圆云,你的眼睛现在应该自动浮现两根互相垂直的隐形轴,以及压在轴上的两个 λ。
关键一步只有一行:数据在方向 w(单位向量)上投影的方差,恰好是二次型 wᵀΣw(代入投影定义展开即得)。于是「找方差最大的方向」变成「找让二次型最大的单位向量」——第 15 章的瑞利商!答案是现成的定理:最优方向 = Σ 的最大特征值对应的特征向量;能榨出的方差 = 那个特征值本身。第二主成分 = 第二特征向量,以此类推;谱定理保证它们互相垂直,天然构成一组新基(第 13 章:换到「主轴基」)。PCA 的全部数学,就是对协方差矩阵做一次谱分解。
Demo 里所有读数都能和公式一一对上:readout 打印的就是那只 2×2 协方差矩阵、两个特征值 λ₁ λ₂,以及 PC1 的方差占比;两根轴的长度按 √λ 画(标准差尺度),所以椭圆云约 95% 的点会落在「两倍轴长」的范围里——统计课上的椭圆置信区间,就是这幅图。实验清单:① 拉「相关强度」滑杆从 0 到 0.95:看点云从正圆(没有主旋律,两根轴平分秋色)逐渐拉成细长椭圆,紫轴 PC1 越来越笃定地锁住长轴方向,读数里 λ₁ 的方差占比一路涨向 100%;② 把相关强度调成负数:主轴翻到另一条对角线——「负相关」的几何长相;③ 点「投影到 PC1」:每个点沿垂直方向拍到紫轴上,活生生一次降维——二维变一维,丢掉的只是垂直方向那点薄薄的方差;④ 反复「重新采样」:注意 PC 轴在样本抖动下的稳定性,相关性越强越稳——特征值差距大,主方向才立得稳(两个 λ 接近时,轴在噪声里打转,这是 PCA 的已知软肋,第 17 章「相等奇异值方向可随意旋转」的实弹版);⑤ 投影开着的状态下再拉相关强度,看被丢掉的那一维(灰色虚线的长度)怎么随椭圆变瘦而缩短——「降维损失」有了肉眼读数。
同一枚硬币的另一面:重建误差
PCA 还有第二种推导,值得知道,因为它直通深度学习。换个问法:给数据云选一个 k 维子空间,把每个点投影(第 14 章)上去再「弹回」原空间,哪个子空间让「原点到重建点」的总误差最小?答案与「方差最大化」完全相同——因为勾股定理把每个点的长度拆成「投影内 + 投影外」两段,总量固定,保住的方差最大 ⇔ 丢掉的误差最小,一枚硬币的两面。
这个「压进低维再重建、令重建误差最小」的框架,眼熟吗?它就是自编码器(autoencoder)的定义。可以严格证明:一个线性、无激活函数的自编码器,训练收敛后学到的子空间就是 PCA 的主子空间——PCA 是最朴素的自编码器,自编码器是 PCA 的非线性续作。VAE、掩码自编码(MAE)、扩散模型的隐空间,这条家谱的根部钉着本章。顺带 PCA 也因此天生会去噪:噪声均匀地摊在所有方向上,信号集中在前几个主轴——投影到主子空间再重建,长尾方向连噪声带碎屑一起被滤掉,「截断即去噪」,与上一章谱读心术里的「尖峰加地毯」处方完全呼应。
五步流程与「能量占比」
工程上的 PCA 是一条五步流水线:中心化 →(视情况)标准化 → 谱分解协方差 → 按特征值排序取前 k 支特征向量拼成投影矩阵 W → 投影 Z = XW。新数据坐标 Z 就是「在主轴基下的读数」(第 13 章的 B⁻¹ 翻译,只是 W 正交、转置即逆)。k 怎么选?看方差解释率:前 k 个特征值之和 ÷ 全部之和——「保留 95% 方差」是最常用的默认阈值,和上一章图像压缩 Demo 里那个「能量占比」读数是同一笔账。
实操有个更稳的等价路线:跳过协方差矩阵,直接对中心化后的 X 做 SVD——V 的列就是主成分,奇异值平方 ÷ n 就是特征值。原因是第 14 章的老训诫:显式构造 XᵀX 会把条件数平方;sklearn 的 PCA 内部走的正是 SVD 路线。所以「PCA 是协方差的特征分解」是教学真相,「PCA 是数据矩阵的 SVD」是生产真相,两者在数学上同一。规模再大(百万样本 × 千维)就换随机化 SVD 或增量式 PCA,只追前 k 个方向,内存里永远不摊开整个协方差——第 17 章「截断算法」的直接受益人。
写成代码:十行 PCA,两条路线
import numpy as np X = np.random.randn(500, 2) @ np.array([[2.0, 1.2], [0, 0.4]]) Xc = X - X.mean(axis=0) # ① 中心化,不可省 # 路线 A:协方差 + 谱分解(教学版) C = Xc.T @ Xc / len(Xc) vals, vecs = np.linalg.eigh(C) # eigh:对称专用,升序 order = vals.argsort()[::-1] W = vecs[:, order] # 列 = 主成分,按方差降序 # 路线 B:直接 SVD 数据矩阵(生产版,条件数不平方) U, s, Vt = np.linalg.svd(Xc, full_matrices=False) np.allclose(np.abs(Vt), np.abs(W.T)) # True(至多差符号) Z = Xc @ W[:, :1] # 投影到 PC1:500×1,降维完成 X_rec = Z @ W[:, :1].T + X.mean(axis=0) # 重建(去噪版的自己) explained = vals[order] / vals.sum() # 方差解释率
十来行覆盖了流水线全程,也顺手示范了两个老纪律:对称矩阵用 eigh(第 15 章),比较两次分解先对符号脱敏(第 17 章)。sklearn 的 PCA(n_components=k) 是同一套的封装,还附赠 explained_variance_ratio_ 这张能量账单。
① EigenFaces 往事:九十年代的人脸识别,把几千张人脸图各拉直成万维向量做 PCA,前几十支主成分(重排回图片就是一张张「幽灵脸」)张成「人脸子空间」,识别 = 在这个子空间里比坐标——深度学习前夜最成功的视觉系统,纯本章技术;② embedding 体检与可视化:对一批句向量先 PCA 到 50 维再交给 t-SNE/UMAP 出图,是标准流水线(直接在 768 维上跑既慢又噪);注意 t-SNE 们是非线性降维,PCA 是它们的预处理,不是同类;③ 白化(whitening):PCA 后再把每个主轴除以 √λ,数据云被整成正圆——对比学习、经典视觉特征里的常见前处理,也是第 05 章马氏距离的「先把世界变圆」版;④ 梯度与激活的低维观察:训练轨迹投到前两个主成分上画「损失地形漫游图」,是分析优化行为的流行姿势。
「可视化图」到底该怎么读
既然到处都是「embedding 投到二维」的图,给三条读图纪律。第一,PCA 二维图只保住了全局线性结构:两团分得开是真分得开(线性可分的强证据),挤在一起不代表原空间也挤(可能只是这两维装不下);第二,t-SNE/UMAP 图相反:局部邻居关系可信,团与团的距离、团的大小基本是艺术创作,别拿尺子量;第三,任何降维图上的「轴」都没有物理含义(第 12 章:因子只定子空间),给横轴起名前先想想符号翻转它是否还成立。一图流的汇报文化里,这三条能帮你避开大多数集体幻觉。
识别用户「甩」手机的方向,教科书做法就是一次微型 PCA:攒最近 0.5 秒的加速度采样(一团三维点云),求协方差的主特征向量——PC1 就是甩动的主轴,特征值告诉你甩得多用力、方向多纯粹(λ₁ 独大 = 干脆的直线甩动;三个 λ 接近 = 乱晃)。同样,手势轨迹的「主方向判定」(横滑还是竖滑)、手写笔迹的倾斜校正,都是二维点云的 PC1 在拍板——你可能已经写过 PCA 而不自知,只是当时管它叫「算个主方向」。
四连坑,每个都有尸检报告。① 不标准化就 PCA:量纲大的特征(账户余额,单位:元)方差天然碾压量纲小的(点击率,0~1),PC1 会被它独占——第 05 章的量纲绑架在 PCA 里变本加厉;特征量纲不同时,先除以各自标准差(等价于对相关系数矩阵做 PCA)。② 方差大 ≠ 对任务重要:PCA 是无监督的,它保「散得开」,不保「分得开」——两类点可能恰好沿小方差方向才分得开,砍掉那维,分类信息全灭。有监督任务先试 PCA 降维要带脑子(或者用 LDA 这类带标签的方向选择)。③ 主成分的「含义」是事后故事:第 12 章说过因子只定子空间不定坐标,给 PC1 起名「消费能力」前,先确认换批数据它还稳定。④ PCA 只会拉直线:数据趴在弯曲流形上(瑞士卷),线性投影会把两层压在一起——那是流形学习的地盘,PCA 只是入场券。
把卷四的四章压成一幅动画:数据云斜躺在坐标纸上(原始基)→ 谱分解找到云的天然轴(15 章的特征方向)→ 旋转坐标纸对齐天然轴(13 章换基 + 16 章对角化,协方差变对角、特征间不再联动)→ 按轴上的方差排序,砍掉细的(17 章截断 = 18 章降维)。「旋转到对角,再按大小取舍」——九个字,卷四全部家当,也是你未来读到任何谱方法论文时该默想的画面。
① 协方差矩阵 [4, 0; 0, 1] 的主成分是什么?数据云长什么样?(不用算);
② Demo 里相关强度 0.9 时 λ₁ 占比约多少?调到 0 呢?先猜再验;
③ 为什么「中心化」不能省?不减均值,第一主成分会指向哪里?(提示:均值向量本身);
④ 128 维 embedding,前 10 个特征值占 92% 能量——压到 10 维再检索,速度与召回大概怎么变?
⑤ 你把「日消费金额(元)」和「登录次数」直接丢进 PCA,PC1 的系数几乎全在金额上——诊断 + 处方各一句;
⑥ 线性自编码器为什么学不出比 PCA 更好的子空间?加上非线性激活后,「更好」可能体现在哪类数据上?(提示:瑞士卷)。
大五人格的分寸感
开头那个问卷故事,补一个分寸。心理测量学实际用的是 PCA 的近亲因子分析(FA):PCA 说「主成分是特征的组合」,FA 反过来假设「存在少数隐因子,特征是因子的表现 + 各自的噪声」——建模方向相反,数学高度重叠,小数据上结论常常接近。「大五」能立住,靠的不是一次分解,而是跨语言、跨文化、跨几十年重复出现同样的五个方向——用第 12 章的话说,子空间在重采样下稳定,才配得上命名。这正是坑③「成分含义要复核」的正面教材:数学给方向,科学给意义,中间隔着可重复性这道关。给你的数据起「用户活跃因子」这类名字前,请让它先过同一道关。
小结:卷四收官
PCA = 给数据云找主轴:中心化后,协方差矩阵(对称半正定,云的二阶档案)做谱分解,特征向量是互相垂直的主成分,特征值是各轴方差,方差解释率定 k,生产上直接 SVD 数据矩阵更稳;「方差最大」与「重建误差最小」是同一枚硬币,线性自编码器学到的就是它,截断顺手兼职去噪;先标准化、方差不等于重要性、成分含义要复核、弯的流形拉不直——四条坑纪律比公式更值钱;读降维图的三条纪律,能救你于集体幻觉。卷四的四章连起来读,就是一部「换基的胜利」:特征向量给了方向(15),对角化给了算力(16),SVD 给了普适性(17),PCA 把它们全部兑换成数据红利(18)。到这里,线性代数的理论行囊已经装满,一颗螺丝都不缺。卷五开拔:走进真实的 AI 模型——先学会看懂它们的「形状语言」张量,然后亲手把神经网络、注意力和 LoRA 逐一拆回你熟悉的这些零件。