第 3 章 线性代数 III:特征分解、SVD 与矩阵分解

前两章讲的都是"一个矩阵对向量做了什么",本章问一个更本质的问题:是否存在一组方向,A 在这组方向上只做伸缩、不改变方向? 答案是特征向量。沿着这条线索会自然得到对角化、谱定理、正定矩阵,最后推广到对任意长方形矩阵都成立的 SVD。SVD 是本章的重心:它同时给出了四个基本子空间的正交基、最优低秩近似(Eckart-Young 定理)、压缩率公式,以及 PCA 的全部代数推导。

学习目标

读完本章,你应当能够:

  1. 计算特征值与特征向量,写出特征多项式并说明其根与原矩阵的关系;
  2. 判定矩阵是否可对角化,并陈述谱定理(实对称矩阵必可正交对角化);
  3. 判定正定矩阵(特征值判据 / 顺序主子式判据),并解释正定性与二次函数凸性的关系;
  4. 从 AᵀA 与 AAᵀ 的特征分解完整构造 SVD,说明 U、Σ、V 各列与四个基本子空间的对应关系;
  5. 陈述并说明 Eckart-Young 定理,推导截断 SVD 的压缩率并完成数值计算;
  6. 推导 PCA 的两种等价提法(方差最大化 / 重构误差最小化),写出主成分选择依据;
  7. 实现基于 numpy 的 SVD 压缩与 PCA。

前置知识检查

你需要知道在哪一节补齐
子空间、维数、秩与零空间第 1 章 1.1.4、1.3.1
Col(A) 与 N(Aᵀ) 正交、维数分别为 r 与 m−r第 1 章 1.3.2
内积、范数、正交矩阵 Q⁻¹ = Qᵀ第 2 章 2.1、2.3.1
最小二乘与投影第 2 章 2.3.3
协方差矩阵维度 d×d第 1 章 1.5.1
凸函数的基本定义本章 3.3.3 给出判据,完整展开见第 6 章 6.1 节
多元函数求导、∂(xᵀAx)/∂x = 2Ax(A 对称)本章 3.3.3 直接给出并解释

3.1 特征值与特征向量

3.1.1 几何直觉

对 n 阶方阵 A,若存在非零向量 v 和标量 λ 使 Av = λv,则称 λ 是 A 的特征值(eigenvalue),v 是对应的特征向量(eigenvector)。

几何含义:绝大多数向量被 A 作用后方向会改变,但特征向量的方向不变,只被拉伸或压缩 λ 倍。λ > 1 拉长,0 < λ < 1 压缩,λ = 0 直接压成零方向,λ < 0 反向拉长。换句话说,特征向量是"被 A 特殊对待的方向",λ 是那个方向上的增益。

注意 v ≠ 0 这个条件不能省:若允许 v = 0,任何 λ 都满足 A0 = λ0,特征值就失去了信息。也正因如此,特征向量总是按方向定义的——v 是特征向量则 cv 也是(c ≠ 0),所以谈论特征向量时关心的是一维子空间,即特征空间(eigenspace) E_λ = N(A − λI)。

3.1.2 特征多项式

把 Av = λv 移项得 (A − λI)v = 0。这是齐次方程组且要求非零解,由第 1 章 1.4.1 的等价条件,当且仅当 A − λI 不可逆:

1
det(A − λI) = 0        ← 特征多项式,展开后是 λ 的 n 次多项式

由代数基本定理,它在复数域上恰好有 n 个根(计重数),所以 n 阶矩阵有 n 个特征值(含重根与复根)。两条常用系数关系可用于验算:

1
2
λ₁ + λ₂ + … + λₙ = tr(A)         (迹 = 特征值之和)
λ₁ · λ₂ · … · λₙ = det(A)        (行列式 = 特征值之积)

第二条立刻给出一个重要推论:det(A) = 0 等价于至少有一个特征值为 0,这正是第 1 章"可逆性十条等价条件"里的第 10 条。

手算示例:A = [2 1; 1 2]。

1
2
3
4
5
det(A − λI) = (2−λ)² − 1 = λ² − 4λ + 3 = (λ−1)(λ−3) = 0  ⟹  λ₁ = 1, λ₂ = 3
验算:λ₁+λ₂ = 4 = tr(A) ✓    λ₁λ₂ = 3 = det(A) ✓

求特征向量:(A − I)v = [1 1; 1 1]v = 0   ⟹  v₁ = [1, −1]ᵀ
            (A − 3I)v = [−1 1; 1 −1]v = 0 ⟹  v₂ = [1, 1]ᵀ

v₁ᵀv₂ = 1 − 1 = 0:两个特征向量恰好正交。这不是巧合——A 是对称矩阵,见 3.2.3 节的谱定理。

3.1.3 特征值的两个工程含义

  • λ 是"该方向上的增益"。在迭代 x_{k+1} = Ax_k 中,x_k = Σcᵢλᵢ^k vᵢ,绝对值最大的特征值(谱半径 ρ(A) = max|λᵢ|)最终主导行为:ρ(A) < 1 收敛到 0,ρ(A) > 1 发散。梯度下降的收敛条件、Jacobi / Gauss-Seidel 迭代法的收敛判据都是这一条(第 5 章 5.4 节)。
  • λ 是 Hessian 的特征值时刻画曲率。若损失函数在某点的 Hessian 有特征值 λᵢ,则沿对应特征方向的曲率就是 λᵢ;病态(ill-conditioned)问题的特征是 λ_max/λ_min 很大,此时梯度下降在"陡"方向震荡、在"平"方向爬得极慢——这正是动量法与自适应学习率方法存在的理由(第 6 章 6.3、6.4 节)。第 1 章 1.3.4 节的"零空间方向"在此得到更精细的刻画:λ = 0 的方向完全平坦,λ 很小的方向近似平坦。

