1.6 特征值与特征向量
上一节我们建立了正交性—投影—最小二乘—QR 分解的完整工具链,把哪些方向相互垂直这一几何问题转化为可计算的代数算法。但线性代数中还有另一类几何问题:当矩阵
正交投影回答了如何把向量最近地表示为已知子空间的元素这一问题,特征分解则回答了如何找到矩阵自身的固有坐标系——在这个坐标系下,变换退化为最简的纯缩放。当
本节将沿几何直觉 → 特征方程 → 迹与行列式的不变量 → 特征空间与重数 → 对角化 → 实对称矩阵的正交对角化 → 综合谱图景这条主线,把特征分解从抽象定义转化为可计算的代数工具,并铺设通往 PCA、PageRank、SVD 等高级应用的桥梁。
1.6.1 几何直觉:变换中的不变方向
从正交投影到变换的不变方向
在 1.5 节中,我们关心的是向量与子空间的几何关系——投影、正交、最小二乘。这些讨论中,矩阵
考虑一个线性变换
特征值与特征向量的严格定义
设
则称
注意三个要点:
:零向量被任何矩阵都映射为零,即 对任意 都成立,没有信息量,故必须排除。 可为复数:即使 是实矩阵,特征值也可能是复数(如旋转矩阵),故定义在 上更通用。 的方向不变: 与 共线(在同一条直线上),仅长度和指向可能变化。
几何解读:缩放的四种情形
把
| 特征值范围 | 几何效果 | 说明 |
|---|---|---|
| \lambda | > 1$ | |
| \lambda | < 1$ | |
| 反向缩放 | ||
| 压扁为零 |
更一般地,当
特征向量的方向不变性
特征向量的方向不变,并不意味着向量本身不变。
更精确地说:特征向量
反例:旋转矩阵没有实特征向量
考虑二维旋转矩阵(旋转角
它的特征多项式为:
判别式
几何含义:旋转矩阵把每个实向量都旋转了
这一反例说明:实矩阵不一定有实特征值。若坚持只在
几何直觉的代数化:从图像到方程
特征向量的几何图像可以用一句话概括:沿这条直线方向,
特征向量的几何本质
特征向量
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,特征值就是对角元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 特征方程与特征多项式
从 到齐次方程
在 1.6.1 中我们建立了特征向量的几何直觉,现在把它转化为可计算的代数方程。从定义出发:
把右边移到左边,并利用
这是关于
非零解条件:行列式为零
齐次方程
这就是特征方程(Characteristic Equation)。它把寻找
特征多项式的定义
记:
为
注意
特征值就是特征多项式的根:
由代数基本定理,
2×2 矩阵的显式公式
对
注意到
这是 2×2 矩阵特征多项式的简洁公式——只依赖迹和行列式!这一观察将在 1.6.3 节发展为迹与行列式是特征值的不变量。
判别式与实/复特征值
对 2×2 矩阵,特征方程
判别式决定特征值的实复性:
:两个不同实特征值 :一个实特征值(二重根) :两个共轭复特征值
回到 1.6.1 的旋转矩阵
求特征值的两条路径
给定矩阵
- 直接求多项式根:先计算
的系数,再用求根公式(低次)或数值方法(高次)求根。 - 数值迭代法:QR 算法、幂法等直接对
操作,无需显式构造多项式。这是工程实现(如 numpy.linalg.eig)的主流方法,因为高次多项式求根在数值上极不稳定(Wilkinson 多项式是经典反例)。
特征多项式的不变性
特征多项式
几何重数与代数重数(先点出)
对每个特征值
- 代数重数(Algebraic Multiplicity, AM):
作为特征多项式根的重数。 - 几何重数(Geometric Multiplicity, GM):特征空间
的维数,即线性无关特征向量的个数。
一般有
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("→ 两个共轭复特征值")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 矩阵的特征多项式
其中:
- 首项
:系数为 1 - 第二项
:系数为 - 常数项
:系数为
由 Vieta 定理(多项式根与系数的关系),特征值
这两条恒等式是线性代数的重要结论:迹是特征值之和,行列式是特征值之积。
证明:2×2 情形的直接验证
对
证明:一般情形(用相似三角化)
对一般
(对角元就是特征值) (上三角矩阵的行列式 = 对角元乘积)
故
相似矩阵具有相同的特征多项式
定理:若
证明:
利用
推论:相似矩阵具有相同的特征值、迹、行列式、特征多项式。换言之,这些量都是相似不变量(Similarity Invariants)。
相似变换的几何含义
相似变换
这给出了特征值的几何地位:特征值是线性变换的内在属性,与基的选择无关。一个线性变换在不同基下表现为不同矩阵,但特征值不变——它刻画了变换的本质强度。
迹与行列式的几何含义
- 迹 = 平均缩放因子之和:
是特征值的算术平均,可理解为变换在所有特征方向上的平均缩放率。 - 行列式 = 体积缩放因子:
是变换对 维体积的放大率。若 则变换把空间压扁到低维(不可逆);若 则体积膨胀, 则体积收缩。
迹的另一种解读:散度
在向量场
散度衡量流出的通量——若
相似不变量的工程意义
迹与行列式作为相似不变量,是工程中基无关量的核心。在控制论中,系统的特征值决定稳定性,无论状态变量如何选取(即无论用什么基表示),特征值不变——这保证了稳定性是系统的内在属性。在机器学习中,PCA 的主成分是协方差矩阵的特征向量;即使对数据做正交变换(换基),协方差矩阵的特征值(即各主成分的方差)不变——这保证了信息含量是数据的内在属性。掌握相似不变量,就是掌握哪些量是表示的偶然、哪些量是本质的必然。
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)}")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 是同一变换在不同基下的表示
# 特征值是变换的内在属性,与基无关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 节末)的滑块可调节矩阵元素,回看观察与 特征值一致的现象——相似变换下特征方向可能旋转,但特征值不变。
1.6.4 特征空间与几何重数
特征空间的定义
设
即满足
特征空间是子空间
- 非空:
(因为 )。 - 加法封闭:若
,则 ,故 。 - 数乘封闭:若
, ,则 ,故 。
故
特征空间的维数 = 几何重数
特征空间
几何重数 = 线性无关的特征向量个数。它回答了对同一特征值
代数重数的定义
例如,若
关键不等式:
定理:对任意特征值
缺陷矩阵:GM < AM
当
缺陷矩阵的代数重数承诺了
经典反例:Jordan 块
考虑 2×2 Jordan 块:
特征多项式:
特征空间:
故
几何图像:剪切变换的挤压
Jordan 块
缺陷矩阵的补救:Jordan 标准形
缺陷矩阵虽然不能对角化为
Jordan 形是接近对角化的简化形式,每个 Jordan 块的大小恰好等于该特征值的 AM - GM + 1。这是不可对角化矩阵的合适替代。
缺陷矩阵在工程中的麻烦
缺陷矩阵在实际工程中带来三大麻烦:(1) 不能对角化,无法用
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))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 对角化
可对角化的充要条件
矩阵
充要条件:
即所有特征值的几何重数之和等于
充分条件(不必要):
对角化的构造
若
:以特征向量为列的矩阵(可逆) :以特征值为对角元的对角矩阵
则:
故
对角化的几何含义
相似变换
:把 从标准基变换到特征基 下,得到特征基坐标。 :在特征基下,变换退化为对各分量独立缩放(第 分量乘 )。 :把缩放后的特征基坐标变换回标准基。
即
工程价值 1:矩阵幂次的简化
对角化让矩阵幂次计算极大地简化:
中间的
故:
计算复杂度从
工程价值 2:矩阵指数
矩阵指数定义为
其中
矩阵指数是线性常微分方程组
工程价值 3:谱分解
可对角化矩阵可写为:
其中
不可对角化的处理:Jordan 标准形
若
其中
Jordan 形下幂次和指数计算复杂但仍有公式(涉及
对角化的本质
对角化的本质是找到变换的固有坐标系,让变换在最简表示下显形。在标准基下,
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)}")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 很大时,对角化优势明显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 实对称矩阵的正交对角化
实对称矩阵的良好性质
实对称矩阵
- 所有特征值为实数
- 不同特征值对应的特征向量正交
- 必可正交对角化(每个特征值的 GM = AM 恒成立)
这三条性质让实对称矩阵永远可以化为
性质 1:实对称矩阵的特征值为实数
证明:设
(利用
右乘
左乘
两式相减:
性质 2:不同特征值对应的特征向量正交
证明:设
故
性质 3:必可正交对角化
实对称矩阵的每个特征值都满足 GM = AM——不会出现 1.6.4 节那种缺陷情形。这一性质的证明需要更深的工具(如 Schur 分解),此处略。其后果是:实对称矩阵永远可对角化,且特征基可选为标准正交基。
谱定理(Spectral Theorem)
定理(实对称矩阵的谱定理):设
其中:
的列 是 的标准正交特征向量 ,对角元是 的实特征值
证明思路
谱定理的证明思路分三步:
- 存在性(实特征值):由性质 1,所有特征值为实数。
- 正交性:由性质 2,不同特征值的特征向量正交。同一特征空间内(GM > 1 时),用 Gram-Schmidt 正交化(1.5.5 节)可得该特征空间的标准正交基。
- 完备性:所有特征空间的标准正交基合并起来共
个向量(因为 GM = AM,特征空间维数之和 = ),构成 的一组标准正交基。把这 个向量作为列排成 ,对应特征值为对角元排成 ,即得 。
谱分解形式
由
这一形式称为谱分解(Spectral Decomposition):
二次型与主轴定理
实对称矩阵与二次型(Quadratic Form)紧密相关。二次型是形如:
的标量函数(
主轴定理(Principal Axis Theorem):实对称矩阵的二次型可通过正交变换
几何含义:二次曲面
正定性与特征值
实对称矩阵
- 正定(
):所有 - 半正定(
):所有 - 负定(
):所有 - 不定:既有正特征值也有负特征值
这一判定在机器学习中是核心:Hessian 矩阵正定 ⟺ 极小值点;协方差矩阵半正定(特征值 = 方差 ≥ 0);核矩阵必须半正定才能定义有效核函数。
应用预告
实对称矩阵的正交对角化是诸多高级方法的代数核心:
- PCA(主成分分析):数据协方差矩阵是实对称矩阵,其特征向量是主成分方向,特征值是各方向方差。正交性保证主成分不冗余。
- 惯性张量:刚体的惯性张量是实对称矩阵,其特征向量是惯量主轴,特征值是主转动惯量。绕主轴旋转最稳定。
- 图谱论:图的邻接矩阵、拉普拉斯矩阵都是实对称矩阵,其特征值(图谱)刻画图的结构性质(连通性、聚类结构)。
- 量子力学:可观测量对应实对称(更准确说是厄米)算子,其特征值是物理量的可能测量值(实数性保证物理可观测)。
实对称矩阵的良好性质
实对称矩阵集齐了对角化的三大有利条件:实数特征值(无复数困扰)、正交特征向量(无冗余方向)、可对角化(无缺陷麻烦)。这让它成为工程中常用的矩阵类型——只要遇到实对称矩阵,几乎必然可以用谱定理
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} 倍")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}")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 综合几何图景:特征分解的全景
谱半径的定义
矩阵
谱半径是矩阵最大缩放强度的度量——它告诉我们
矩阵幂次 的渐近行为
由对角化
情形 1:
矩阵幂次渐近稳定(衰减为零)。对应动力系统
情形 2:
矩阵幂次发散。对应动力系统不稳定,状态量无限增长。
情形 3:
这是临界情形:
- 若
是主特征值(且无其他模长 1 的特征值): 收敛到秩 1 极限(马尔可夫链的平稳分布)。 - 若存在
但 (如复特征值 ): 不收敛但保持有界(振荡、旋转)。 - 若存在 Jordan 块且
:可能多项式增长(共振)。
复特征值:旋转 + 缩放
实矩阵的复特征值必成共轭对
则
复特征值的几何意义:当
收敛速率:第二大特征值
在迭代算法中,
考虑马尔可夫链
收敛速率为
PageRank 的阻尼因子
工程应用:PageRank 简化版
PageRank 的核心思想:网页
- 构造转移矩阵
: = 从网页 跳到网页 的概率(按出链均匀分配)。 - 加入随机跳转避免死胡同:
, 。 是列随机矩阵(每列和为 1),最大特征值为 1。 - 求对应特征向量(PageRank 向量),各分量为网页排名。
特征分解的四大视角
回顾 1.6 章全章,特征分解可从四个互补视角理解:
1. 代数视角:
2. 几何视角:特征向量是变换中方向不变只缩放的特殊方向,特征值是缩放因子。
3. 谱视角:
4. 动力视角:
这四个视角共同构成特征分解的全景图:从纯代数(求根)到几何(不变方向)到谱(投影分解)到动力(长期行为),每个视角揭示特征值的一个侧面。
与 1.5 节的呼应
1.5 节用正交性回答如何最近地表示向量(投影、最小二乘),1.6 节用特征结构回答变换的固有方向是什么。两者的交汇点是实对称矩阵:它的特征向量不仅正交(1.5 节主题),还构成变换的特征基(1.6 节主题)。这种正交性 + 特征结构的双重性质,让 PCA、SVD 等方法成为可能——它们将在 1.7 节正式登场。
特征分解:连接线性代数与动力系统、机器学习的桥梁
特征分解连接了线性代数与众多应用领域。对动力系统,特征值的实部符号决定稳定性,模长决定收敛/发散速率;对机器学习,Hessian 矩阵的特征值决定优化曲率,协方差矩阵的特征值决定数据方差分布;对图论,拉普拉斯矩阵的特征值揭示图聚类结构;对量子力学,可观测量算子的特征值是物理量的可能测量值。掌握特征分解,就是掌握了用矩阵理解变换本质的核心工具——这一工具将在 1.7 节的 SVD 中得到进一步推广。
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(不收敛也不发散,持续旋转)")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 迭代收敛越快")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 的最后一块基石:
几何直觉是起点:
揭示了变换中方向不变只缩放的特殊方向。 同向缩放, 反向, 放大, 缩小;复特征值 对应旋转 + 缩放 。 特征方程是工具:
把**找 **转化为多项式求根。2×2 矩阵有显式公式 ,判别式决定实复性。 迹与行列式是不变量:
、 ,相似矩阵共享特征值——特征值是线性变换的内在属性,与基的选择无关。 特征空间刻画重数:
是子空间, 。 时矩阵缺陷、不可对角化,需用 Jordan 标准形。 对角化是核心操作:
把变换换到特征基下退化为纯缩放。 简化幂次, 简化矩阵指数,是动力系统求解的核心。 实对称矩阵性质良好:谱定理
保证实对称矩阵永远有实特征值、正交特征向量、可对角化。二次型主轴定理、正定性判定、PCA、惯性张量、图谱论皆根植于此。 谱图景连接动力系统:谱半径
决定 的渐近行为( 稳定、 发散、 临界),次主特征值决定收敛速率。PageRank、马尔可夫链、动力系统稳定性皆由特征值刻画。
下一节将进入 SVD(奇异值分解)——把特征分解从方阵推广到任意矩阵,从对称矩阵推广到一般矩阵。SVD 将综合 1.5 节的正交性与 1.6 节的特征结构,给出
练习题
第 1 题 概念推导
设
参考答案
由特征向量定义
方式一:先用
方式二:利用
两种方式计算同一标量,故
这一结论是谱定理的关键前提:不同特征值对应的特征向量天然正交,同一特征空间内可用 Gram-Schmidt 正交化,合并后即得
第 2 题 代码验证
利用本节的 <SymmetricEigenDemo> 交互组件,输入实对称矩阵
参考答案
特征方程
求特征向量:
验证三条性质:特征值
第 3 题 概念推导
设
参考答案
可对角化判定:可对角化要求所有特征值满足 GM = AM。这里
常见错误
错误 1 · 把特征值与奇异值混为一谈
原因:特征值
解决:明确特征值刻画方阵的固有方向缩放,奇异值刻画任意矩阵的主方向放大倍数。记忆规则:特征值可负可复(保留方向与旋转信息),奇异值非负(只关心放大倍数)。涉及方阵对角化用特征值,涉及一般矩阵的范数、条件数、低秩逼近用奇异值。
错误 2 · 把特征向量的方向不变理解为向量本身不变
原因:
解决:区分向量不变(
错误 3 · 误认为所有方阵都可对角化
原因:教材常以实对称矩阵、可对角化矩阵为例,给人方阵都能对角化的错觉。存在缺陷矩阵(GM < AM),如
解决:对角化前先检查每个特征值的 GM 与 AM。GM = AM 对所有特征值成立才可对角化;任一特征值 GM < AM 则为缺陷矩阵,需用 Jordan 标准形替代。实对称矩阵天然满足 GM = AM(谱定理保证),故总可对角化,这是实对称矩阵的良好性质。
错误 4 · 认为实矩阵的特征值必为实数
原因:实矩阵的元素都是实数,初学时容易推断特征值也为实数。特征方程
解决:明确实矩阵的特征值可能为复数,复特征值成共轭对出现。仅当矩阵是实对称矩阵(更一般地,正规矩阵)时,特征值才保证为实数。遇到实矩阵的复特征值时,对应二维不变子空间上的变换是旋转 + 缩放,几何意义清晰,无需强行在实数域内讨论。