Skip to content

1.6 特征值与特征向量 ​

上一节我们建立了正交性—投影—最小二乘—QR 分解的完整工具链,把哪些方向相互垂直这一几何问题转化为可计算的代数算法。但线性代数中还有另一类几何问题:当矩阵 A 作用于空间时,是否存在某些特殊方向,在变换前后方向保持不变? 这一问题引出特征值与特征向量——线性代数中几何意义与工程价值并重的概念。

正交投影回答了如何把向量最近地表示为已知子空间的元素这一问题,特征分解则回答了如何找到矩阵自身的固有坐标系——在这个坐标系下,变换退化为最简的纯缩放。当 A 作用于其特征向量 v 时,结果是 Av=λv:方向不变,只被缩放 λ 倍。这一缩放因子 λ 就是特征值,它揭示了矩阵在该方向上的内在强度。

本节将沿几何直觉 → 特征方程 → 迹与行列式的不变量 → 特征空间与重数 → 对角化 → 实对称矩阵的正交对角化 → 综合谱图景这条主线,把特征分解从抽象定义转化为可计算的代数工具,并铺设通往 PCA、PageRank、SVD 等高级应用的桥梁。

1.6.1 几何直觉:变换中的不变方向 ​

从正交投影到变换的不变方向 ​

在 1.5 节中,我们关心的是向量与子空间的几何关系——投影、正交、最小二乘。这些讨论中,矩阵 A 扮演的是映射工具的角色:把 x 映射为 Ax。但我们尚未追问另一个问题:矩阵 A 作为变换,是否有自己的固有几何结构?

考虑一个线性变换 A:Rn→Rn。一般情况下,A 会把向量扭曲——既旋转又伸缩,方向也会改变。但某些特殊方向上,A 的作用会异常简单:只缩放,不旋转。这些方向就是 A 的特征向量,对应的缩放因子就是特征值。

特征值与特征向量的严格定义 ​

设 A∈Rn×n 是方阵。若存在标量 λ∈C 和非零向量 v∈Cn(v≠0),使得:

Av=λv

则称 v 为 A 的特征向量(Eigenvector),λ 为对应的特征值(Eigenvalue)。

注意三个要点:

  1. v≠0:零向量被任何矩阵都映射为零,即 A0=λ0 对任意 λ 都成立,没有信息量,故必须排除。
  2. λ 可为复数:即使 A 是实矩阵,特征值也可能是复数(如旋转矩阵),故定义在 C 上更通用。
  3. v 的方向不变:Av 与 v 共线(在同一条直线上),仅长度和指向可能变化。

几何解读:缩放的四种情形 ​

把 λ 写成 λ=sign(λ)⋅|λ|,可以得到四种典型几何情形:

特征值范围几何效果说明
λ>0 且 $\lambda> 1$
λ>0 且 $\lambda< 1$
λ<0反向缩放v 翻转 180°,长度变 $
λ=0压扁为零v 落入零空间,Av=0

更一般地,当 λ 为复数 λ=reiθ 时(r=|λ|,θ=arg⁡λ),变换在复平面内表现为旋转 θ 角 + 缩放 r 倍。实矩阵的复特征值总是成共轭对出现(λ,λ¯),对应的复特征向量也共轭。

特征向量的方向不变性 ​

特征向量的方向不变,并不意味着向量本身不变。Av=λv 中 λ 可以不等于 1,所以 v 的长度和指向(当 λ<0)都会变化。所谓方向不变指的是 v 所在的直线(一维子空间 span{v})在 A 作用下保持稳定——A 把这条直线映射到自身。

更精确地说:特征向量 v 张成的一维子空间 span{v} 是 A 的不变子空间(Invariant Subspace):

A(span{v})⊆span{v}

反例:旋转矩阵没有实特征向量 ​

考虑二维旋转矩阵(旋转角 θ,且 θ≠0,π):

Rθ=(cos⁡θ−sin⁡θsin⁡θcos⁡θ)

它的特征多项式为:

det(Rθ−λI)=(cos⁡θ−λ)2+sin2⁡θ=λ2−2cos⁡θ⋅λ+1

判别式 Δ=4cos2⁡θ−4=−4sin2⁡θ<0(当 sin⁡θ≠0 时),故特征值为复数:

λ=cos⁡θ±isin⁡θ=e±iθ

几何含义:旋转矩阵把每个实向量都旋转了 θ 角,没有任何实方向能保持不变(除 θ=0 恒等变换、θ=π 翻转变换外)。但若允许复特征值,则 |eiθ|=1 表明旋转矩阵只旋转、不缩放——这与几何直觉吻合。

这一反例说明:实矩阵不一定有实特征值。若坚持只在 R 中讨论,会失去旋转这类重要变换的特征结构。这就是为什么特征值的定义要在 C 上给出。

几何直觉的代数化:从图像到方程 ​

特征向量的几何图像可以用一句话概括:沿这条直线方向,A 退化为标量乘法。把这一图像代数化,就得到方程 Av=λv。后续 1.6.2 节将看到,这一简洁方程通过 (A−λI)v=0 化为齐次线性方程组,并最终通过行列式 det(A−λI)=0 化为多项式求根问题——这就是特征方程的导出。

特征向量的几何本质

特征向量 v 的特殊性在于:沿其方向 A 退化为纯缩放。其几何判据是 Av 与 v 共线,代数表达是 Av=λv。这一方向不变 + 长度缩放的几何性质,让特征向量成为矩阵固有坐标系的最佳候选——后续 1.6.5 节的对角化就是把变换换到这个坐标系下,让矩阵变得最简。

python
import numpy as np

# 对角矩阵:最简单的特征结构
A = np.array([[2, 0],
              [0, 3]], dtype=float)

# 求特征值与特征向量
eigenvalues, eigenvectors = np.linalg.eig(A)
print(f"特征值: {eigenvalues}")        # [2., 3.]
print(f"特征向量矩阵(每列一个):\n{eigenvectors}")

# 验证 A v = λ v
for i in range(len(eigenvalues)):
    v = eigenvectors[:, i]
    lam = eigenvalues[i]
    Av = A @ v
    print(f"\n--- 第 {i+1} 个特征对 ---")
    print(f"  λ_{i+1} = {lam:.4f}")
    print(f"  v_{i+1} = {v}")
    print(f"  A v_{i+1} = {Av}")
    print(f"  λ v_{i+1} = {lam * v}")
    print(f"  A v == λ v? {np.allclose(Av, lam * v)}")

# 几何解读:A=[[2,0],[0,3]] 把 e1 拉长 2 倍、e2 拉长 3 倍
# 故 e1, e2 都是特征向量,特征值分别是 2 和 3
# 任意对角矩阵的特征向量就是标准基 e_i,特征值就是对角元
python
import numpy as np

# 反例:旋转矩阵(45°)没有实特征向量
theta = np.pi / 4  # 45°
R = np.array([[np.cos(theta), -np.sin(theta)],
              [np.sin(theta),  np.cos(theta)]])
print(f"旋转矩阵 R (45°) =\n{R}")

eigvals, eigvecs = np.linalg.eig(R)
print(f"\n特征值: {eigvals}")  # 应为 e^{±iπ/4} = (√2/2)(1±i)
print(f"模长 |λ|: {np.abs(eigvals)}")  # 应为 1, 1(纯旋转不缩放)

# 验证:任意实向量被 R 旋转后方向都变了
v = np.array([1, 0], dtype=float)
Rv = R @ v
print(f"\n向量 v = {v}")
print(f"R v = {Rv}")
print(f"v 与 Rv 共线? {np.allclose(np.cross(v, Rv), 0)}")  # False(45° 不共线)

# 唯一例外:θ=π(180°旋转),等价于 -I,所有向量都是特征向量(λ=-1)
R_pi = np.array([[np.cos(np.pi), -np.sin(np.pi)],
                 [np.sin(np.pi),  np.cos(np.pi)]])
print(f"\n180° 旋转矩阵 =\n{R_pi}")  # ≈ -I
eigvals_pi, _ = np.linalg.eig(R_pi)
print(f"特征值: {eigvals_pi}")  # 全为 -1(每个方向都是特征方向,反向缩放)

1.6.2 特征方程与特征多项式 ​

从 Av=λv 到齐次方程 ​

在 1.6.1 中我们建立了特征向量的几何直觉,现在把它转化为可计算的代数方程。从定义出发:

Av=λv

把右边移到左边,并利用 λv=(λI)v(I 是单位阵):

(A−λI)v=0

这是关于 v 的齐次线性方程组。我们要求 v≠0,即需要这个齐次方程有非零解。

非零解条件:行列式为零 ​

齐次方程 (A−λI)v=0 有非零解的充要条件是系数矩阵 A−λI 不可逆,等价于其行列式为零:

det(A−λI)=0

这就是特征方程(Characteristic Equation)。它把寻找 λ 的问题转化为求解多项式方程。