3.2 对角化与谱定理

3.2.1 相似变换与对角化

若存在可逆矩阵 P 使 P⁻¹AP = Λ(Λ 为对角阵),称 A 可对角化(diagonalizable),P⁻¹AP 与 A 相似。

为什么会想到这样做:对角矩阵的幂、指数、逆都是逐元素的:若 A = PΛP⁻¹,则 A^k = PΛ^k P⁻¹(中间所有 P⁻¹P 全部抵消)、e^A = Pe^ΛP⁻¹,计算极便宜。

对角化的充要条件:A 有 n 个线性无关的特征向量(此时取 P = [v₁ … vₙ]、Λ = diag(λ₁,…,λₙ),直接验证 AP = PΛ)。

情形是否可对角化说明
n 个特征值互不相同一定可不同特征值的特征向量必线性无关
有重根,但每个 λ 的几何重数 = 代数重数可以几何重数 = n − r(A − λI)
有重根且几何重数 < 代数重数不可以缺特征向量,称为亏损矩阵
实对称矩阵一定可以(且可正交对角化)谱定理
一般实矩阵特征值可能是复数如旋转矩阵 [0 −1; 1 0] 的特征值为 ±i

亏损的典型例子是 A = [1 1; 0 1]:λ = 1 是二重根,但 A − I = [0 1; 0 0] 的秩为 1,几何重数 = 2 − 1 = 1 < 2,只有一个特征向量 [1,0]ᵀ,无法对角化。这类矩阵必须用 Jordan 标准型处理,工程上更常用 SVD(对任何矩阵都存在)。

3.2.2 为什么"实对称"这么特殊

实对称矩阵(Aᵀ = A)在本章反复出现,因为它有两条其他矩阵没有的好性质,各自只需三行就能证明。

性质一:特征值全为实数。 设 Av = λv、v ≠ 0。一方面 v̄ᵀ(Av) = λ(v̄ᵀv);另一方面用 A = Aᵀ = Āᵀ 与"标量的转置等于自身"得

1
v̄ᵀAv = (v̄ᵀAv)̄ᵀ = vᵀĀᵀv̄ = vᵀAv̄ = λ̄(v̄ᵀv)

两式相等给出 (λ − λ̄)(v̄ᵀv) = 0。而 v̄ᵀv = Σ|vᵢ|² > 0,故 λ = λ̄,即 λ 为实数。

性质二:不同特征值的特征向量正交。 设 Av₁ = λ₁v₁、Av₂ = λ₂v₂ 且 λ₁ ≠ λ₂。用两种方式结合 v₁ᵀAv₂:(Av₁)ᵀv₂ = λ₁(v₁ᵀv₂)(先算 Av₁)、v₁ᵀ(Av₂) = λ₂(v₁ᵀv₂)(先算 Av₂)。但

1
(Av₁)ᵀv₂ = v₁ᵀAᵀv₂ = v₁ᵀAv₂        ← 用了 Aᵀ = A

两式相等即 (λ₁ − λ₂)(v₁ᵀv₂) = 0,由 λ₁ ≠ λ₂ 得 v₁ᵀv₂ = 0。

重要

这两个证明的每一步都用到 Aᵀ = A,对称性是关键前提。非对称矩阵的特征值可以是复数,特征向量也不必正交。这就是"实对称矩阵必可正交对角化"的全部依据来源。

3.2.3 谱定理

定理(spectral theorem,实对称版本):设 A 是 n 阶实对称矩阵,则存在正交矩阵 Q(QᵀQ = I)使

1
A = QΛQᵀ ,   Λ = diag(λ₁, …, λₙ) ,   Q = [q₁ q₂ … qₙ](标准正交特征向量)

它的意义比"可以对角化"强得多:一般对角化得到的是 A = PΛP⁻¹,P 可以是任意可逆矩阵;谱定理保证 P 能取成正交矩阵,即 P⁻¹ = Pᵀ。为什么正交性如此重要:Q 正交意味着它保长度、保内积(第 2 章 2.3.1),所以 A = QΛQᵀ 可以读作"旋转 → 沿坐标轴伸缩 → 旋转回来";若 P 不正交,这个分解就不能解释成"旋转 + 伸缩",几何意义会丢失,数值上也会放大误差(第 2 章 2.4.2 节)。

推广形式(用于 SVD):对任意 A ∈ R^{m×n},AᵀA(n×n)与 AAᵀ(m×m)都是实对称且半正定的,因此都可用谱定理正交对角化——这一步是 SVD 的全部起点(见 3.4 节)。

3.2.4 相似变换下的不变量

A 与 P⁻¹AP 共享一系列性质,这些不变量在化简矩阵时非常有用:

不变量理由
特征值(含重数)det(P⁻¹AP − λI) = det(P⁻¹(A−λI)P) = det(A−λI)
迹tr(P⁻¹AP) = tr(APP⁻¹) = tr(A)(迹的轮换性)
行列式由特征值不变 + det = Πλᵢ
秩P、P⁻¹ 可逆,乘可逆矩阵不改变秩
正定性见 3.3 节,由特征值不变推得

迹的轮换性 tr(ABC) = tr(BCA) 是高频工具,证明只需展开定义循环置换下标即得。它在推导 AᵀA 与 AAᵀ 有相同非零特征值时是关键一步(3.4.2 节)。

3.3 二次型与正定矩阵

3.3.1 二次型

