Math-03.线性代数-07.正定矩阵与条件数

本页讲解正定矩阵(positive definite matrix)与条件数(condition number)——理解「矩阵求逆为何不稳定」及训练/推断中的数值实践。

段末注释:矩阵 $A$ 正定(positive definite,PD)指对任意非零 $\mathbf{x}$ 有 $\mathbf{x}^\top A \mathbf{x} > 0$;半正定(positive semidefinite,PSD)允许 $\ge 0$。

系列入口00.系列规划 | 前置:04 特征值06 范数


1. 正定与半正定(D2–D3)

图 1 正定:二次型碗形

对称矩阵 $A = A^\top$:

性质 等价条件
正定(PD) 所有特征值 $\lambda_i > 0$
半正定(PSD) 所有 $\lambda_i \ge 0$
存在 $B$ 使 $A = B B^\top$
所有顺序主子式 $> 0$(Sylvester,PD)

协方差矩阵 $\Sigma$ 恒为 PSD;相关矩阵 $R$ 为 PSD 且对角为 1。严格 PD 当且仅当不存在完美线性相关的特征。


2. Cholesky 分解(D3)

图 2 Cholesky 与求逆

若 $A$ 为 PD,则存在唯一下三角 $L$(对角正):

$$
A = L L^\top
$$

用途

  • 解 $A\mathbf{x}=\mathbf{b}$ 比直接求逆快且稳
  • 多元正态采样:$\mathbf{x} = \boldsymbol{\mu} + L \mathbf{z}$,$\mathbf{z}\sim\mathcal{N}(0,I)$(Math-00/30
  • Gaussian Process、Kalman 滤波

np.linalg.cholesky 要求严格 PD; near-singular 时加 jitter:$\Sigma + \epsilon I$。


3. 条件数(D3–D6)

条件数(相对 2-范数):

$$
\kappa(A) = |A|2 |A^{-1}|2 = \frac{\sigma{\max}}{\sigma{\min}}
$$

$\kappa(A)$ 含义
$\approx 1$ 良态,求逆/求解可靠
$\gg 1$ 病态,输入小扰动 → 输出大变化
$= \infty$ 奇异(秩亏)

Hessian 条件数大 → 损失 landscape 狭长,SGD zigzag;预处理Adam归一化 缓解。


4. ML 场景(D7)

图 3 数值稳定场景

场景 正定/条件数角色
$X^\top X$(正规方程) 共线性 → 近奇异,用 Ridge
协方差 $\Sigma$ PSD;$\kappa(\Sigma)$ 大 → PCA 主成分估计不稳
Softmax + CE log-sum-exp 稳定(非 PD,但防溢出)
LayerNorm / BatchNorm 控制激活尺度,间接改善条件数
Newton 法 需 Hessian PD(或修正)
混合精度 FP16 更易数值下溢/上溢

Math-03/06 范数 梯度裁剪配合使用。


5. 局限与对策(D8)

图 4 局限与对策

问题 对策
$\Sigma$ 秩亏($n < d$) PCA 截断;伪逆
Cholesky 失败 $\Sigma + \epsilon I$,$\epsilon \sim 10^{-6}$
估计协方差噪声 Ledoit–Wolf 收缩
忽视 $\kappa$ 只调 lr 先标准化/归一化

6. NumPy 示例(D12)

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

# 构造 PD 协方差
A = np.random.randn(5, 3)
Sigma = A @ A.T + 1e-6 * np.eye(5) # PSD + jitter → PD

L = np.linalg.cholesky(Sigma)
z = np.random.randn(5, 100)
samples = L @ z # N(0, Sigma)

# 条件数
s = np.linalg.svd(Sigma, compute_uv=False)
kappa = s[0] / s[-1]
print("condition number:", kappa)

# Ridge 改善 X'X
X = np.random.randn(50, 20)
XtX = X.T @ X
print("kappa XtX:", np.linalg.cond(XtX))
XtX_ridge = XtX + 0.1 * np.eye(20)
print("kappa ridge:", np.linalg.cond(XtX_ridge))

7. 小结

PSD/PD 刻画「方差型」矩阵合法形状;条件数 刻画「求解有多难」。应用篇:10 PCA

系列导航06 范数 | 10 PCA

-------------本文结束感谢您的阅读-------------