特征多项式的定义 ​

记:

pA(λ)=det(λI−A)

为 A 的特征多项式(Characteristic Polynomial)。它是关于 λ 的 n 次多项式(A 是 n×n 矩阵)。

注意 det(A−λI)=(−1)ndet(λI−A)=(−1)npA(λ),两者只差一个符号因子,故零点完全相同。习惯上用 pA(λ)=det(λI−A) 让首项系数为 +1,便于讨论。

特征值就是特征多项式的根:

pA(λ)=0⟺λ 是 A 的特征值

由代数基本定理,n 次多项式在 C 上恰有 n 个根(计入重数),故 n×n 矩阵恰有 n 个特征值(计入代数重数,可能为复数)。

2×2 矩阵的显式公式 ​

对 A=(abcd),特征多项式为:

pA(λ)=det(λ−a−b−cλ−d)=(λ−a)(λ−d)−bc=λ2−(a+d)λ+(ad−bc)

注意到 a+d=tr(A)(迹),ad−bc=det(A),故:

pA(λ)=λ2−tr(A)λ+det(A)

这是 2×2 矩阵特征多项式的简洁公式——只依赖迹和行列式!这一观察将在 1.6.3 节发展为迹与行列式是特征值的不变量。

判别式与实/复特征值 ​

对 2×2 矩阵,特征方程 λ2−tr(A)λ+det(A)=0 的判别式为:

Δ=tr(A)2−4det(A)

判别式决定特征值的实复性:

  • Δ>0:两个不同实特征值
  • Δ=0:一个实特征值(二重根)
  • Δ<0:两个共轭复特征值

回到 1.6.1 的旋转矩阵 Rθ:tr(Rθ)=2cos⁡θ,det(Rθ)=1,故 Δ=4cos2⁡θ−4=−4sin2⁡θ≤0。当 θ≠0,π 时 Δ<0,得到复特征值——这与 1.6.1 的几何分析完全吻合。

求特征值的两条路径 ​

给定矩阵 A,求特征值有两条代数路径:

  1. 直接求多项式根:先计算 pA(λ)=det(λI−A) 的系数,再用求根公式(低次)或数值方法(高次)求根。
  2. 数值迭代法:QR 算法、幂法等直接对 A 操作,无需显式构造多项式。这是工程实现(如 numpy.linalg.eig)的主流方法,因为高次多项式求根在数值上极不稳定(Wilkinson 多项式是经典反例)。

特征多项式的不变性

特征多项式 pA(λ)=det(λI−A) 只依赖矩阵 A 本身,与基的选择无关——这是相似不变量的体现(详见 1.6.3 节)。换言之,同一个线性变换在不同基下表示为不同矩阵 A、B,但它们的特征多项式相同。这一不变性让特征值成为线性变换的内在属性,与基的选择无关。

几何重数与代数重数(先点出) ​

对每个特征值 λi,可以定义两种重数:

  • 代数重数(Algebraic Multiplicity, AM):λi 作为特征多项式根的重数。
  • 几何重数(Geometric Multiplicity, GM):特征空间 Eλi=Null(A−λiI) 的维数,即线性无关特征向量的个数。

一般有 1≤GM≤AM。当 GM < AM 时,矩阵不够特征向量,无法对角化——这种缺陷矩阵是 1.6.4 节的主题。本节先点出概念,深入讨论留给 1.6.4。

python
import numpy as np

# 2x2 矩阵的特征多项式与特征值
A = np.array([[4, 2],
              [1, 3]], dtype=float)

# 方法 1:直接用 numpy.linalg.eig
eigvals, eigvecs = np.linalg.eig(A)
print(f"特征值 (eig): {eigvals}")

# 方法 2:用特征多项式 p(λ) = λ^2 - tr(A) λ + det(A)
tr_A = np.trace(A)
det_A = np.linalg.det(A)
print(f"\ntr(A) = {tr_A}, det(A) = {det_A}")
print(f"特征多项式: p(λ) = λ^2 - {tr_A}λ + {det_A}")

# 用 numpy.roots 求根
coeffs = [1, -tr_A, -det_A]  # 注意符号:p(λ) = λ^2 - tr·λ + det
# numpy.poly 给出特征多项式系数(按降幂)
# 由公式 p(λ) = λ^2 - tr(A)λ + det(A)
coeffs_correct = [1, -tr_A, det_A]
roots = np.roots(coeffs_correct)
print(f"特征多项式的根 (roots): {roots}")

# 两种方法结果应一致
print(f"\n两者一致? {np.allclose(np.sort(eigvals), np.sort(roots))}")

# 验证判别式
delta = tr_A**2 - 4 * det_A
print(f"\n判别式 Δ = {delta}")
if delta > 0:
    print("→ 两个不同实特征值")
elif delta == 0:
    print("→ 一个实特征值(二重根)")
else:
    print("→ 两个共轭复特征值")
python
import numpy as np

# 高阶例子:3x3 矩阵
A = np.array([[2, 1, 0],
              [0, 3, 1],
              [0, 0, 4]], dtype=float)  # 上三角矩阵

# 上三角矩阵的特征值 = 对角元
eigvals, eigvecs = np.linalg.eig(A)
print(f"特征值: {eigvals}")  # 应为 [2, 3, 4]
print(f"(上三角矩阵特征值 = 对角元)")

# 用 numpy.poly 计算特征多项式系数
# numpy.poly(A) 返回 det(λI - A) 的系数(降幂)
poly_coeffs = np.poly(A)
print(f"\n特征多项式系数 (降幂): {poly_coeffs}")
# 对应 p(λ) = c0 λ^3 + c1 λ^2 + c2 λ + c3

# 验证:用 numpy.roots 求根
roots = np.roots(poly_coeffs)
print(f"特征多项式根: {roots}")

# 三次多项式根的和 = -c1/c0 = trace(A)
# 三次多项式根的积 = -c3/c0 = -det(A)(符号取决于次数)
print(f"\n根之和 = {np.sum(roots):.4f}, tr(A) = {np.trace(A):.4f}")
print(f"根之积 = {np.prod(roots):.4f}, det(A) = {np.linalg.det(A):.4f}")

# 几何重数验证:λ=2 的特征空间维数
lam = 2.0
A_minus_lambda_I = A - lam * np.eye(3)
rank = np.linalg.matrix_rank(A_minus_lambda_I)
gm = 3 - rank  # GM = n - rank(A - λI)
print(f"\nλ=2 的几何重数 GM = {gm}")  # 应为 1(上三角,对角元各异)

1.6.3 迹与行列式:特征值的两个不变量 ​

两个核心恒等式 ​

在 1.6.2 中我们看到,2×2 矩阵的特征多项式 pA(λ)=λ2−tr(A)λ+det(A) 完全由迹和行列式决定。这并非偶然,背后有更一般的规律。对 n×n 矩阵 A,特征多项式可展开为:

pA(λ)=λn−(trA)λn−1+⋯+(−1)ndet(A)

其中:

  • 首项 λn:系数为 1
  • 第二项 −(trA)λn−1:系数为 −tr(A)
  • 常数项 (−1)ndet(A):系数为 (−1)ndet(A)

由 Vieta 定理(多项式根与系数的关系),特征值 λ1,λ2,…,λn(计入代数重数)满足:

tr(A)=∑i=1nλidet(A)=∏i=1nλi

这两条恒等式是线性代数的重要结论:迹是特征值之和,行列式是特征值之积。

证明:2×2 情形的直接验证 ​

对 A=(abcd),特征方程 λ2−(a+d)λ+(ad−bc)=0。设两根为 λ1,λ2,由 Vieta 定理:

λ1+λ2=a+d=tr(A)✓λ1⋅λ2=ad−bc=det(A)✓

证明:一般情形(用相似三角化) ​

对一般 n×n 矩阵 A,证明思路是把 A 化为上三角矩阵 T(Schur 定理保证任意方阵在 C 上相似于上三角矩阵,对角元为特征值)。由于相似变换不改变特征多项式(下文证明),A 与 T 有相同的特征值。对上三角矩阵 T:

  • tr(T)=∑Tii=∑λi(对角元就是特征值)
  • det(T)=∏Tii=∏λi(上三角矩阵的行列式 = 对角元乘积)

故 tr(A)=tr(T)=∑λi,det(A)=det(T)=∏λi。◼

相似矩阵具有相同的特征多项式 ​

定理:若 B=P−1AP(A 与 B 相似),则 A 与 B 有相同的特征多项式。

证明:

pB(λ)=det(λI−B)=det(λI−P−1AP)=det(P−1(λI−A)P)

利用 det(XYX−1)=det(Y):

pB(λ)=det(P−1)det(λI−A)det(P)=det(λI−A)=pA(λ)

◼

推论:相似矩阵具有相同的特征值、迹、行列式、特征多项式。换言之,这些量都是相似不变量(Similarity Invariants)。