二次型(quadratic form) 是关于 x 的二次齐次多项式,统一写成 f(x) = xᵀAx,其中 A 可取对称矩阵而不失一般性:因为 xᵀAx 的值只取决于 A 的对称部分 (A + Aᵀ)/2,反对称部分贡献 xᵀ((A−Aᵀ)/2)x = 0(用"标量的转置等于自身"可验证)。代入谱定理 A = QΛQᵀ,令 y = Qᵀx(把 x 换成特征向量坐标):

1
f(x) = xᵀQΛQᵀx = yᵀΛy = λ₁y₁² + λ₂y₂² + … + λₙyₙ²

这是理解二次型的核心一步:任何二次型在特征向量坐标系下都只是"带权重的平方和",权重就是特征值。所以二次型的几何形状完全由特征值的符号和大小决定。

3.3.2 正定的定义与判据

若对任意 x ≠ 0 都有 xᵀAx > 0,称对称矩阵 A 正定(positive definite),记 A ≻ 0;若 ≥ 0 则称半正定(A ⪰ 0)。由 f(x) = Σλᵢyᵢ² 且 y = Qᵀx 是可逆线性变换(x ≠ 0 ⟺ y ≠ 0),立刻得到特征值判据:

1
2
A ≻ 0   ⟺   所有特征值 λᵢ > 0
A ⪰ 0   ⟺   所有特征值 λᵢ ≥ 0

顺序主子式判据(不需要求特征值,只需算行列式):记 Δ_k 为左上角 k×k 子矩阵的行列式(第 k 阶顺序主子式),则 A ≻ 0 ⟺ Δ₁ > 0, Δ₂ > 0, …, Δₙ > 0。

两个判据各有适用场景:低维手算用顺序主子式,理论推导用特征值(因为特征值直接对应"方向上的曲率")。验证示例:A = [2 1; 1 2],Δ₁ = 2 > 0、Δ₂ = 3 > 0 ⟹ 正定,与 3.1.2 节算出的特征值 1, 3 都为正一致。

三个必背的正定矩阵来源:

矩阵结论理由
AᵀA(A 列满秩)正定xᵀAᵀAx = ‖Ax‖² > 0(x ≠ 0 且 N(A) = {0})
AᵀA(A 任意)半正定同上,但 x ∈ N(A) 时取等号
协方差矩阵 Σ半正定它是 (A−Ā)ᵀ(A−Ā)/(n−1) 的形式;若各特征线性无关则正定
严格对角占优矩阵若对称则正定Gershgorin 圆盘定理

AᵀA 的正定性是第 2 章投影矩阵 P = A(AᵀA)⁻¹Aᵀ 里 (AᵀA)⁻¹ 存在的原因,也是 SVD 能构造出来的基础。

3.3.3 正定性与凸性

考虑二次函数 f(x) = xᵀAx − 2bᵀx + c,它的梯度与 Hessian 为

1
∇f = 2Ax − 2b ,   ∇²f = 2A

为什么 Hessian 正定就等价于凸(本章与第 6 章的接口,第 6 章 6.1 节展开):对任意两点 x、y,由二阶 Taylor 展开(A 对称时 ∂(xᵀAx)/∂x = 2Ax)可得

1
f(y) = f(x) + ∇f(x)ᵀ(y − x) + (y − x)ᵀA(y − x)  >  f(x) + ∇f(x)ᵀ(y − x)   (当 A ≻ 0,y ≠ x)

右端正是凸函数的一阶定义(函数图像处处在其切线之上)。所以 A ≻ 0 ⟺ f 严格凸。

凸性的直接工程价值是局部最优即全局最优:令 ∇f = 0 得 Ax = b,解唯一且就是全局最小值点。线性回归的最小二乘目标 ‖Ax − b‖² 的 Hessian 是 2AᵀA,而 AᵀA 半正定,所以目标总是凸的——这是最小二乘不必担心局部极小的根本原因。逻辑回归的交叉熵损失也是凸的,而"MSE + Sigmoid"非凸(第 9 章 9.2.4 节),差别的根源就在 Hessian 是否正定。

警告

“所有元素为正”不等于正定。反例:A = [1 2; 2 1] 元素全正,但 Δ₂ = −3 < 0、特征值为 3 和 −1,不是正定矩阵。判定的正确入口是特征值符号或顺序主子式符号,不是元素符号;“对角元全正"同样只是必要不充分条件。

3.4 SVD:奇异值分解

3.4.1 为什么需要 SVD

实对称矩阵能正交对角化,但大多数矩阵既不对称、也不是方阵。SVD 解决的就是这个问题,而且它对任意 m×n 实矩阵都存在。

定理(SVD):任意 A ∈ R^{m×n}(r = r(A))可分解为 A = UΣVᵀ,其中 U 是 m×m 正交矩阵,V 是 n×n 正交矩阵,Σ 是 m×n 的"对角"矩阵,对角线元素 σ₁ ≥ σ₂ ≥ … ≥ σ_r > 0、σ_{r+1} = … = 0,称为奇异值(singular values)。约定降序排列后,Σ 就唯一确定了。

几何解释:A 作用在 n 维单位球上,得到的像是一个 m 维椭球,椭球的半轴长度恰好是 σᵢ,方向是 uᵢ。写成映射的语言就是

1
2
3
4
5
6
    x  ──Vᵀ──▶  Vᵀx  ──Σ──▶  Σ Vᵀx  ──U──▶  U Σ Vᵀx = Ax      A = U Σ Vᵀ
  (n 维)      旋转/反射      沿轴伸缩        旋转/反射
              (正交)        (σᵢ 倍)       (正交)

   单位圆 ──A──▶ 椭球:  v₁ 方向(输入) ──▶ 长度 σ₁ = 5 的 u₁ 方向(输出)
                        v₂ 方向(输入) ──▶ 长度 σ₂ = 3 的 u₂ 方向(输出)

