想象你要出国旅行一个月,行李箱却只有 20 寸。你塞进十件衣服、五双鞋、三本厚书,结果拉链都拉不上——所有想带的东西纠缠在一起:五双鞋其实只对应两种风格,十件衣服里有六件能互相混搭出同样的效果。高维数据就是这样,特征很多、冗余很多,像一只塞爆的行李箱。整理行李有两条经典路线:路线一,先做统计,看哪些物品老是一起出现(协方差矩阵),把纠缠解开,找出几个“黄金组合”(特征向量),按重要程度排名(特征值);路线二,不统计,直接把整箱倒出来解剖,发现箱子里的东西本质上只是几个“基础模板”乘上不同份量叠加出来的(奇异值分解)。你可能会问:这两条路线整理出来的最佳方案一样吗?答案令人惊讶——完全一样。这就是 PCA 与 SVD 的内在联系,是降维算法背后最优雅的秘密之一。
掌握 PCA 与 SVD 的等价性,你就能看懂 sklearn 的 PCA 源码里为什么调用的是 SVD,也能在实际建模中选对降维工具、算对特征空间,这是 AI 工程师处理高维数据的必备内功。
可视化演示
展示系统处理流水线、实时性能指标曲线及多方案对比分析,包含数据流转、吞吐延迟监控与方案评估。
本节配有交互动效(进入视口后自动加载,约 3KB)。
系统可视化 处理流程:输入→处理→模型→输出 性能监控:实时指标 P=L×T
降维动机
行李空间有限,这是所有旅行者都要面对的残酷现实。你的二十寸行李箱里,五双鞋其实只对应两种风格,三本厚书只有一本真正会翻——大量物品在功能上高度重叠。高维数据也是同一回事:一个用户可能有几百个特征字段,但很多字段彼此相关,比如“年龄”和“工龄”高度纠缠,“月收入”和“年收入”几乎是同一件事。特征越多,存储和计算成本越高,还可能让模型陷入“维度灾难”——数据点之间的距离越来越稀疏,统计规律反而看不清。
所以降维的第一步,是学会给数据“记账”。我们有一张数据矩阵 \(X\),它的每一行是一个样本(一件行李),每一列是一个特征(一个属性)。要了解哪些特征冗余,就统计它们之间的协方差——协方差为正是同涨同跌,接近零则是互不相干。把这张“纠缠账本”写出来,就是协方差矩阵:
有了这张账本,你就能判断哪些物品该精简:方差大的特征(对角线上的账目多)说明这件物品“个性突出”值得保留,协方差大的特征对则说明它们重叠严重,可以合并。降维的目标,正是从一堆纠缠的原始特征中,提炼出少数几个互不相关、又能最大程度代表整体信息的“新组合”。
- 数据矩阵\(X\) 是一个 \(n \times d\) 矩阵,\(n\) 是样本数(行李件数),\(d\) 是特征数(属性种类数)。
- 转置相乘\(X^{\mathsf{T}}X\) 会把每一对特征的内积都算一遍,得到一个 \(d \times d\) 的对称矩阵,记录特征之间的纠缠程度。
- 取平均除以 \(n\) 是为了消除样本量影响,得到“每个样本平均贡献多少纠缠”。
PCA核心思想
现在你站在行李箱前,思考一个更具体的问题:如果只能带三件“组合装备”,哪三件能最大程度地区分“你”和“别人”的旅行风格?你不需要问“单件物品最重的是什么”,而要问“沿着哪个方向整理,物品的差异最大”。这个方向,就是数据里方差最大的方向——主成分。
主成分分析(PCA)的想法非常直观:把数据投影到一条直线上,投影后的散点越是铺得开(方差大),说明这条直线保留的信息越多。想象把三维房间里的家具投影到一面墙上,有的角度看过去全都叠在一起,有的角度看过去每件家具都清清楚楚。你最想要的就是“看得最清楚”的那个角度。
用数学语言说,我们要找一个单位方向向量 \(\mathbf{w}\),让所有数据点投影到它上面之后的方差最大。这个目标写成优化问题就是:
所以我们要求的方向向量 \(\mathbf{w}\),恰好是协方差矩阵 \(C\) 的特征向量;对应的特征值 \(\lambda\) 就是投影后的方差。特征值越大,这个方向携带的信息越多。找到第一个方差最大的方向后,PCA 会找第二个与它正交的方向,依次类推,得到一组互不相关的主成分。
回到行李场景:你不需要真的背十件衣服五双鞋,只需要找出三个“风格坐标”——比如“正式度”“户外度”“保暖度”。每件衣服都是这三个坐标的组合,携带三件黄金组合装备就够应对所有场合了。PCA 的本质,就是把原始的、彼此纠缠的特征坐标系,旋转成一个彼此正交、按信息量排序的新坐标系。
- 目标函数\(\mathbf{w}^{\mathsf{T}} C \mathbf{w}\) 是数据沿方向 \(\mathbf{w}\) 投影后的方差,C 就是协方差矩阵。
- 单位约束\(\mathbf{w}^{\mathsf{T}}\mathbf{w} = 1\) 强制方向向量长度为 1,防止把方向拉长来“作弊”增大方差。
- 拉格朗日求解引入乘子 \(\lambda\),对 \(\mathbf{w}\) 求导并令其为零,得到 \(C\mathbf{w} = \lambda \mathbf{w}\)——这正是特征方程。
协方差分解
既然方向向量藏在一个特征方程里,下一步就是把“纠缠账本”彻底解开。协方差矩阵 \(C\) 是一个对称矩阵,对称矩阵有个很好的性质:它总能被分解成一堆“特征向量×特征值”的叠加,像是先把账本的乱账拆成一条条独立的账目。这个操作叫做特征分解。
设 \(C\) 是 \(d \times d\) 对称矩阵,特征分解为:
这一步干的事情,就像把行李里纠缠成一团的物品按“风格”归类:\(\mathbf{v}_i\) 是第 \(i\) 类黄金组合的配比,\(\lambda_i\) 是这套组合在整箱行李里占的份量。把 \(\lambda\) 从大到小排序,前 \(k\) 个组合就是最值得留下的装备。如果 \(\lambda_1\) 远大于其他所有特征值,说明这一个方向就能解释绝大部分差异——你的行李其实只需要一件“万能冲锋衣”。
值得注意的是,特征值还有个几何含义:它精确等于数据沿对应特征向量方向投影后的方差。所以 \(\lambda_i\) 越大,第 \(i\) 个主成分保留的原始信息就越多。PCA 最后做的事情,就是把原始数据投影到前 \(k\) 个特征向量张成的空间里,完成降维。
- 特征向量矩阵\(V = [\mathbf{v}_1, \mathbf{v}_2, \ldots, \mathbf{v}_d]\),每一列是一个单位特征向量,对应一个“黄金组合配方”。
- 特征值矩阵\(\Lambda = \mathrm{diag}(\lambda_1, \lambda_2, \ldots, \lambda_d)\) 是对角矩阵,对角元是特征值,代表每个配方的“信息份量”。
- 秩一展开\(\lambda_i \mathbf{v}_i \mathbf{v}_i^{\mathsf{T}}\) 表示第 \(i\) 个方向对协方差矩阵的贡献,全部加起来正好还原 \(C\)。
SVD原理
整理行李的第二条路线:不先统计纠缠关系,而是把整个行李箱倒出来直接解剖。你发现箱子里所有的物品,无非是几个“基础版型”(比如“黑色基础款”“防水户外款”)按照不同份量(数量、厚度)叠加出来的。任何一件衣服,都是这几个模板的线性组合。
奇异值分解(SVD)就是这种“整箱解剖”的数学实现。它不对任何方阵做要求,任意形状的数据矩阵 \(X\)(比如 \(n\) 张照片 × \(d\) 个像素)都能分解成三个矩阵相乘:
奇异值 \(\sigma\) 的大小直接告诉我们每个模式的重要程度:最大的奇异值对应的 \(U, V\) 列,描述了数据中最主要的变动方向;较小的奇异值对应的模式,往往是细节和噪声。SVD 的美妙之处在于,它把数据矩阵本身拆成了“模式 × 份量 × 模式”的浓缩结构,行和列的纠缠同时被解开,不需要经过任何中间统计量。
回到行李,这条路线等价于你把所有衣服铺在地板上,拆解出“版型矩阵 U”“数量表 Σ”“风格配方 V^T”三张清单。你甚至不需要先烦恼“哪些物品纠缠”——因为拆完之后,纠缠自然消失了。这正是 SVD 最强大的地方:它适用于任何矩阵,包括严重“长方形”的数据表。
- 左奇异向量\(U\) 的列是 \(XX^{\mathsf{T}}\) 的特征向量,可以理解为“样本模式”——每列对应一个基础的“人”或“样本模板”。
- 奇异值对角阵\(\Sigma\) 是对角矩阵,对角线上的元素 \(\sigma_1 \ge \sigma_2 \ge \cdots \ge 0\) 叫奇异值,代表每个模式的“份量”。
- 右奇异向量\(V\) 的列是 \(X^{\mathsf{T}}X\) 的特征向量,可以理解为“特征模式”——每个“黄金组合配方”。
等价性证明
现在到了最激动人心的时刻:路线一(统计协方差 → 特征分解)和路线二(直接 SVD 解剖),得到的“最佳打包方案”会一样吗?答案是肯定的。证明只需要把 SVD 代入协方差矩阵公式里,一切自然显现。
假设数据矩阵 \(X\) 已做中心化,对其做 SVD:\(X = U \Sigma V^{\mathsf{T}}\)。代入协方差矩阵:
这个推导揭示了惊人的结论:PCA 的主方向(协方差矩阵的特征向量)就是 SVD 的右奇异向量;PCA 的特征值就是 SVD 奇异值的平方除以样本数。降维后的数据坐标也可以用 SVD 直接写出——投影结果 \(X V_k\) 恰好等于 \(U_k \Sigma_k\)。两条路线从不同入口出发,最终抵达同一个数学内核。
行李整理到这一步,你已经看穿两套“方法论”的底层是同一本账:路线一的“黄金组合配方表”和路线二的“风格解剖报告”记录的是完全相同的信息,只是格式不同。PCA 是从“变量之间的关系”出发理解数据,SVD 是从“数据本身的结构”出发理解数据,但它们在代数上可以互相推导、完全等价。
- 代入 SVD把 \(X = U\Sigma V^{\mathsf{T}}\) 代入 \(X^{\mathsf{T}}X\),转置时顺序反转:\((ABC)^{\mathsf{T}} = C^{\mathsf{T}}B^{\mathsf{T}}A^{\mathsf{T}}\)。
- 正交化简\(U\) 的列互相正交且单位化,所以 \(U^{\mathsf{T}}U = I\),中间三项缩成一个 \(\Sigma^{\mathsf{T}}\Sigma\)。
- 对角阵结构\(\Sigma^{\mathsf{T}}\Sigma\) 是对角矩阵,对角线上是奇异值的平方 \(\sigma_i^2\)。
- 对照特征分解把上式与 \(C = V \Lambda V^{\mathsf{T}}\) 对比,立刻看出 \(V\) 就是特征向量矩阵,\(\lambda_i = \sigma_i^2 / n\)。
高效计算
既然两条路线殊途同归,为什么不总是选更省事的那条?关键就在计算效率与数值稳定性上。路线一要先构造协方差矩阵 \(C = X^{\mathsf{T}}X / n\),这一步要花 \(O(d^2 n)\) 的时间,再对 \(d \times d\) 矩阵做特征分解,又花 \(O(d^3)\)。如果特征是十万维(比如一张 100×100 的图片展开),构造协方差矩阵就是十亿量级的存储和计算,几乎不可行。
路线二直接用 SVD 处理原始矩阵 \(X\),复杂度约为 \(O(m n d)\)(取小值),而且不需要显式构造协方差矩阵。更关键的是,计算 \(X^{\mathsf{T}}X\) 会带来双重舍入误差——相当于把一个数先平方再开方,精度被放大了损失。SVD 绕开了这个步骤,数值稳定性显著更好。所以现代库(sklearn 的 PCA、numpy 的 linalg.svd)底层几乎都走 SVD 路线。
降维投影在 SVD 框架下有一个非常优雅的等价写法:
在 Python 里这就是三行代码的事:先中心化,再 np.linalg.svd(Xc, full_matrices=False),取 Vt[:k].T 作为主方向。SVD 的实现还能利用“瘦矩阵”技巧:当样本数 \(n\) 远小于特征数 \(d\) 时,只需要算前 \(\min(n, d)\) 个奇异值,速度呈数量级提升。这就是为什么在大数据时代,SVD 成了 PCA 的事实标准实现方式。
- 投影原始定义\(T = X V_k\) 是把中心化后的数据投影到前 \(k\) 个右奇异向量上,得到 \(n \times k\) 的降维坐标矩阵。
- SVD 等价形式代入 \(X = U\Sigma V^{\mathsf{T}}\) 后,中间项约掉,投影坐标直接等于 \(U_k \Sigma_k\)——省去一次矩阵乘法。
- 实际取前 k 列\(U_k\) 取 \(U\) 的前 \(k\) 列,\(\Sigma_k\) 取前 \(k\) 个最大的奇异值。
典型应用
理解了两者的等价关系,你的工具箱里相当于多了一把万能钥匙,许多经典应用都是这把钥匙的延伸。最著名的是人脸识别中的“特征脸”(Eigenfaces)方法:把每张人脸照片拉成一个像素向量,几千张人脸组成数据矩阵 \(X\),对它做 SVD,得到的右奇异向量就是一张张“人脸基本款”——特征脸。任意一张脸,都是这些特征脸的线性组合。
1. 截断 SVD:只保留前 \(k\) 个最大的奇异值及对应向量,其余置零。
2. 压缩重构:\(\widehat{X}\) 是用 \(k\) 个模式重建的近似数据。人脸只需要大约 20~50 个特征脸就能还原出可辨认的轮廓。
3. 信息取舍:被丢弃的 \(d-k\) 个模式对应小奇异值,通常是光照、噪声等无关细节。
这个重构公式也是图像压缩的核心思想:不再保存整张 \(100\times100\) 的大矩阵,而只保存 \(U_k、\Sigma_k、V_k^{\mathsf{T}}\) 三小块,压缩率可达十几倍。数据可视化同样受益:一篇文本有几千维的 TF-IDF 特征,直接画图几乎不可能;先用 PCA(底层 SVD)降到两维,再画散点图,文档的聚类结构就一目了然了。
在行李比喻里,这些应用就像你学会了“用三件黄金组合装备还原一套完整衣橱”——特征脸是还原人脸的基础款,压缩矩阵是还原原始表格的基础款,降维坐标是还原高维信息的浓缩坐标。SVD 让你不必背下整箱物品,只需要记住几个模板和它们的份量,就能在需要时精准还原。
选型指南
现在你手里有两条路:显式特征分解和直接 SVD。实际工程中该如何选择?第一条经验法则看维度:当样本数 \(n\) 远小于特征数 \(d\) 时,直接用 SVD 几乎总是更好的选择,因为协方差矩阵是 \(d \times d\) 的庞然大物,根本构造不起;当 \(d\) 较小而 \(n\) 很大时,两条路差别不大,但 SVD 的实现仍更常用,因为它自动处理数值稳定性。
第二条法则看需求:如果你需要解释每个主成分与原始特征的线性关系(比如因子分析、载荷图),显式拿到协方差矩阵的特征向量会更直观;如果你只关心降维后的坐标和压缩效果,SVD 一把梭更快。sklearn 的 PCA 类正是如此设计——默认使用 SVD,同时提供 components_ 属性让你查看主方向。
那么,降维到多少维合适?一个常用的判断标准是解释方差比,它是奇异值平方的累积占比:
选型总结起来就一句话:数据堆得越“细长”(n 小 d 大),SVD 的优势越明显;需要讲清“每个主成分是什么”时,再回头看特征分解。在行李场景里,如果你要跟朋友解释“为什么这件冲锋衣最重要”,你会亮出协方差矩阵的载荷表;如果你只是想把 20 件行李压缩成 3 个箱位,SVD 能最快给出答案。两条路,一条重解释,一条重效率,但内核始终是同一个。
- 分子前 \(k\) 个奇异值平方之和,代表保留下来的信息总量。
- 分母所有奇异值平方之和,等于数据的总体方差。
- 比值\(R_k\) 越大,说明前 \(k\) 个主成分保留的信息比例越高。通常取 \(R_k \ge 0.9\) 对应的最小 \(k\)。
AI 应用场景
人脸识别中的特征脸
阶段:特征工程与数据预处理
解决的问题:一张 100×100 的人脸照片展开就是 10000 维向量,直接做距离计算不但慢,而且受光照、背景干扰大。传统方法需要手工设计面部特征,泛化能力差。用 PCA(底层 SVD)提取“特征脸”作为基向量,把每张脸投影到 20~50 维的特征脸空间,既压缩了存储,又自动去除了噪声。
具体案例:一个访客登记系统采集了 1000 张员工人脸照片,每张 64×64 像素。工程师将 1000×4096 的数据矩阵中心化后做 SVD,取前 30 个右奇异向量作为特征脸。新访客拍照后投影到同一空间,得到 30 维坐标,与库中所有坐标计算欧氏距离,最近邻小于阈值即匹配成功。识别速度从每张数毫秒降到亚毫秒,准确率还提升了不少。
高维数据可视化
阶段:数据探索与结果呈现
解决的问题:几十上百维的数据(如基因表达、文本 TF-IDF、用户行为特征)无法直接画图,统计师只能用两两散点图矩阵凑合,看不出整体聚类结构。先用 PCA 把维度降到 2~3 维,再绘制散点图或作为 t-SNE、UMAP 的前置降噪步骤,既能快速发现数据群体,又避免了高维噪声淹没流形结构。
具体案例:做电商用户分群时,每个用户有 120 个行为特征。数据团队先对特征矩阵做标准化和中心化,再用 np.linalg.svd 快速得到前 2 个主成分,画出用户分布散点图,发现明显分成“价格敏感型”“品质优先型”“高频冲动型”三个簇。这个发现直接指导了后续聚类模型的 K 值选择。
Python 演示
import numpy as np def pca_evd(X, k=2): """方式一:对协方差矩阵做特征分解(路线一)""" Xc = X - X.mean(axis=0) cov = np.cov(Xc, rowvar=False) vals, vecs = np.linalg.eigh(cov) idx = np.argsort(vals)[::-1][:k] return vecs[:, idx], vals[idx] def pca_svd(X, k=2): """方式二:对数据矩阵直接做奇异值分解(路线二)""" Xc = X - X.mean(axis=0) U, S, Vt = np.linalg.svd(Xc, full_matrices=False) return Vt[:k].T, S[:k] ** 2 / (Xc.shape[0] - 1) def project(X, vectors): Xc = X - X.mean(axis=0) return Xc @ vectors if __name__ == "__main__": rng = np.random.default_rng(42) n, d = 200, 3 X = rng.normal(size=(n, d)) X[:, 2] = 2 * X[:, 0] + 0.5 * X[:, 1] + rng.normal(scale=0.1, size=n) W1, lam1 = pca_evd(X) W2, lam2 = pca_svd(X) align = np.sign((W1 * W2).sum(axis=0)) W2 = W2 * align print("特征分解主方向:\n", np.round(W1, 6)) print("SVD 主方向:\n", np.round(W2, 6)) print("方向最大偏差:", np.abs(W1 - W2).max()) print("特征值对照:", np.round(lam1, 6), np.round(lam2, 6)) print("投影最大偏差:", np.abs(project(X, W1) - project(X, W2)).max())
Xc = X - X.mean(axis=0)数据中心化,这是 PCA 与 SVD 等价的前提,也是展示动画里的“阶段1”。np.cov(Xc, rowvar=False)计算协方差矩阵,rowvar=False表示每一列是一个特征。np.linalg.eigh(cov)对称矩阵的高效特征分解,返回升序特征值及其特征向量,适合方阵。np.argsort(vals)[::-1][:k]把特征值按从大到小排序,取前 k 个对应的索引,对应“选最重的几件行李”。np.linalg.svd(Xc, full_matrices=False)经济型 SVD,返回 U (n×d)、S (d,)、Vt (d×d),避免存储无意义的零块。Vt[:k].T取前 k 个右奇异向量作为主方向,这正是等价性证明里“PCA 主方向 = 右奇异向量”的代码体现。S[:k] ** 2 / (Xc.shape[0] - 1)奇异值平方除以样本数减一,换算成协方差特征值,即 \(\lambda_i = \sigma_i^2 / (n-1)\)。align = np.sign((W1 * W2).sum(axis=0))处理特征向量符号翻转问题,因为 v 与 -v 代表同一个主方向。
常见误区
误区我一直以为 PCA 是统计学方法、SVD 是数值代数方法,两者只是恰好都能降维,就像用筷子和叉子都能吃饭但毫无关系。平时用 sklearn 的 PCA 类,从没想过它和 SVD 有什么关系。
正解它们其实是同一枚硬币的两面。对中心化数据 X 做 SVD,右奇异向量 V 恰好就是协方差矩阵 X^T X/(n-1) 的特征向量(主方向),奇异值平方对应特征值,降维坐标 X V_k 就等于 U_k Σ_k。sklearn 的 PCA 底层默认就是 SVD,你在调 fit 时它实际调用了 np.linalg.svd。两者差异只是“从统计出发”还是“从矩阵分解出发”,数学内核完全一致。
为何常见:教科书通常把统计教材里的 PCA 和数值教材里的 SVD 分在不同章节讲,很少把两者的推导放在一起对照,读者自然觉得它们是两套独立理论。
误区PCA 是找方差最大的方向,直接对原始矩阵做 SVD 也能得到主方向,所以中心化可有可无,反正算出来的方向都一样。
正解方差是围绕均值的波动,如果不减去均值,数据整体的位置(质心偏移)会变成一个巨大的“伪方差”,第一个主成分会被整体位置绑架,而不是真正的变化方向。等价性证明的前提就是 X 已中心化。实操中,要用训练集的均值去中心化训练和测试数据,且测试时不能重新算均值,否则会把分布信息泄漏进去。
为何常见:网上很多示例代码直接 np.linalg.svd(X) 不中心化,也确实能算出一个结果,让初学者误以为预处理不重要,其实那算的是未中心化数据的“近似 PCA”,方向可能差很多。
误区特征分解只对方阵定义,奇异值分解听起来也差不多,应该也只能分解方形矩阵吧?数据表通常不是方形的,所以我一直不敢用。
正解SVD 对任意 m×n 矩形矩阵都成立,这正是它比特征分解更普适的地方。分解结果 X = U Σ V^T 中,U 是 m×m、Σ 是 m×n、V 是 n×n(或用经济型取 min(m,n) 列),任何形状的数据都能拆。这也是为什么 PCA 直接用 SVD 实现时,根本不需要构造 d×d 的协方差矩阵。
为何常见:课堂先学特征分解,再引入 SVD 时总觉得两者结构相似,学生容易把“分解=特征分解”的限定条件错误地推广到 SVD。
误区PCA 跑了两次,结果的特征向量符号完全相反,第一次是正的、第二次是负的,肯定是我代码里随机种子没设好,或者哪一步写错了。
正解如果 v 是特征向量,那么 -v 也一定是特征向量,它们代表同一个主方向,只是朝向标记不同。SVD 和特征分解的结果本来就定义到符号为止,这是正常现象不是 bug。检查正确性时应该比较方向(比如对齐符号后对比,或比较投影结果),而不是直接比元素符号。
为何常见:人类直觉上“方向相反=不同”,但代数学上特征空间对整体乘以 -1 不敏感,这类符号歧义在数值库中很常见,eigh 和 svd 的符号行为甚至不一定一致。
面试题
Q1. 用“整理行李”的比喻,PCA 里的“主成分”最像下面哪一项?
- A.最能拉开差异的打包组合← 正确答案
- B.最重的那一件单件物品
- C.行李箱里最大的那一个隔层
- D.从家到机场的最短路线
答案:A。主成分是原始特征的线性组合,且方差越大信息越多,相当于“最能拉开人和人差异的风格组合”。B 只关注单个特征且用“重量”类比不恰当;C 是物理空间,D 与数据无关。这题考察对 PCA 目标“最大方差投影”的直觉理解。
Q2. PCA 要求各主成分之间满足什么关系?
- A.相互正交且按方差降序排列← 正确答案
- B.相互平行且方差完全相同
- C.线性相关且均值逐步增大
- D.彼此独立且特征值全部相等
答案:A。PCA 找第一个最大方差方向后,会在与之正交的补空间里继续找,所以所有主成分两两正交,且按特征值(方差)从大到小排列。如果平行或线性相关,就存在信息冗余,违背降维初衷;D 中特征值全相等意味着各方向信息量相同,与“主次分明”矛盾。
Q3. 关于 SVD 分解 \(X = U\Sigma V^{\mathsf{T}}\),以下哪些说法是正确的?
- A.U 的列是 X X^T 的特征向量← 正确答案
- B.V 的列是 X^T X 的特征向量← 正确答案
- C.Σ 的对角元是奇异值,且非负← 正确答案
- D.U 一定是方阵且行数等于特征数
答案:ABC。由 SVD 定义可直接推导:X X^T = U Σ² U^T,所以 U 的列是 X X^T 的特征向量;X^T X = V Σ² V^T,所以 V 的列是 X^T X 的特征向量;奇异值按定义非负且通常降序排列。D 错误,U 的行数等于样本数 n,列数取决于是否使用经济型分解,并不一定等于特征数。
Q4. 设 X 是已中心化的数据矩阵,其 SVD 为 X = UΣV^T,那么 X 的协方差矩阵 \(C = \frac{1}{n-1}X^{\mathsf{T}}X\) 满足什么性质?
- A.特征值等于奇异值平方除以样本数减一← 正确答案
- B.特征值等于奇异值本身的数值
- C.特征向量等于左奇异向量 U 的列
- D.协方差矩阵与奇异值矩阵完全相同
答案:A。代入 SVD 得 C = V(Σ²/(n-1))V^T,特征向量是右奇异向量 V 的列,特征值是 σ²/(n-1)。B 漏掉了平方和缩放因子;C 错在把 U 当成了特征向量,U 对应的是 XX^T 的特征向量;D 显然不对,C 是 d×d 而 Σ 是 n×d。这题检验 PCA 与 SVD 的精确数量关系。
Q5. PCA 选择主成分方向的核心标准是什么?
- A.投影后方差尽可能最大← 正确答案
- B.投影后均值尽可能最大
- C.数据点的总数尽可能最少
- D.特征数量减少到一半即可
答案:A。PCA 的优化目标是最大化投影方差,即最大化 w^T C w。均值和样本总数是数据自身的属性,PCA 不改变它们。D 中“减少到一半”没有信息量依据,降维 k 的选择取决于解释方差比,而不是固定的削减比例。
Q6. 关于 PCA 的预处理,以下说法正确的有哪些?
- A.必须对每列数据中心化(去均值)← 正确答案
- B.标准化(Z-score)可根据量纲情况选择← 正确答案
- C.只需要把数据矩阵转置即可完成预处理
- D.任何预处理都不需要,直接分解原始矩阵
答案:AB。中心化是 PCA 的前提,否则质心偏移会污染最大方差方向;数据各特征量纲差异大时(比如身高 180cm、体重 70kg)需先标准化,否则量纲大的特征会主导主成分,所以 B 正确。C 只是改变矩阵形状,D 违反中心化要求。标准化是否必需取决于特征是否同量纲,这也是面试常问的细节。
Q7. scikit-learn 中 PCA 类底层默认采用什么算法实现?
- A.奇异值分解 SVD← 正确答案
- B.梯度下降优化
- C.牛顿迭代法求根
- D.蒙特卡洛随机采样
答案:A。sklearn 的 PCA 使用截断 SVD(基于 LAPACK 的 gesdd),这是因为它避免显式计算协方差矩阵,数值更稳定且适用于高维稀疏数据。梯度下降、牛顿迭代是优化工具,蒙特卡洛是采样方法,都不是 PCA 的默认矩阵分解实现。
Q8. 当样本数 n 远小于特征数 d 时,用 SVD 实现 PCA 比直接特征分解更快,主要原因是什么?
- A.避免了构造 d×d 的协方差矩阵← 正确答案
- B.SVD 不需要进行任何矩阵乘法
- C.奇异值一定小于协方差特征值
- D.右奇异向量的数量总是比特征向量少
答案:A。直接特征分解要先算 X^T X(d×d),构造它就要 O(d²n) 时间和 O(d²) 内存,在 d 巨大时直接爆掉。SVD 直接处理 n×d 矩阵,复杂度约 O(nd²)(取小值),省去了构造协方差矩阵的平方开销。B 错误,SVD 内部也有矩阵运算;C、D 与计算复杂度无关。
Q9. 降维后的坐标矩阵 T 与 SVD 之间的关系是?
- A.T = X V_k = U_k Σ_k← 正确答案
- B.T = Σ V^T,即奇异值乘右奇异向量
- C.T = U V,即左奇异向量乘右奇异向量
- D.T = X X^T,即数据乘自身的转置
答案:A。把 X = UΣV^T 代入 X V_k,V^T V_k = I(k 列选择),得到 U_k Σ_k,所以降维坐标同时有两种等价写法,这正是 SVD 高效实现 PCA 的关键。B 中 Σ V^T 是重构路径的一部分,不是坐标;C、D 涉及 U 与 V 的乘积或 X X^T,都不等于降维坐标。
Q10. PCA 自身的局限性包括哪些?
- A.只能捕捉特征之间的线性关系← 正确答案
- B.对离群点比较敏感← 正确答案
- C.主成分往往缺乏可解释性← 正确答案
- D.无法把数据降到一维
答案:ABC。PCA 本质是线性变换,无法处理强非线性流形,所以 t-SNE/UMAP 才流行;方差最大化使离群点(巨大投影方差)会扭曲主方向;主成分是原始特征的线性组合,业务含义往往说不清。D 错误,降到一维是完全允许的,取 k=1 即可。这题考察对 PCA 适用边界的理解。