相似变换的几何含义 ​

相似变换 B=P−1AP 表示换基:P 是从旧基到新基的过渡矩阵,B 是同一线性变换在新基下的矩阵表示。相似不变量就是线性变换本身的属性,与基的选择无关。

这给出了特征值的几何地位:特征值是线性变换的内在属性,与基的选择无关。一个线性变换在不同基下表现为不同矩阵,但特征值不变——它刻画了变换的本质强度。

迹与行列式的几何含义 ​

  • 迹 = 平均缩放因子之和:tr(A)/n=1n∑λi 是特征值的算术平均,可理解为变换在所有特征方向上的平均缩放率。
  • 行列式 = 体积缩放因子:det(A)=∏λi 是变换对 n 维体积的放大率。若 det=0 则变换把空间压扁到低维(不可逆);若 |det|>1 则体积膨胀,|det|<1 则体积收缩。

迹的另一种解读:散度 ​

在向量场 F:Rn→Rn 的雅可比矩阵 J 中,tr(J) 就是向量场的散度(Divergence):

∇⋅F=tr(J)

散度衡量流出的通量——若 tr(J)>0 则向量场在该点发散(源),tr(J)<0 则汇聚(汇)。这与迹 = 特征值之和 = 各方向平均缩放率的解读一致:正迹表示整体扩张,负迹表示整体收缩。

相似不变量的工程意义

迹与行列式作为相似不变量,是工程中基无关量的核心。在控制论中,系统的特征值决定稳定性,无论状态变量如何选取(即无论用什么基表示),特征值不变——这保证了稳定性是系统的内在属性。在机器学习中,PCA 的主成分是协方差矩阵的特征向量;即使对数据做正交变换(换基),协方差矩阵的特征值(即各主成分的方差)不变——这保证了信息含量是数据的内在属性。掌握相似不变量,就是掌握哪些量是表示的偶然、哪些量是本质的必然。

python
import numpy as np

# 验证 tr(A) = Σλ, det(A) = Πλ
np.random.seed(42)
A = np.random.randn(3, 3) * 2  # 随机 3x3 矩阵
print(f"A =\n{A}")

eigvals = np.linalg.eigvals(A)
print(f"\n特征值: {eigvals}")
print(f"特征值之和 Σλ = {np.sum(eigvals).real:.6f}")
print(f"tr(A)         = {np.trace(A):.6f}")
print(f"\n特征值之积 Πλ = {np.prod(eigvals).real:.6f}")
print(f"det(A)        = {np.linalg.det(A):.6f}")

# 验证:两者应严格相等(实部,因为可能有复特征值)
print(f"\ntr == Σλ? {np.isclose(np.trace(A), np.sum(eigvals).real)}")
print(f"det == Πλ? {np.isclose(np.linalg.det(A), np.prod(eigvals).real)}")
python
import numpy as np

# 相似矩阵 B = P⁻¹AP 具有相同特征值
np.random.seed(7)
A = np.array([[2, 1],
              [1, 3]], dtype=float)

# 随机可逆矩阵 P
P = np.random.randn(2, 2)
while abs(np.linalg.det(P)) < 0.1:  # 确保 P 可逆
    P = np.random.randn(2, 2)

B = np.linalg.inv(P) @ A @ P
print(f"A =\n{A}")
print(f"\nP =\n{P}")
print(f"\nB = P⁻¹AP =\n{B}")

# 对比 A 和 B 的特征值、迹、行列式
eigvals_A = np.linalg.eigvals(A)
eigvals_B = np.linalg.eigvals(B)
print(f"\nA 的特征值: {np.sort(eigvals_A)}")
print(f"B 的特征值: {np.sort(eigvals_B)}")
print(f"特征值相同(排序后)? {np.allclose(np.sort(eigvals_A), np.sort(eigvals_B))}")

print(f"\ntr(A) = {np.trace(A):.6f}, tr(B) = {np.trace(B):.6f}, 相等? {np.isclose(np.trace(A), np.trace(B))}")
print(f"det(A) = {np.linalg.det(A):.6f}, det(B) = {np.linalg.det(B):.6f}, 相等? {np.isclose(np.linalg.det(A), np.linalg.det(B))}")

# 几何解读:A 和 B 是同一变换在不同基下的表示
# 特征值是变换的内在属性,与基无关
python
import numpy as np

# 几何含义:行列式 = 体积缩放因子
# 单位正方体 [0,1]^2 经 A 变换后,面积变为 |det(A)| 倍
A = np.array([[2, 1],
              [1, 3]], dtype=float)
print(f"A =\n{A}")
print(f"det(A) = {np.linalg.det(A):.4f}")
print(f"→ 单位正方形面积 1 经 A 变换后变为 {abs(np.linalg.det(A)):.4f}")

# 迹 = 特征值之和 = 平均缩放率 × n
eigvals = np.linalg.eigvals(A)
print(f"\n特征值: {eigvals}")
print(f"tr(A)/n = {np.trace(A)/2:.4f} (平均缩放率)")
print(f"几何含义: 变换在两个特征方向上的平均缩放率")

# 特殊情形:奇异矩阵 det=0,至少一个特征值为 0
A_singular = np.array([[1, 2],
                       [2, 4]], dtype=float)  # 第二行 = 2×第一行
print(f"\n奇异矩阵 A =\n{A_singular}")
print(f"det(A) = {np.linalg.det(A_singular):.6f} (为零)")
print(f"特征值: {np.linalg.eigvals(A_singular)}")
print(f"→ 至少一个特征值为 0,对应特征向量被压扁为零(落入零空间)")

交互演示回顾:本节无独立组件,但 EigenDirectionFinder(1.6.2 节末)的滑块可调节矩阵元素,回看观察 B=P−1AP 与 A 特征值一致的现象——相似变换下特征方向可能旋转,但特征值不变。

1.6.4 特征空间与几何重数 ​

特征空间的定义 ​

设 λ 是 A 的特征值,特征空间(Eigenspace)Eλ 定义为:

Eλ=Null(A−λI)={v∈Rn:(A−λI)v=0}

即满足 Av=λv 的所有向量(含零向量)的集合。

特征空间是子空间 ​

Eλ 是 Rn 的子空间。验证子空间三要素:

  1. 非空:0∈Eλ(因为 (A−λI)0=0)。
  2. 加法封闭:若 u,v∈Eλ,则 (A−λI)(u+v)=(A−λI)u+(A−λI)v=0+0=0,故 u+v∈Eλ。
  3. 数乘封闭:若 v∈Eλ,c∈R,则 (A−λI)(cv)=c(A−λI)v=c0=0,故 cv∈Eλ。

故 Eλ 是子空间。Eλ 就是 A−λI 的零空间,这一定义让我们能直接调用 1.4 节的零空间工具分析特征结构。

特征空间的维数 = 几何重数 ​

特征空间 Eλ 的维数称为 λ 的几何重数(Geometric Multiplicity, GM):

GM(λ)=dim⁡Eλ=dim⁡Null(A−λI)=n−rank(A−λI)

几何重数 = 线性无关的特征向量个数。它回答了对同一特征值 λ,有多少个独立方向被 A 同等地缩放。

代数重数的定义 ​

λ 作为特征多项式 pA(λ)=0 的根的重数,称为代数重数(Algebraic Multiplicity, AM)。

例如,若 pA(λ)=(λ−2)3(λ−5),则 λ=2 的代数重数为 3,λ=5 的代数重数为 1。

关键不等式:1≤GM≤AM ​

定理:对任意特征值 λ,有:

1≤GM(λ)≤AM(λ)

GM≥1:因为 λ 是特征值,至少存在一个非零特征向量,故特征空间维数 ≥1。

GM≤AM:证明思路是把 A 限制在 Eλ 上,特征多项式必然包含 (λ−λ0)GM 这个因子,故根的重数至少为 GM。完整证明需要用到不变子空间和 Schur 补,此处略。

缺陷矩阵:GM < AM ​

当 GM(λ)<AM(λ) 时,称 A 在 λ 处缺陷(Defective)。缺陷矩阵(Defective Matrix)就是存在某个特征值使其 GM < AM 的矩阵,等价于不可对角化。

缺陷矩阵的代数重数承诺了 k 个特征值(重根),但几何上只能找到 <k 个线性无关的特征向量——特征向量不够用,无法拼成完整的特征基。

经典反例:Jordan 块 ​

考虑 2×2 Jordan 块:

J=(2102)

特征多项式:pJ(λ)=(λ−2)2,故 λ=2 是二重根,AM=2。

特征空间:

J−2I=(0100),rank(J−2I)=1

故 GM=2−1=1。

GM=1<AM=2:J 是缺陷矩阵!它只有一个线性无关的特征向量 e1=(1,0)T,无法对角化。

几何图像:剪切变换的挤压 ​