所以任何线性映射都可以拆成"旋转 → 沿正交方向缩放 → 旋转"三步:它把"矩阵很复杂"消解为"两组正交方向 + 一组缩放因子”。

3.4.2 从 AᵀA 与 AAᵀ 的谱定理构造 SVD

SVD 的构造完全是"把谱定理用两次"。

第一步:对 AᵀA 用谱定理。 AᵀA 是对称半正定矩阵,所以存在正交矩阵 V 使

1
AᵀA = V Λ Vᵀ ,   Λ = diag(λ₁, …, λₙ) ,  λ₁ ≥ λ₂ ≥ … ≥ λₙ ≥ 0

定义 σᵢ = √λᵢ。由于 ‖Avᵢ‖² = vᵢᵀAᵀAvᵢ = vᵢᵀ(λᵢvᵢ) = λᵢ‖vᵢ‖² = λᵢ,所以 σᵢ = ‖Avᵢ‖。vᵢ 是 AᵀA 的特征向量,称为 A 的右奇异向量。

第二步:构造左奇异向量。 对 i ≤ r(即 λᵢ > 0),定义 uᵢ = Avᵢ / σᵢ。验证它标准正交:

1
uᵢᵀuⱼ = (Avᵢ)ᵀ(Avⱼ) / (σᵢσⱼ) = vᵢᵀAᵀAvⱼ / (σᵢσⱼ) = λⱼ(vᵢᵀvⱼ) / (σᵢσⱼ) = δ_ij

(i = j 时 λᵢ/σᵢ² = 1;i ≠ j 时 vᵢᵀvⱼ = 0。)对 i > r 有 Avᵢ = 0,需要另行扩充一组标准正交向量把这 m − r 个方向补齐——它们张成的正是 N(Aᵀ)。补完之后 U 是正交矩阵,且

1
AV = [Av₁ … Av_r, 0 … 0] = [σ₁u₁ … σᵣuᵣ, 0 … 0] = UΣ   ⟹   A = UΣVᵀ

顺带得到的两个恒等式(它们说明 AᵀA 与 AAᵀ 的非零特征值完全相同):

1
2
AᵀA = VΣᵀUᵀUΣVᵀ = V(ΣᵀΣ)Vᵀ    (ΣᵀΣ = diag(σ₁², …, σᵣ², 0, …, 0),n×n)
AAᵀ = UΣVᵀVΣᵀUᵀ = U(ΣΣᵀ)Uᵀ    (ΣΣᵀ = diag(σ₁², …, σᵣ², 0, …, 0),m×m)

用迹的轮换性可以直接验证非零特征值相同:tr(AᵀA) = tr(AAᵀ) = Σσᵢ²。注意两个矩阵的大小不同(n×n 与 m×m),只是非零特征值相同——这正是"用小的那个算会更省"的依据:m ≫ n 时计算 AᵀA(n×n)远比 AAᵀ 便宜。

3.4.3 SVD 与四个基本子空间的一一对应

这是 SVD 最有价值的结构性结论:U 和 V 的列向量分别给出了四个基本子空间的标准正交基,一把全给了。

子空间所在空间维数标准正交基依据
列空间 Col(A)R^mr{u₁, …, u_r}Avᵢ = σᵢuᵢ ≠ 0,且这 r 个向量正交
左零空间 N(Aᵀ)R^mm−r{u_{r+1}, …, u_m}构造时补齐的方向,满足 Aᵀuᵢ = 0
行空间 Col(Aᵀ)R^nr{v₁, …, v_r}AᵀAvᵢ = λᵢvᵢ ≠ 0,是 AᵀA 的非零特征空间
零空间 N(A)R^nn−r{v_{r+1}, …, v_n}Avᵢ = 0(对应 λᵢ = 0)
1
2
3
4
5
6
7
            输入空间 R^n                              输出空间 R^m
   ┌───────────────────────────┐          ┌───────────────────────────┐
   │  v₁ … v_r   行空间 (r)    │          │  u₁ … u_r   列空间 (r)    │
   │      ↓ Avᵢ = σᵢuᵢ          │  ──A──▶  │                           │
   │  v_{r+1}…v_n 零空间 (n−r) │          │  u_{r+1}…u_m 左零空间(m−r)│
   │      ↓ Avᵢ = 0             │          │      ↑ Aᵀuᵢ = 0            │
   └───────────────────────────┘          └───────────────────────────┘

这张表把第 1 章的四子空间图彻底具体化了:第 1 章只说明"存在这样的分解",SVD 直接给出显式且标准正交的坐标。三条工程含义:

  1. 求零空间基不用消元,直接取 V 的后 n−r 列(数值上更稳,因为正交)。
  2. 条件数 cond(A) = σ₁/σ_r,奇异值衰减速度决定问题有多病态;第 2 章 2.3.4 节"AᵀA 把条件数平方"现在可精确表述为 cond(AᵀA) = (σ₁/σ_r)²。
  3. 伪逆 A⁺ = VΣ⁺Uᵀ(Σ⁺ 是把 Σ 转置后把非零奇异值取倒数),它统一处理"长方形"“降秩"所有情形,是第 2 章 (AᵀA)⁻¹Aᵀ 的推广。

3.4.4 Eckart-Young 定理:截断 SVD 是最优低秩近似

截断 SVD:只保留前 k 个奇异值:

1
A_k = Σ_{i=1}^{k} σᵢ uᵢvᵢᵀ = U_k Σ_k V_kᵀ ,   U_k: m×k ,  Σ_k: k×k ,  V_kᵀ: k×n