Jordan 块 J=(2102) 可分解为 J=2I+N,其中 N=(0100) 是幂零矩阵(N2=0)。几何上,J 是放大 2 倍 + x 方向剪切——剪切让 e2 方向倾斜地被拉到 e1 方向,破坏了 e2 作为特征向量的资格。只剩 e1 这一方向逃过剪切,成为唯一的特征方向。

缺陷矩阵的补救:Jordan 标准形 ​

缺陷矩阵虽然不能对角化为 D=diag(λ1,…,λn),但可以化为Jordan 标准形 J=diag(J1,…,Jk),其中每个 Ji 是 Jordan 块:

Ji=(λi1λi⋱⋱1λi)

Jordan 形是接近对角化的简化形式,每个 Jordan 块的大小恰好等于该特征值的 AM - GM + 1。这是不可对角化矩阵的合适替代。

缺陷矩阵在工程中的麻烦

缺陷矩阵在实际工程中带来三大麻烦:(1) 不能对角化,无法用 Ak=PDkP−1 简化幂次计算,必须用 Jordan 形或递推,计算复杂度显著上升;(2) 矩阵指数 eA 求解复杂,对角化情形下 eA=PeDP−1 极简,但 Jordan 形下每个 Jordan 块要单独处理,会出现 teλt 等高阶项,对应微分方程组的共振解——这在控制系统中表现为临界阻尼或共振现象;(3) 数值不稳定,缺陷矩阵在数据扰动下容易分裂为可对角化矩阵(重特征值分裂为相近特征值),导致特征值数值计算对误差极度敏感。在机器学习中,缺陷矩阵罕见但理论上重要——理解它有助于正确处理协方差矩阵奇异、Hessian 矩阵退化等情形。

python
import numpy as np

# Jordan 块:缺陷矩阵的经典反例
J = np.array([[2, 1],
              [0, 2]], dtype=float)
print(f"Jordan 块 J =\n{J}")

# 特征值
eigvals, eigvecs = np.linalg.eig(J)
print(f"\n特征值: {eigvals}")  # [2, 2](二重根)

# AM = 2(特征多项式 (λ-2)^2 的根重数)
# GM = n - rank(J - 2I) = 2 - 1 = 1
J_minus_2I = J - 2 * np.eye(2)
print(f"\nJ - 2I =\n{J_minus_2I}")
print(f"rank(J - 2I) = {np.linalg.matrix_rank(J_minus_2I)}")
print(f"GM = 2 - rank = {2 - np.linalg.matrix_rank(J_minus_2I)}")
print(f"AM = 2 (因为 (λ-2)^2)")
print(f"→ GM=1 < AM=2,J 是缺陷矩阵!")

# numpy 给出的"特征向量"
print(f"\nnumpy 给出的特征向量矩阵:\n{eigvecs}")
print(f"det(特征向量矩阵) = {np.linalg.det(eigvecs):.6f}")
# 注意:特征向量矩阵接近奇异(虽然 numpy 仍给出两个向量,但它们几乎共线)

# 真正的特征向量只有 e1 = (1, 0)^T
v = np.array([1, 0])
print(f"\n验证 e1 是特征向量: J @ e1 = {J @ v}, 2 * e1 = {2 * v}, 相等? {np.allclose(J @ v, 2 * v)}")
# 尝试 e2 = (0, 1)^T
v2 = np.array([0, 1])
print(f"e2 是特征向量? J @ e2 = {J @ v2}, 2 * e2 = {2 * v2}, 相等? {np.allclose(J @ v2, 2 * v2)}")
# False!e2 不是特征向量(被剪切拉到了 (1, 2))
python
import numpy as np

# 对比:非缺陷矩阵(可对角化)
# 同样 λ=2 二重根,但 GM=2
A = np.array([[2, 0],
              [0, 2]], dtype=float)  # = 2I,所有向量都是特征向量
print(f"A = 2I =\n{A}")
eigvals, eigvecs = np.linalg.eig(A)
print(f"特征值: {eigvals}")
print(f"rank(A - 2I) = {np.linalg.matrix_rank(A - 2 * np.eye(2))}")  # 0
print(f"GM = 2 - 0 = 2 = AM")  # GM = AM = 2
print(f"→ A 不是缺陷矩阵,可对角化(事实上 A 已经是对角矩阵)")

# 另一个对比:对角矩阵 diag(2, 2) 就是 Jordan 块 [[2,1],[0,2]] 的"极限"
# 当剪切量 1 → 0 时,缺陷矩阵退化为可对角化矩阵
# 这说明缺陷性是"非-generic"的——随机矩阵几乎都是可对角化的
np.random.seed(0)
for trial in range(3):
    M = np.random.randn(3, 3)
    eigs = np.linalg.eigvals(M)
    print(f"\n随机矩阵 {trial+1} 的特征值: {eigs}")
    print(f"  特征值两两不同? {len(set(np.round(eigs, 6))) == 3}")
    # 随机矩阵几乎必然有相异特征值 → GM=AM=1 → 可对角化

1.6.5 对角化 A=PDP−1 ​

可对角化的充要条件 ​

矩阵 A∈Rn×n 称为可对角化(Diagonalizable),若存在可逆矩阵 P 和对角矩阵 D 使得:

A=PDP−1等价地P−1AP=D

充要条件:A 有 n 个线性无关的特征向量。等价表述:

∑i=1kGM(λi)=n

即所有特征值的几何重数之和等于 n(每个特征值贡献 GM 个独立特征向量)。

充分条件(不必要):A 有 n 个互异特征值。互异特征值对应的特征向量自动线性无关,故 A 可对角化。

对角化的构造 ​

若 A 可对角化,设其特征向量为 v1,v2,…,vn(线性无关),对应特征值为 λ1,λ2,…,λn。构造:

  • P=[v1,v2,…,vn]:以特征向量为列的矩阵(可逆)
  • D=diag(λ1,λ2,…,λn):以特征值为对角元的对角矩阵

则:

AP=A[v1,…,vn]=[Av1,…,Avn]=[λ1v1,…,λnvn]=PD

故 A=PDP−1。

对角化的几何含义 ​

相似变换 P−1AP=D 表示换到特征基坐标系下,变换变成纯缩放:

  1. P−1x:把 x 从标准基变换到特征基 {v1,…,vn} 下,得到特征基坐标。
  2. D(P−1x):在特征基下,变换退化为对各分量独立缩放(第 i 分量乘 λi)。
  3. P(DP−1x):把缩放后的特征基坐标变换回标准基。

即 Ax=PDP−1x 的几何含义是:换到特征基 → 各方向独立缩放 → 换回标准基。在特征基下,A 的旋转 + 剪切 + 缩放复合操作退化为最简的各方向独立缩放。

工程价值 1:矩阵幂次的简化 ​

对角化让矩阵幂次计算极大地简化:

Ak=(PDP−1)k=(PDP−1)(PDP−1)⋯(PDP−1)⏟k 个=PDkP−1

中间的 P−1P=I 两两消去。而对角矩阵的幂次就是各对角元的幂次:

Dk=diag(λ1k,λ2k,…,λnk)

故:

Ak=Pdiag(λ1k,…,λnk)P−1

计算复杂度从 O(n3k)(k 次矩阵乘法)降为 O(n3)(一次矩阵乘法 + 对角元幂次)。

工程价值 2:矩阵指数 eA ​

矩阵指数定义为 eA=∑k=0∞Akk!。若 A 可对角化:

eA=P(∑k=0∞Dkk!)P−1=Pdiag(eλ1,…,eλn)P−1=PeDP−1

其中 eD=diag(eλ1,…,eλn) 极易计算。

矩阵指数是线性常微分方程组 x˙=Ax 的解的核心:解为 x(t)=eAtx(0)。对角化把求解 ODE 转化为求特征值 + 算指数,这是动力系统分析的代数基础。λi 的实部决定解的稳定性(负实部 → 衰减,正实部 → 发散),虚部决定振荡频率。

工程价值 3:谱分解 ​

可对角化矩阵可写为:

A=PDP−1=∑i=1nλiviwiT

其中 wiT 是 P−1 的第 i 行(左特征向量)。每个 λiviwiT 是秩 1 矩阵,称为谱投影。这一分解揭示了 A 是特征方向上的纯缩放之加权和。

不可对角化的处理:Jordan 标准形 ​

若 A 不可对角化(缺陷),最接近对角化的形式是 Jordan 标准形 J:

A=PJP−1

其中 J 是块对角矩阵,每个 Jordan 块形如 (λ1λ⋱⋱1λ)。

Jordan 形下幂次和指数计算复杂但仍有公式(涉及 tkeλt 项),是处理不可对角化情形的标准工具。本节简略,详见常微分方程教材。

对角化的本质