注意 A_k 是外积之和的形式:每一项 σᵢuᵢvᵢᵀ 是一个 m×n 的秩 1 矩阵。把一个矩阵拆成若干个秩 1 矩阵按奇异值加权求和,这是 SVD 最常用的计算视角。

定理(Eckart-Young-Mirsky):对任意 m×n 矩阵 A 和任意 k,

1
2
‖A − A_k‖₂ = σ_{k+1}        (谱范数,即最大奇异值)
‖A − A_k‖_F = √(σ_{k+1}² + … + σ_r²)   (Frobenius 范数)

并且在所有秩不超过 k 的矩阵 B 中,A_k 同时使这两个误差达到最小:

1
A_k = argmin_{r(B) ≤ k} ‖A − B‖

这个定理回答的问题是:如果只允许用秩 k 的矩阵去近似 A,最优选择是什么?答案是"把小的奇异值全部丢掉”。证明思路(秩约束下的最优性):设 B 的秩不超过 k,则 dim N(B) ≥ n − k。取 N(B) 与 span{v₁, …, v_{k+1}}(维数 k+1),两者维数之和 (n−k) + (k+1) = n + 1 > n,所以交集非平凡,存在非零 w 同时属于两者。把 w 用 v₁…v_{k+1} 展开,则

1
‖A − B‖₂² ≥ ‖(A − B)w‖² / ‖w‖² = ‖Aw‖² / ‖w‖² ≥ σ_{k+1}²

第一个等号用了 Bw = 0;最后一步用了 Aw = Σ_{i≤k+1} σᵢ(vᵢᵀw)uᵢ,因而 ‖Aw‖ ≥ σ_{k+1}‖w‖。于是任何秩 k 矩阵的误差下界都是 σ_{k+1},而 A_k 恰好达到它,故最优;Frobenius 版本逐项累加同理。

提示

核心推论可直接背下来:误差等于被丢掉的那部分奇异值。“保留多少秩"因此有了定量答案:想让相对误差低于 ε,就保留到 σ_{k+1}/σ₁ < ε(谱范数口径)。这也解释了为什么奇异值谱"衰减快"的矩阵能被强力压缩:衰减快意味着丢掉尾部几乎不损失信息。

3.4.5 压缩率计算

存储 A_k 需要三块,合计 k(m + n + 1) 个数:

部分形状存储量
U_km×kmk
Σ_k(对角)kk
V_kᵀk×nkn
合计k(m + n + 1)

原矩阵需要 mn 个数,于是

1
2
压缩后占比 = k(m + n + 1) / (mn)        减少比例 = 1 − k(m + n + 1)/(mn)
有效条件:  k(m + n + 1) < mn   ⟺   k < mn/(m+n+1)     (否则截断 SVD 更占空间)

关键认知:存储量随秩 k 线性增长(正比于 k(m+n)),而不是原来的 mn——低秩压缩的本质就是把二次量 mn 换成线性量 k(m+n),所以只有 k 小于 m、n 的调和平均量级时才划算。

真题计算(1000×800,保留秩 k = 50):

1
2
3
4
原存储: 1000 × 800 = 800,000
截断后: U(1000×50) = 50,000 ,  Vᵀ(50×800) = 40,000 ,  Σ(50 个) = 50
         合计 = 90,050
压缩后占比 = 90,050 / 800,000 = 11.26%      减少比例 = 1 − 0.1126 = 88.74%

考场加速技巧:先估量级即可定位选项——k(m+n)/(mn) = 50/800 + 50/1000 = 0.1125,即保留约 11%、减少约 89%,与精确值只差 0.3 个百分点,不必纠结那个 +1。

3.4.6 代码实战

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
import numpy as np

def svd_compress(A: np.ndarray, k: int) -> tuple:
    """对 A 做秩 k 截断 SVD,返回 (A_k, 压缩后占比, 相对误差)。"""
    # full_matrices=False 得到"经济型" SVD:U 为 m×r、Vt 为 r×n,正好对应要存的三块
    U, s, Vt = np.linalg.svd(A, full_matrices=False)

    U_k, s_k, Vt_k = U[:, :k], s[:k], Vt[:k, :]   # 只留前 k 个奇异值及其向量
    A_k = (U_k * s_k) @ Vt_k                      # 等价于 Σ σᵢuᵢvᵢᵀ,用广播避免显式循环

    m, n = A.shape
    stored = k * (m + n + 1)                      # 存储量随 k 线性增长,这是压缩的来源
    rel_err = np.linalg.norm(A - A_k) / np.linalg.norm(A)   # 相对 Frobenius 误差
    return A_k, stored / (m * n), rel_err

rng = np.random.default_rng(0)
A = rng.standard_normal((1000, 800))              # 满秩随机矩阵,奇异值衰减慢

for k in (10, 50, 100, 200):
    _, ratio, err = svd_compress(A, k)
    print(f"k={k:3d}  存储占比={ratio:7.4%}  相对误差={err:.4f}")

运行结果会显示一个反直觉的现象:随机矩阵在 k = 200 时相对误差仍很大,存储占比却已超过 45%。原因是纯随机矩阵的奇异值谱几乎不衰减(第 4 章 4.4 节的 Marchenko-Pastur 分布),此时"低秩"假设根本不成立。真实数据矩阵(图像、词嵌入、注意力权重)的奇异值谱通常在前几十个就衰减到很小——这正是 LoRA、模型压缩、推荐系统隐语义模型(第 11 章 11.3 节)能工作的经验前提:能不能压缩,取决于奇异值衰减得多快,而不是矩阵有多大。

3.5 PCA 的代数推导