对角化的本质是找到变换的固有坐标系,让变换在最简表示下显形。在标准基下,A 可能表现为复杂的旋转 + 剪切 + 缩放复合;但在特征基下,同一变换退化为各方向独立缩放——这种复杂 → 简单的翻译能力,是对角化的真正价值。它把难以理解的整体行为分解为若干个一维独立行为的叠加,这是线性代数中分解思想的重要体现。后续 1.6.6 节将看到,当 A 是实对称矩阵时,特征基甚至可以选为标准正交的——这是对角化的理想情形。

python
import numpy as np

# 可对角化矩阵:A 有 2 个互异特征值
A = np.array([[4, 2],
              [1, 3]], dtype=float)
print(f"A =\n{A}")

# 求特征值与特征向量
eigvals, P = np.linalg.eig(A)
print(f"\n特征值: {eigvals}")
print(f"特征向量矩阵 P =\n{P}")

# 构造 D
D = np.diag(eigvals)
print(f"\n对角矩阵 D =\n{D}")

# 验证 A = P D P⁻¹
P_inv = np.linalg.inv(P)
A_reconstructed = P @ D @ P_inv
print(f"\nP D P⁻¹ =\n{A_reconstructed}")
print(f"A == P D P⁻¹? {np.allclose(A, A_reconstructed)}")

# 也验证 P⁻¹ A P = D
print(f"\nP⁻¹ A P =\n{P_inv @ A @ P}")
print(f"等于 D? {np.allclose(P_inv @ A @ P, D)}")
python
import numpy as np

# 工程价值 1:A^k = P D^k P⁻¹
A = np.array([[4, 2],
              [1, 3]], dtype=float)
eigvals, P = np.linalg.eig(A)
P_inv = np.linalg.inv(P)

k = 5
# 方法 1:直接连乘
A_power_direct = np.linalg.matrix_power(A, k)
print(f"A^{k} (直接计算) =\n{A_power_direct}")

# 方法 2:用对角化 A^k = P D^k P⁻¹
D_k = np.diag(eigvals**k)
A_power_diag = P @ D_k @ P_inv
print(f"\nA^{k} (对角化) =\n{A_power_diag.real}")  # 实部(消除数值误差)

print(f"\n两者一致? {np.allclose(A_power_direct, A_power_diag)}")

# 复杂度对比
# 直接:k 次矩阵乘法,每次 O(n^3),总计 O(k n^3)
# 对角化:1 次矩阵乘法(P @ D^k @ P⁻¹),O(n^3)
# 当 k 很大时,对角化优势明显
python
import numpy as np
from scipy.linalg import expm

# 工程价值 2:矩阵指数 e^A = P e^D P⁻¹
A = np.array([[0, 1],
              [-2, -3]], dtype=float)  # 经典阻尼振荡系统
print(f"A =\n{A}")

# 方法 1:scipy 直接计算
e_A_direct = expm(A)
print(f"\ne^A (scipy) =\n{e_A_direct}")

# 方法 2:用对角化 e^A = P e^D P⁻¹
eigvals, P = np.linalg.eig(A)
print(f"\n特征值: {eigvals}")  # 复特征值,对应振荡
e_D = np.diag(np.exp(eigvals))
e_A_diag = P @ e_D @ np.linalg.inv(P)
print(f"\ne^A (对角化) =\n{e_A_diag.real}")

print(f"\n两者一致? {np.allclose(e_A_direct, e_A_diag.real)}")

# 解 ODE: dx/dt = A x, x(0) = [1, 0]
# 解为 x(t) = e^(At) x(0)
t = 1.0
x0 = np.array([1, 0])
e_At = expm(A * t)
x_t = e_At @ x0
print(f"\nt={t} 时的状态 x(t) = {x_t}")
print(f"几何含义: 系统从 [1,0] 出发,t=1 时到达 {x_t}")

1.6.6 实对称矩阵的正交对角化 A=QΛQT ​

实对称矩阵的良好性质 ​

实对称矩阵 A(满足 AT=A)是线性代数中性质良好的矩阵类型。它具有三大重要性质,使其在工程中起核心作用:

  1. 所有特征值为实数
  2. 不同特征值对应的特征向量正交
  3. 必可正交对角化(每个特征值的 GM = AM 恒成立)

这三条性质让实对称矩阵永远可以化为 A=QΛQT,其中 Q 是正交矩阵、Λ 是实对角矩阵。这就是谱定理(Spectral Theorem),是线性代数的重要结论之一。

性质 1:实对称矩阵的特征值为实数 ​

证明:设 Av=λv(v≠0,v 可能为复向量)。取共轭转置:

v¯TA=λ¯v¯T

(利用 A 实对称:A¯=A, AT=A)。

右乘 v:v¯TAv=λ¯v¯Tv。

左乘 v¯T 在原方程 Av=λv 上:v¯TAv=λv¯Tv。

两式相减:(λ−λ¯)v¯Tv=0。由 v¯Tv=∑|vi|2>0,故 λ=λ¯,即 λ 为实数。◼

性质 2:不同特征值对应的特征向量正交 ​

证明:设 Av1=λ1v1,Av2=λ2v2,λ1≠λ2。由 A 对称:

λ1(v1Tv2)=(λ1v1)Tv2=(Av1)Tv2=v1TATv2=v1TAv2=v1T(λ2v2)=λ2(v1Tv2)

故 (λ1−λ2)v1Tv2=0,由 λ1≠λ2 得 v1Tv2=0,即 v1⊥v2。◼

性质 3:必可正交对角化 ​

实对称矩阵的每个特征值都满足 GM = AM——不会出现 1.6.4 节那种缺陷情形。这一性质的证明需要更深的工具(如 Schur 分解),此处略。其后果是:实对称矩阵永远可对角化,且特征基可选为标准正交基。

谱定理(Spectral Theorem) ​

定理(实对称矩阵的谱定理):设 A∈Rn×n 是实对称矩阵。则存在正交矩阵 Q(QTQ=I)和实对角矩阵 Λ,使得:

A=QΛQT

其中:

  • Q 的列 q1,…,qn 是 A 的标准正交特征向量
  • Λ=diag(λ1,…,λn),对角元是 A 的实特征值

证明思路 ​

谱定理的证明思路分三步:

  1. 存在性(实特征值):由性质 1,所有特征值为实数。
  2. 正交性:由性质 2,不同特征值的特征向量正交。同一特征空间内(GM > 1 时),用 Gram-Schmidt 正交化(1.5.5 节)可得该特征空间的标准正交基。
  3. 完备性:所有特征空间的标准正交基合并起来共 n 个向量(因为 GM = AM,特征空间维数之和 = n),构成 Rn 的一组标准正交基。把这 n 个向量作为列排成 Q,对应特征值为对角元排成 Λ,即得 A=QΛQT。

谱分解形式 ​

由 A=QΛQT=∑i=1nλiqiqiT,每个 qiqiT 是秩 1 的正交投影矩阵(投影到 qi 方向)。故实对称矩阵可分解为:

A=∑i=1nλiPi,Pi=qiqiT

这一形式称为谱分解(Spectral Decomposition):A 是若干特征方向投影 × 特征值的叠加。Pi 满足 Pi2=Pi(幂等)、PiPj=0(i≠j)、∑Pi=I——这构成一组正交投影的完备分解。

二次型与主轴定理 ​

实对称矩阵与二次型(Quadratic Form)紧密相关。二次型是形如:

Q(x)=xTAx=∑i,jAijxixj

的标量函数(A 实对称)。代入谱分解 A=QΛQT,令 y=QTx:

Q(x)=xTQΛQTx=yTΛy=∑i=1nλiyi2

主轴定理(Principal Axis Theorem):实对称矩阵的二次型可通过正交变换 y=QTx 化为纯平方和 ∑λiyi2,每个 λi 是一个主轴方向的曲率。

几何含义:二次曲面 Q(x)=c(如椭圆、双曲面)的主轴就是 A 的特征向量方向,半轴长度由 λi 决定(∝1/|λi|)。这一结果是解析几何中二次曲线化标准型的线性代数本质。

正定性与特征值 ​

实对称矩阵 A 的正定性可由特征值完全判定:

  • 正定(A≻0):所有 λi>0
  • 半正定(A⪰0):所有 λi≥0
  • 负定(A≺0):所有 λi<0
  • 不定:既有正特征值也有负特征值

这一判定在机器学习中是核心:Hessian 矩阵正定 ⟺ 极小值点;协方差矩阵半正定(特征值 = 方差 ≥ 0);核矩阵必须半正定才能定义有效核函数。

应用预告 ​

实对称矩阵的正交对角化是诸多高级方法的代数核心:

  1. PCA(主成分分析):数据协方差矩阵是实对称矩阵,其特征向量是主成分方向,特征值是各方向方差。正交性保证主成分不冗余。
  2. 惯性张量:刚体的惯性张量是实对称矩阵,其特征向量是惯量主轴,特征值是主转动惯量。绕主轴旋转最稳定。
  3. 图谱论:图的邻接矩阵、拉普拉斯矩阵都是实对称矩阵,其特征值(图谱)刻画图的结构性质(连通性、聚类结构)。
  4. 量子力学:可观测量对应实对称(更准确说是厄米)算子,其特征值是物理量的可能测量值(实数性保证物理可观测)。

实对称矩阵的良好性质

实对称矩阵集齐了对角化的三大有利条件:实数特征值(无复数困扰)、正交特征向量(无冗余方向)、可对角化(无缺陷麻烦)。这让它成为工程中常用的矩阵类型——只要遇到实对称矩阵,几乎必然可以用谱定理 A=QΛQT 简化分析。PCA、SVD、谱聚类、量子力学等领域的简洁,根源都在于实对称矩阵的这种良好性质。1.7 节的 SVD 将把这一理论推广到任意矩阵——通过 ATA 和 AAT 这两个实对称矩阵间接获得正交对角化的优势。

python
import numpy as np

# 实对称矩阵的正交对角化
A = np.array([[2, 1],
              [1, 2]], dtype=float)
print(f"对称矩阵 A =\n{A}")
print(f"A 对称? {np.allclose(A, A.T)}")

# 求特征值与特征向量
eigvals, Q = np.linalg.eigh(A)  # eigh 专为对称矩阵设计,保证实数和正交
print(f"\n特征值 Λ = {eigvals}")
print(f"特征向量矩阵 Q =\n{Q}")

# 验证 1: A = Q Λ Q^T
Lambda = np.diag(eigvals)
A_reconstructed = Q @ Lambda @ Q.T
print(f"\nQ Λ Q^T =\n{A_reconstructed}")
print(f"A == Q Λ Q^T? {np.allclose(A, A_reconstructed)}")

# 验证 2: Q^T Q = I(Q 是正交矩阵)
print(f"\nQ^T Q =\n{Q.T @ Q}")
print(f"Q^T Q == I? {np.allclose(Q.T @ Q, np.eye(2))}")

# 验证 3: 特征向量正交(不同特征值对应)
print(f"\n特征向量 q1 = {Q[:, 0]}")
print(f"特征向量 q2 = {Q[:, 1]}")
print(f"q1 · q2 = {np.dot(Q[:, 0], Q[:, 1]):.6f}  (应≈0)")

# 验证 4: 特征值为实数
print(f"\n特征值是否实数? {np.all(np.isreal(eigvals))}")
print(f"特征值: λ1={eigvals[0]:.4f}, λ2={eigvals[1]:.4f}")
print(f"几何含义: 沿 q1 方向缩放 {eigvals[0]:.2f} 倍, 沿 q2 方向缩放 {eigvals[1]:.2f} 倍")
python
import numpy as np

# 二次型与主轴定理
# 二次型 Q(x) = x^T A x
A = np.array([[2, 1],
              [1, 2]], dtype=float)
print(f"A =\n{A}")

# 谱分解:A = Q Λ Q^T
eigvals, Q = np.linalg.eigh(A)
print(f"特征值: {eigvals}")  # [1, 3]
print(f"特征向量矩阵 Q =\n{Q}")

# 二次型 Q(x) = x^T A x
# 在原坐标下:2x1² + 2x1x2 + 2x2²
# 在主轴坐标 y = Q^T x 下:λ1 y1² + λ2 y2² = y1² + 3 y2²

# 验证:取 x = [1, 1]
x = np.array([1, 1])
Q_form = x @ A @ x
y = Q.T @ x  # 主轴坐标
Q_form_transformed = eigvals[0] * y[0]**2 + eigvals[1] * y[1]**2
print(f"\nx = {x}")
print(f"x^T A x = {Q_form}")
print(f"主轴坐标 y = Q^T x = {y}")
print(f"λ1 y1² + λ2 y2² = {Q_form_transformed}")
print(f"两者一致? {np.isclose(Q_form, Q_form_transformed)}")

# 等高线可视化(描述性)
# Q(x) = c 的等高线是椭圆
# 椭圆的长短轴方向 = 特征向量方向
# 椭圆的长短轴长度 ∝ 1/√|λi|
print(f"\n椭圆等高线 x^T A x = 1 的主轴:")
print(f"  长轴方向: q1 = {Q[:, 0]} (对应小特征值 {eigvals[0]:.2f})")
print(f"  长轴长度: 1/√λ1 = {1/np.sqrt(eigvals[0]):.4f}")
print(f"  短轴方向: q2 = {Q[:, 1]} (对应大特征值 {eigvals[1]:.2f})")
print(f"  短轴长度: 1/√λ2 = {1/np.sqrt(eigvals[1]):.4f}")
python
import numpy as np

# 正定性判定:用特征值
np.random.seed(42)

# 正定矩阵:所有特征值 > 0
A_pd = np.array([[2, 1],
                 [1, 2]], dtype=float)
eigvals_pd = np.linalg.eigvalsh(A_pd)
print(f"正定矩阵 A =\n{A_pd}")
print(f"  特征值: {eigvals_pd} (全正)")
print(f"  正定? {np.all(eigvals_pd > 0)}")

# 半正定矩阵:所有特征值 ≥ 0
A_psd = np.array([[1, 1],
                  [1, 1]], dtype=float)  # 秩 1,行列式 0
eigvals_psd = np.linalg.eigvalsh(A_psd)
print(f"\n半正定矩阵 A =\n{A_psd}")
print(f"  特征值: {eigvals_psd} (有零)")
print(f"  半正定? {np.all(eigvals_psd >= 0)}")

# 不定矩阵:有正有负
A_ind = np.array([[1, 2],
                  [2, 1]], dtype=float)
eigvals_ind = np.linalg.eigvalsh(A_ind)
print(f"\n不定矩阵 A =\n{A_ind}")
print(f"  特征值: {eigvals_ind} (一正一负)")
print(f"  不定? {np.any(eigvals_ind > 0) and np.any(eigvals_ind < 0)}")

# 协方差矩阵总是半正定
np.random.seed(0)
X = np.random.randn(100, 3)
C = np.cov(X, rowvar=False)  # 3x3 协方差矩阵
eigvals_cov = np.linalg.eigvalsh(C)
print(f"\n协方差矩阵特征值: {eigvals_cov}")
print(f"  半正定? {np.all(eigvals_cov >= 0)}  (方差非负)")
print(f"  → PCA 中这些特征值就是各主成分的方差")

1.6.7 综合几何图景:特征分解的全景 ​

谱半径的定义 ​

矩阵 A 的谱半径(Spectral Radius)定义为其特征值模长的最大值:

ρ(A)=maxi=1,…,n|λi|

谱半径是矩阵最大缩放强度的度量——它告诉我们 A 在某个方向上能放大多少倍。

矩阵幂次 Ak 的渐近行为 ​

由对角化 Ak=PDkP−1=Pdiag(λ1k,…,λnk)P−1,Ak 的行为由特征值的模长决定:

情形 1:ρ(A)<1(所有 |λi|<1)

Ak→0(k→∞)

矩阵幂次渐近稳定(衰减为零)。对应动力系统 xk+1=Axk 的解 xk=Akx0→0,系统渐近稳定。

情形 2:ρ(A)>1(存在 |λi|>1)

∥Ak∥→∞(k→∞)

矩阵幂次发散。对应动力系统不稳定,状态量无限增长。

情形 3:ρ(A)=1(最大模长为 1,且无 |λ|>1)

这是临界情形:

  • 若 λ=1 是主特征值(且无其他模长 1 的特征值):Ak 收敛到秩 1 极限(马尔可夫链的平稳分布)。
  • 若存在 |λ|=1 但 λ≠1(如复特征值 eiθ):Ak 不收敛但保持有界(振荡、旋转)。
  • 若存在 Jordan 块且 |λ|=1:可能多项式增长(共振)。

复特征值:旋转 + 缩放 ​

实矩阵的复特征值必成共轭对 λ,λ¯ 出现。把 λ 写成极坐标:

λ=reiθ,r=|λ|,θ=arg⁡λ

则 λ 对应的二维不变子空间上,A 的作用等价于旋转 θ 角 + 缩放 r 倍。这与 1.6.1 中旋转矩阵的特征值 e±iθ(r=1,纯旋转)的几何图像一致。

复特征值的几何意义:当 A 有复特征值时,A 在某个二维平面内旋转 + 缩放——这一平面是 A 的二维不变子空间,但不属于任何单个实特征方向。这是矩阵扭曲行为的最简表示。

收敛速率:第二大特征值 ​

在迭代算法中,Ak 的收敛速率由第二大特征值(次主特征值)决定。

考虑马尔可夫链 xk+1=Axk,转移矩阵 A 的最大特征值为 1(对应平稳分布)。设第二特征值为 λ2,则:

∥xk−x∞∥∼|λ2|k

收敛速率为 |λ2|:|λ2| 越小,收敛越快;|λ2| 越接近 1,收敛越慢。