主成分分析(Principal Component Analysis, PCA) 的目标是把 d 维数据压到 k 维,同时尽可能保留信息。这里给出代数版本(等价于 SVD);统计视角(方差最大化与重构误差最小化的对偶)见第 11 章 11.1 节。

3.5.1 设定与中心化

设数据矩阵 A ∈ R^{n×d}:n 个样本、每个 d 维特征。第一步必须中心化(每一列减去该列均值),记中心化后为 Ã。理由:协方差刻画的是"围绕均值的波动”,不中心化的话第一主成分会被均值方向主导,得到的只是"数据整体在哪",而不是"数据往哪个方向散得最开"。协方差矩阵(第 1 章 1.5.1 节)为 Σ = (1/(n−1))ÃᵀÃ(d×d,对称半正定)。

3.5.2 从 SVD 得到主成分

对 Ã 做 SVD:Ã = UΣVᵀ。代入协方差定义:

1
Σ = (1/(n−1)) VΣᵀUᵀUΣVᵀ = V (ΣᵀΣ/(n−1)) Vᵀ = V diag(σ₁²/(n−1), …) Vᵀ

与谱定理 Σ = VΛVᵀ 对照,立即得到核心结论:

1
2
3
第 i 个特征值  λᵢ = σᵢ²/(n−1)   (即第 i 个主成分方向上的方差)
第 i 个主成分  vᵢ(V 的第 i 列,也称 loading 方向)
第 i 个得分    z_i = Ãvᵢ = σᵢuᵢ (样本在主成分方向上的坐标,n 维)

第一条是整个 PCA 的判断依据所在:协方差矩阵的第 i 个特征值就等于数据在第 i 主成分方向上的方差。所以"保留多少维"可以量化:

1
累计贡献率 = (Σ_{i=1}^{k} λᵢ) / (Σ_{i=1}^{d} λᵢ) = (Σ_{i=1}^{k} σᵢ²) / (Σ_{i=1}^{d} σᵢ²)

实践中取它达到 85% 或 95% 所需的最小 k。注意分母是全部 d 个特征值之和(即总方差 tr(Σ)),不是最大特征值。

3.5.3 两个等价提法

PCA 有两条看似不同的推导路径,它们的解完全相同,理解这点能避免把 PCA 当成"凭经验的技巧"。

提法一:方差最大化。 找一个单位方向 w(‖w‖ = 1),使投影得分的方差 wᵀΣw 最大:max_w wᵀΣw s.t. ‖w‖ = 1。用拉格朗日乘子 L = wᵀΣw − λ(wᵀw − 1),令 ∂L/∂w = 2Σw − 2λw = 0 得 Σw = λw。最优 w 就是 Σ 最大特征值对应的特征向量,最优值即该特征值;后续主成分在前面正交的约束下依次取第 2、3…… 大的特征向量。注意 ‖w‖ = 1 这个约束不能去掉:否则把 w 无限放大就能让方差无限大,问题无解。

提法二:重构误差最小化。 用 W ∈ R^{d×k}(WᵀW = I_k)把数据压到 k 维再还原:Ã ≈ ÃWWᵀ,最小化 ‖Ã − ÃWWᵀ‖_F²。由 Eckart-Young 定理(3.4.4),ÃWWᵀ 是秩 k 的最佳近似,其解正是取前 k 个右奇异向量。

两者等价的原因:总方差 ‖Ã‖_F² = Σσᵢ² 是定值,“保留的方差"与"重构误差"之和恒等于它。所以最大化前者就是最小化后者,从两端看是同一个解。

重要

三条实战易错点:其一,必须中心化,否则第一主成分捕捉的是均值;其二,特征向量必须单位化(模长恒为 1,携带不了信息量),能反映信息量的是特征值;其三,特征值越大越应保留,按 1/λ 加权会把最该丢弃的方向排到最前。

3.5.4 代码实战

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
import numpy as np

def pca(A: np.ndarray, k: int) -> tuple:
    """对 A(n×d) 做 PCA,返回降维得分与各主成分的方差解释率。"""
    A = np.asarray(A, dtype=np.float64)

    # 中心化:不减去均值的话,第一主成分会被"数据中心在哪"主导,而不是"数据往哪散"
    A_centered = A - A.mean(axis=0, keepdims=True)

    # 用 SVD 而不是显式构造 d×d 协方差再求特征值:d 很大时省内存且数值更稳
    U, s, Vt = np.linalg.svd(A_centered, full_matrices=False)

    scores = U[:, :k] * s[:k]                 # 投影得分 = σᵢ uᵢ,形状 n×k
    explained = s ** 2 / np.sum(s ** 2)       # 方差解释率 = λᵢ / Σλ
    return scores, explained, Vt[:k].T        # 最后一个返回主成分方向(d×k)

rng = np.random.default_rng(1)
basis = rng.standard_normal((5, 2))           # 真实维度只有 2 的 5 维数据
data = rng.standard_normal((500, 2)) @ basis.T + 0.1 * rng.standard_normal((500, 5))
scores, explained, comps = pca(data, 2)
print("各主成分方差解释率:", np.round(explained, 4))   # 前两个应接近 1

注意 np.linalg.svd 返回的 s 已按降序排列,不需要额外排序——这也是"约定 σ₁ ≥ σ₂ ≥ …“的实际好处。

本章小结