PageRank 的阻尼因子 0.85 就是这种 λ2,决定了 PageRank 迭代的收敛速度。

工程应用:PageRank 简化版 ​

PageRank 的核心思想:网页 i 的排名 ∝ 转移矩阵 M 的最大特征值 1 对应的特征向量。简化模型:

  1. 构造转移矩阵 M:Mij = 从网页 j 跳到网页 i 的概率(按出链均匀分配)。
  2. 加入随机跳转避免死胡同:G=(1−d)1n11T+dM,d≈0.85。
  3. G 是列随机矩阵(每列和为 1),最大特征值为 1。
  4. 求对应特征向量(PageRank 向量),各分量为网页排名。

特征分解的四大视角 ​

回顾 1.6 章全章,特征分解可从四个互补视角理解:

1. 代数视角:Av=λv,特征值是 det(A−λI)=0 的根。

2. 几何视角:特征向量是变换中方向不变只缩放的特殊方向,特征值是缩放因子。

3. 谱视角:A=∑λiviwiT,把矩阵拆成特征基投影 + 缩放 + 反投影的叠加。

4. 动力视角:Ak 的长期行为由特征值模长决定——ρ<1 稳定、ρ>1 发散、ρ=1 临界;收敛速率由次主特征值决定。

这四个视角共同构成特征分解的全景图:从纯代数(求根)到几何(不变方向)到谱(投影分解)到动力(长期行为),每个视角揭示特征值的一个侧面。

与 1.5 节的呼应 ​

1.5 节用正交性回答如何最近地表示向量(投影、最小二乘),1.6 节用特征结构回答变换的固有方向是什么。两者的交汇点是实对称矩阵:它的特征向量不仅正交(1.5 节主题),还构成变换的特征基(1.6 节主题)。这种正交性 + 特征结构的双重性质,让 PCA、SVD 等方法成为可能——它们将在 1.7 节正式登场。

特征分解:连接线性代数与动力系统、机器学习的桥梁

特征分解连接了线性代数与众多应用领域。对动力系统,特征值的实部符号决定稳定性,模长决定收敛/发散速率;对机器学习,Hessian 矩阵的特征值决定优化曲率,协方差矩阵的特征值决定数据方差分布;对图论,拉普拉斯矩阵的特征值揭示图聚类结构;对量子力学,可观测量算子的特征值是物理量的可能测量值。掌握特征分解,就是掌握了用矩阵理解变换本质的核心工具——这一工具将在 1.7 节的 SVD 中得到进一步推广。

python
import numpy as np

# A^k 的渐近行为:三种典型情形
def matrix_power_behavior(A, k_max=20):
    """观察 A^k 的范数随 k 的变化"""
    norms = []
    A_k = np.eye(A.shape[0])
    for k in range(k_max + 1):
        norms.append(np.linalg.norm(A_k))
        A_k = A_k @ A
    return norms

# 情形 1: ρ < 1(渐近稳定)
A_stable = np.array([[0.5, 0.1],
                     [0.0, 0.3]])
rho_stable = max(abs(np.linalg.eigvals(A_stable)))
print(f"情形 1(稳定): A =\n{A_stable}")
print(f"  特征值: {np.linalg.eigvals(A_stable)}")
print(f"  谱半径 ρ = {rho_stable:.4f}")
print(f"  ||A^k|| 演化: {matrix_power_behavior(A_stable, 5)}")

# 情形 2: ρ > 1(发散)
A_unstable = np.array([[1.2, 0.1],
                       [0.0, 1.1]])
rho_unstable = max(abs(np.linalg.eigvals(A_unstable)))
print(f"\n情形 2(发散): A =\n{A_unstable}")
print(f"  特征值: {np.linalg.eigvals(A_unstable)}")
print(f"  谱半径 ρ = {rho_unstable:.4f}")
print(f"  ||A^k|| 演化: {matrix_power_behavior(A_unstable, 5)}")

# 情形 3: ρ = 1(临界)
# 旋转矩阵:模长 1 但不收敛(持续旋转)
theta = np.pi / 6  # 30°
A_critical = np.array([[np.cos(theta), -np.sin(theta)],
                       [np.sin(theta),  np.cos(theta)]])
rho_critical = max(abs(np.linalg.eigvals(A_critical)))
print(f"\n情形 3(临界 - 旋转): A =\n{A_critical}")
print(f"  特征值: {np.linalg.eigvals(A_critical)}  (复特征值)")
print(f"  谱半径 ρ = {rho_critical:.4f}")
print(f"  ||A^k|| 演化: {matrix_power_behavior(A_critical, 5)}")
print(f"  → 范数恒为 1(不收敛也不发散,持续旋转)")
python
import numpy as np

# PageRank 简化版
# 5 个网页的链接图(A → B 表示 A 链向 B)
# 链接关系(列 j 表示从网页 j 出链到哪些网页):
# 网页 1 → 2, 3
# 网页 2 → 3, 4
# 网页 3 → 4
# 网页 4 → 5
# 网页 5 → 1, 2

n = 5
# 构造转移矩阵 M(M_ij = 从 j 跳到 i 的概率)
# 每列和为 1(按出链均匀分配)
M = np.array([
    [0,   0,   0,   0,   0.5],  # 到网页 1
    [0.5, 0,   0,   0,   0.5],  # 到网页 2
    [0.5, 0.5, 0,   0,   0  ],  # 到网页 3
    [0,   0.5, 1.0, 0,   0  ],  # 到网页 4
    [0,   0,   0,   1.0, 0  ],  # 到网页 5
])
print(f"转移矩阵 M =\n{M}")
print(f"每列和: {M.sum(axis=0)}  (应全为 1)")

# 加入阻尼因子 d=0.85
d = 0.85
G = (1 - d) / n * np.ones((n, n)) + d * M
print(f"\nGoogle 矩阵 G =\n{G}")
print(f"G 的列和: {G.sum(axis=0)}  (应全为 1)")

# 验证最大特征值为 1
eigvals, eigvecs = np.linalg.eig(G)
print(f"\n特征值: {eigvals}")
print(f"最大模长特征值: {max(abs(eigvals)):.6f}  (应为 1)")

# 找 λ=1 对应的特征向量(PageRank 向量)
idx = np.argmin(abs(eigvals - 1.0))
pagerank = eigvecs[:, idx].real
pagerank = pagerank / pagerank.sum()  # 归一化为概率分布
print(f"\nPageRank 向量: {pagerank}")
print(f"排名(从高到低):")
order = np.argsort(-pagerank)
for rank, i in enumerate(order, 1):
    print(f"  第 {rank} 名: 网页 {i+1}, PageRank = {pagerank[i]:.4f}")

# 第二大特征值(决定收敛速率)
sorted_eigvals = sorted(eigvals, key=lambda x: -abs(x))
lambda2 = sorted_eigvals[1]
print(f"\n第二大特征值 λ2 = {lambda2.real:.4f}")
print(f"|λ2| = {abs(lambda2):.4f}  → 决定迭代收敛速度")
print(f"几何含义: |λ2| 越小,PageRank 迭代收敛越快")
python
import numpy as np

# 谱半径与矩阵范数的关系
# 谱半径 ρ(A) ≤ 任何矩阵范数 ||A||
# 特别地: ρ(A) ≤ ||A||_2 = 最大奇异值

np.random.seed(42)
A = np.random.randn(4, 4)
eigvals = np.linalg.eigvals(A)
rho = max(abs(eigvals))
norm_2 = np.linalg.norm(A, ord=2)  # 谱范数 = 最大奇异值
norm_F = np.linalg.norm(A, 'fro')

print(f"A =\n{A}")
print(f"\n特征值: {eigvals}")
print(f"谱半径 ρ(A) = {rho:.6f}")
print(f"2-范数 ||A||_2 = {norm_2:.6f} (最大奇异值)")
print(f"F-范数 ||A||_F = {norm_F:.6f}")
print(f"\nρ(A) ≤ ||A||_2? {rho <= norm_2 + 1e-10}")
print(f"ρ(A) ≤ ||A||_F? {rho <= norm_F + 1e-10}")

# 迭代法收敛的充要条件: ρ(A) < 1
# 这是线性迭代系统 x_{k+1} = A x_k 渐近稳定的充要条件
print(f"\n谱半径 < 1? {rho < 1}")
print(f"→ 线性迭代 x_{{k+1}} = A x_k 是否渐近稳定? {'是' if rho < 1 else '否'}")

# 数值实验:观察 ||A^k|| 与 ρ^k 的渐近关系
print(f"\n||A^k|| / ρ^k 的渐近行为:")
A_k = np.eye(4)
for k in range(1, 11):
    A_k = A_k @ A
    ratio = np.linalg.norm(A_k, ord=2) / (rho ** k)
    print(f"  k={k}: ||A^k||={np.linalg.norm(A_k, ord=2):.4f}, ρ^k={rho**k:.4f}, 比值={ratio:.4f}")
# 比值应渐近趋于常数(Gelfand 公式: lim ||A^k||^(1/k) = ρ)

本章小结 ​

本节完成了从特征向量的几何直觉到特征分解的全景图景的完整旅程,把变换中的不变方向转化为可计算的代数工具,并铺设了通往 SVD 的最后一块基石:

  1. 几何直觉是起点:Av=λv 揭示了变换中方向不变只缩放的特殊方向。λ>0 同向缩放,λ<0 反向,|λ|>1 放大,|λ|<1 缩小;复特征值 λ=reiθ 对应旋转 θ + 缩放 r。

  2. 特征方程是工具:det(A−λI)=0 把**找 λ**转化为多项式求根。2×2 矩阵有显式公式 λ2−tr(A)λ+det(A)=0,判别式决定实复性。

  3. 迹与行列式是不变量:tr(A)=∑λi、det(A)=∏λi,相似矩阵共享特征值——特征值是线性变换的内在属性,与基的选择无关。

  4. 特征空间刻画重数:Eλ=Null(A−λI) 是子空间,GM≤AM。GM<AM 时矩阵缺陷、不可对角化,需用 Jordan 标准形。

  5. 对角化是核心操作:A=PDP−1 把变换换到特征基下退化为纯缩放。Ak=PDkP−1 简化幂次,eA=PeDP−1 简化矩阵指数,是动力系统求解的核心。

  6. 实对称矩阵性质良好:谱定理 A=QΛQT 保证实对称矩阵永远有实特征值、正交特征向量、可对角化。二次型主轴定理、正定性判定、PCA、惯性张量、图谱论皆根植于此。

  7. 谱图景连接动力系统:谱半径 ρ(A) 决定 Ak 的渐近行为(ρ<1 稳定、ρ>1 发散、ρ=1 临界),次主特征值决定收敛速率。PageRank、马尔可夫链、动力系统稳定性皆由特征值刻画。

下一节将进入 SVD(奇异值分解)——把特征分解从方阵推广到任意矩阵,从对称矩阵推广到一般矩阵。SVD 将综合 1.5 节的正交性与 1.6 节的特征结构,给出 A=UΣVT 这一线性代数的综合结论——任意矩阵都能分解为正交旋转 + 对角缩放 + 正交旋转三步组合,成为数据科学(PCA、推荐系统、图像压缩)的重要工具。

练习题 ​

第 1 题 概念推导 ​

设 A 是实对称矩阵,λ1,λ2 是 A 的两个不同特征值(λ1≠λ2),v1,v2 是对应的特征向量。证明 v1⊥v2,并说明这一结论为何是谱定理(实对称矩阵可正交对角化)的关键前提。

参考答案

由特征向量定义 Av1=λ1v1,Av2=λ2v2。考虑 v1TAv2 这一标量,用两种方式计算:

方式一:先用 A 作用于 v2:v1T(Av2)=v1T(λ2v2)=λ2(v1Tv2)。

方式二:利用 A 对称(AT=A),改写为 (Av1)Tv2=(λ1v1)Tv2=λ1(v1Tv2)。

两种方式计算同一标量,故 λ2(v1Tv2)=λ1(v1Tv2),即 (λ2−λ1)(v1Tv2)=0。由 λ1≠λ2 推出 v1Tv2=0,即 v1⊥v2。

这一结论是谱定理的关键前提:不同特征值对应的特征向量天然正交,同一特征空间内可用 Gram-Schmidt 正交化,合并后即得 n 个标准正交特征向量,构成 Q 的列,使 A=QΛQT 成立。没有这条正交性,对角化只能用一般可逆矩阵 P(A=PΛP−1),无法保证 P 正交,数值稳定性与几何意义都大打折扣。

第 2 题 代码验证 ​

利用本节的 <SymmetricEigenDemo> 交互组件,输入实对称矩阵 A=[2112]。记录特征值 λ1,λ2 与特征向量 q1,q2,验证三条性质:特征值为实数;q1⊥q2;A=QΛQT 重构无误。

参考答案

特征方程 det(A−λI)=(2−λ)2−1=λ2−4λ+3=(λ−1)(λ−3)=0,特征值 λ1=1,λ2=3,均为实数。

求特征向量:λ1=1 时 (A−I)v=[1111]v=0,得 v1=12(1,−1)T。λ2=3 时 (A−3I)v=[−111−1]v=0,得 v2=12(1,1)T。

验证三条性质:特征值 1,3 均为实数;q1⋅q2=12(1⋅1+(−1)⋅1)=0,正交;Q=12[11−11],Λ=[1003],QΛQT=12[11−11][1003][1−111]=[2112]=A,重构无误。几何上,A 沿 q1 方向缩放 1 倍(不变),沿 q2 方向缩放 3 倍。

第 3 题 概念推导 ​

设 A=[210020003]。求 A 的特征值与对应的特征空间,判断 A 是否可对角化,并说明几何重数与代数重数的关系。

参考答案

A 是上三角矩阵,特征值即对角元 λ1=2(代数重数 AM = 2),λ2=3(AM = 1)。

λ1=2 的特征空间:解 (A−2I)v=0,即 [010000001][v1v2v3]=0。得 v2=0,v3=0,v1 自由。特征空间 E2=span{(1,0,0)T},几何重数 GM = 1。

λ2=3 的特征空间:解 (A−3I)v=0,即 [−1100−10000]v=0。得 v1=0,v2=0,v3 自由。特征空间 E3=span{(0,0,1)T},GM = 1。

可对角化判定:可对角化要求所有特征值满足 GM = AM。这里 λ1=2 的 GM = 1 < AM = 2,故 A 不可对角化,是缺陷矩阵。三个特征向量无法拼出 R3 的一组基(只有两个独立方向),对角化所需的 P 不存在。这类矩阵需用 Jordan 标准形 A=PJP−1 描述,其中 J 含有 2×2 Jordan 块 [2102]。这一例子说明并非所有方阵都可对角化,GM < AM 是判断缺陷的直接判据。

常见错误 ​

错误 1 · 把特征值与奇异值混为一谈

原因:特征值 λ 满足 Av=λv,奇异值 σ 满足 A=UΣVT 中 Σ 的对角元。两者都反映矩阵的缩放强度,初学时容易混用。关键区别:特征值仅对方阵定义,可为负、可为复数;奇异值对任意 m×n 矩阵定义,恒为非负实数。实对称矩阵的奇异值等于特征值的绝对值 |λi|,一般矩阵则无此简单关系。

解决:明确特征值刻画方阵的固有方向缩放,奇异值刻画任意矩阵的主方向放大倍数。记忆规则:特征值可负可复(保留方向与旋转信息),奇异值非负(只关心放大倍数)。涉及方阵对角化用特征值,涉及一般矩阵的范数、条件数、低秩逼近用奇异值。

错误 2 · 把特征向量的方向不变理解为向量本身不变

原因:Av=λv 中 λ 可以不等于 1,特征向量的长度(甚至指向,当 λ<0)都会变化。初学时容易把方向不变误读为向量不变,忽视 λ 的缩放作用。更精确的表述是:特征向量张成的一维子空间 span{v} 在 A 作用下保持稳定,A 把这条直线映射到自身。

解决:区分向量不变(λ=1,恒等变换的特例)与方向不变(一维不变子空间,λ 任意)。判定特征向量时检查 Av 与 v 是否共线(在同一直线上),而非是否相等。λ<0 时 Av 与 v 反向但仍共线,仍是特征向量。

错误 3 · 误认为所有方阵都可对角化

原因:教材常以实对称矩阵、可对角化矩阵为例,给人方阵都能对角化的错觉。存在缺陷矩阵(GM < AM),如 [2102],特征向量不足,无法拼出完整基,对角化 A=PDP−1 不存在。

解决:对角化前先检查每个特征值的 GM 与 AM。GM = AM 对所有特征值成立才可对角化;任一特征值 GM < AM 则为缺陷矩阵,需用 Jordan 标准形替代。实对称矩阵天然满足 GM = AM(谱定理保证),故总可对角化,这是实对称矩阵的良好性质。

错误 4 · 认为实矩阵的特征值必为实数

原因:实矩阵的元素都是实数,初学时容易推断特征值也为实数。特征方程 det(A−λI)=0 是实系数多项式,实系数多项式可能有复根。旋转矩阵 [cos⁡θ−sin⁡θsin⁡θcos⁡θ](θ≠0,π)的特征值为 e±iθ,是纯虚数方向的复数。

解决:明确实矩阵的特征值可能为复数,复特征值成共轭对出现。仅当矩阵是实对称矩阵(更一般地,正规矩阵)时,特征值才保证为实数。遇到实矩阵的复特征值时,对应二维不变子空间上的变换是旋转 + 缩放,几何意义清晰,无需强行在实数域内讨论。