关键结论一句话表述常见错误
特征值Av = λv(v ≠ 0);det(A − λI) = 0;Σλᵢ = tr(A)、Πλᵢ = det(A)允许 v = 0;忘记重根要算重数
对角化可对角化 ⟺ 有 n 个线性无关特征向量以为有重根就一定不可对角化
谱定理实对称矩阵必可 A = QΛQᵀ,Q 正交以为任意可对角化矩阵都能取正交的 P
正定判定所有特征值 > 0,或所有顺序主子式 > 0用"元素全为正"或"对角元为正"判定
正定与凸性A ≻ 0 使 f(x) = xᵀAx − 2bᵀx + c 严格凸,局部最优即全局最优把非凸损失当成凸的来调度学习率
SVD 构造σᵢ = √λᵢ(AᵀA),vᵢ 是 AᵀA 特征向量,uᵢ = Avᵢ/σᵢ忘记 i > r 时需补齐 U 的其余列
SVD 与子空间{u₁…u_r}=列空间、{u_{r+1}…u_m}=左零空间、{v₁…v_r}=行空间、{v_{r+1}…v_n}=零空间把列空间与行空间的基搞混
Eckart-Young截断 SVD 是所有秩 k 矩阵中误差最小者,误差 = σ_{k+1}以为按其他准则(如按元素)丢弃更好
压缩率存 k(m+n+1),减少比例 = 1 − k(m+n+1)/(mn)只算 U 和 Vᵀ 忘了 Σ 的 k 个数
PCA 依据λᵢ = σᵢ²/(n−1) 即该方向方差;按累计贡献率达 85%/95% 取 k不中心化;用特征向量模长判断信息量

自测题

Q1(计算)设 A = [4 1; 1 4]。求特征值、特征向量,判断是否正定,写出谱分解 A = QΛQᵀ。

答案与解析
1
2
3
4
5
6
7
8
9
det(A − λI) = (4−λ)² − 1 = λ² − 8λ + 15 = (λ−3)(λ−5) = 0  ⟹  λ₁ = 5, λ₂ = 3
验算:和为 8 = tr(A) ✓   积为 15 = det(A) = 16 − 1 ✓

λ₁ = 5: (A − 5I)v = [−1 1; 1 −1]v = 0  ⟹  v₁ = [1,1]ᵀ/√2
λ₂ = 3: (A − 3I)v = [1 1; 1 1]v = 0    ⟹  v₂ = [1,−1]ᵀ/√2

谱分解:
A = QΛQᵀ = (1/√2)[ 1   1 ] [ 5  0 ] (1/√2)[ 1   1 ]
                   [ 1  −1 ] [ 0  3 ]       [ 1  −1 ]

v₁ᵀv₂ = (1 − 1)/2 = 0,正交,符合谱定理。两个特征值都大于 0(也可用 Δ₁ = 4 > 0、Δ₂ = 15 > 0 验证),故 A 正定。

注意 Q 的两列要按 Λ 中特征值的顺序摆放,这是最常见的错误来源。展开验证:QΛQᵀ 的第一行第一列 = (5+3)/2 = 4 ✓,第一行第二列 = (5−3)/2 = 1 ✓。

Q2(推导)设 A ∈ R^{m×n},证明 AᵀA 与 AAᵀ 的非零特征值完全相同。

答案与解析

设 λ > 0 是 AᵀA 的特征值,v ≠ 0 为对应特征向量:AᵀAv = λv。两边左乘 A 得 AAᵀ(Av) = λ(Av)。关键是要确认 Av ≠ 0:若 Av = 0,则 AᵀAv = 0,即 λv = 0,与 λ > 0、v ≠ 0 矛盾。所以 Av ≠ 0,且它是 AAᵀ 对应于同一个 λ 的特征向量。

于是 AᵀA 的正特征值集合 ⊆ AAᵀ 的正特征值集合;把 A 与 Aᵀ 的角色互换得反向包含,两者相等,证毕。

替代证法:用迹的轮换性算 tr((AᵀA)^k) = tr((AAᵀ)^k)(反复把 A 与 Aᵀ 轮换),所有幂的迹相同即所有非零特征值的幂和相同,由牛顿恒等式得非零特征值相同。

实际用途:当 m ≫ n 时 AᵀA 是 n×n 的小矩阵,而 AAᵀ 是 m×m 的大矩阵;算奇异值只需对小的那个做特征分解(np.linalg.svd 在 full_matrices=False 时正是这么做的)。它还说明 r(AᵀA) = r(AAᵀ) = r(A)。

Q3(计算)已知某 600×400 矩阵的全部奇异值满足 σᵢ = 100/i(i = 1, 2, …)。(a) 若保留秩 k = 20,存储减少多少比例?(b) 用谱范数口径,秩 20 的截断误差与相对误差(相对 σ₁)各是多少?

答案与解析

(a) 原存储 600 × 400 = 240,000。截断后 U(600×20) = 12,000、Vᵀ(20×400) = 8,000、Σ(20) = 20,合计 20,020:

1
压缩后占比 = 20,020 / 240,000 ≈ 8.34%     减少比例 = 1 − 0.0834 = 91.66%

用近似公式核对:k(m+n)/(mn) = 20/400 + 20/600 = 0.0833,与精确值几乎一致。

(b) 由 Eckart-Young 定理,谱范数误差 ‖A − A₂₀‖₂ = σ₂₁ = 100/21 ≈ 4.762,相对误差 = σ₂₁/σ₁ = 1/21 ≈ 4.76%。

两个要点:其一,误差只取决于第一个被丢掉的奇异值 σ_{k+1},与保留了多少个无关;其二,σᵢ = 100/i 的衰减是 1/i(很慢),丢掉 21 号后仍有近 5% 的相对误差——若要求相对误差低于 1%,需 1/(k+1) < 0.01 即 k ≥ 100。这正是"奇异值衰减速度决定可压缩性"的定量体现:1/i 衰减要保留 100 维,而按 0.5^(i−1) 指数衰减时取 k = 7 就已到 0.5⁶ ≈ 1.6%。

Q4(辨析)以下四条关于 SVD 与 PCA 的说法,哪些正确?

A. U 的列向量都是 AAᵀ 的特征向量,且前 r 个张成列空间 B. PCA 中特征向量的模长表示该主成分保留的方差大小 C. 若 A 的奇异值为 [10, 1, 0.1, 0.01],则秩 1 近似已经保留了约 99% 的 Frobenius 能量 D. 截断 SVD 的 A_k 一定比原矩阵 A 的存储量小

答案与解析

A、C 正确。

A:由 AAᵀ = U(ΣΣᵀ)Uᵀ(3.4.2 节),U 的每一列都是 AAᵀ 的特征向量,对应特征值 σᵢ²(i ≤ r)或 0(i > r);前 r 个满足 Avᵢ = σᵢuᵢ ≠ 0,张成 Col(A)。

B:错。特征向量一律单位化,模长恒为 1,不携带任何信息量;能反映信息量的是特征值或累计贡献率。

C:Frobenius 能量按 σᵢ² 计,总能量 = 100 + 1 + 0.01 + 0.0001 = 101.0101,保留 σ₁² = 100,占比 ≈ 99.0% ✓。注意两种范数口径差别很大:用谱范数看 σ₂/σ₁ = 10%,远没有 1% 那么乐观——Frobenius 会把被丢弃的小分量平方后进一步压低。答题先看清题目用哪个范数。

D:错。压缩有效的条件是 k < mn/(m+n+1)。反例:A 是 100×100、k = 90,原存储 10,000,截断后 90 × 201 = 18,090,反而变大。所以"低秩必压缩"是错的,必须核对 k 与矩阵形状的关系。

Q5(实现)给定中心化后的数据矩阵 Ã ∈ R^{n×d},用 SVD 计算前 k 个主成分的累计贡献率,并与"先算 d×d 协方差矩阵再求特征值"的结果对比,说明两者为何一致。

答案与解析
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
import numpy as np

def explained_via_svd(A_centered: np.ndarray, k: int) -> np.ndarray:
    """用 SVD 算累计贡献率。A_centered 必须已中心化。"""
    # full_matrices=False:只需经济型分解,避免构造巨大的 m×m 矩阵
    _, s, _ = np.linalg.svd(A_centered, full_matrices=False)
    ratios = s ** 2 / np.sum(s ** 2)      # λᵢ = σᵢ²/(n−1),公因子 (n−1) 在比值里约掉
    return np.cumsum(ratios)[:k]

def explained_via_cov(A_centered: np.ndarray, k: int) -> np.ndarray:
    """先构造协方差矩阵(d×d)再特征分解。"""
    n = A_centered.shape[0]
    cov = (A_centered.T @ A_centered) / (n - 1)
    eigvals = np.linalg.eigvalsh(cov)[::-1]   # 转降序,与 SVD 的 σ 顺序对齐
    eigvals = np.clip(eigvals, 0, None)       # 舍入可能产生极小负值,截断防止后续开方出 NaN
    return np.cumsum(eigvals / np.sum(eigvals))[:k]

rng = np.random.default_rng(7)
X = rng.standard_normal((300, 40))
X = X - X.mean(axis=0, keepdims=True)         # 中心化
print(np.round(explained_via_svd(X, 5), 6))
print(np.round(explained_via_cov(X, 5), 6))   # 两行结果应在 1e-12 量级内一致

两者一致的原因(本题核心):由 3.5.2 节,Σ = (1/(n−1))ÃᵀÃ = V diag(σ₁², …)Vᵀ/(n−1),即协方差矩阵的特征值就是奇异值平方除以 n−1。累计贡献率的分子分母都带 1/(n−1) 因子,约掉后两种算法给出完全相同的结果。

工程上优先用 SVD 的两个理由:其一,d 很大时构造 d×d 协方差矩阵要 O(d²) 内存,而 SVD 可直接在 n×d 数据上做;其二,显式构造 AᵀA 会把条件数平方(第 2 章 2.3.4 节),病态数据下特征值会出现明显误差甚至负值——上面的 np.clip 就是给这类舍入负值打的补丁,SVD 路线不需要它。

与真题的关联

真题考查角度对应本章小节
【08-05 选择 Q6】1000×800 保留秩 50 的存储减少比例存储量 k(m+n+1) 随秩线性增长;减少约 88.74%3.4.5
【09-02 选择 Q10】PCA 主成分数的选择依据协方差矩阵特征值 = 该方向方差;按累计贡献率达 85%/95% 取 k3.5.2、3.5.3
【09-09 选择 Q2】A ∈ R^{n×d} 的协方差矩阵维度d×d,由特征数决定;与 n×n Gram 矩阵通过非零特征值联系3.5.1(另见第 1 章 1.5.1)

延伸阅读

  • Gilbert Strang, Introduction to Linear Algebra, 第 5 版:第 6 章(特征值与特征向量)、第 7 章(SVD)——本章 3.4 节的构造顺序与 Strang 的讲法一致。
  • Gene Golub & Charles Van Loan, Matrix Computations, 第 4 版:第 2.4 节(SVD 的存在性与唯一性)、第 8 章——想看奇异值的扰动界与数值算法时读这本。
  • Lloyd N. Trefethen & David Bau, Numerical Linear Algebra:第 4~5 讲(SVD 的几何与代数)、第 31 讲(PCA)——对"单位球映成椭球"的几何解释最清楚;Eckart-Young 定理的原始论文见 Carl Eckart & Gale Young (1936), The approximation of one matrix by another of lower rank, Psychometrika,只有几页。