首页 / 模块 1 · 线性代数与微积分 / 第 4 课(共 10 课)

特征值与特征向量

从零到前沿 ML 自学课程 · 阶段0:数学与工具基础 · 能力点:谱视角——PCA、协方差,以及梯度消失/爆炸的根因

读完这一课,你将能够

  • 用一句话说清 \(Av=\lambda v\) 的几何含义——指出特征向量是变换里"只被缩放、方向不变"的那条直线,\(\lambda\) 是缩放倍数。
  • 对任意 2×2 矩阵,用 \(\operatorname{tr}/\det\) 写出特征方程、求出特征值与特征向量,并用 \(Av=\lambda v\) 验算。
  • 解释 \(A=PDP^{-1}\) 的"换基—缩放—换回"三步画面,并据此说明 \(A^n=PD^nP^{-1}\) 的命运由 \(\lambda_i^n\) 决定。
  • 复述谱定理三条结论(实特征值、正交特征向量、\(A=Q\Lambda Q^\top\)),并把 \(x^\top Ax\) 的符号对应到特征值符号去判极小/极大/鞍点。
  • 用幂迭代与谱半径,说清"主成分=协方差特征向量"以及 RNN/深层网络梯度消失与爆炸的根。

上一课我们用内积刻画了"长度、角度、投影"——把向量放进度量的框架里。这一课我们换个视角:不再问"两个向量之间的关系",而是问"一个矩阵 \(A\) 作为一种变换,它对空间做了什么"。答案藏在几个特殊方向里——它们是这场变换的不动方向

而且这一个方程 \(Av=\lambda v\),后面会一口气解释清楚一串看似无关的前沿现象:PCA 为什么能降维、深度网络为什么会梯度爆炸 / 消失、GAN 的谱归一化到底在归一化什么——它们其实是同一件事的不同侧面。学完这一课,你就拿到了打开这一串概念的同一把钥匙。

1. 一个矩阵就是一种变换

把矩阵 \(A\) 乘到向量 \(v\) 上,得到新向量 \(Av\)。一般来说 \(Av\) 既改变了 \(v\) 的长度,又改变了它的方向——它被"扭"到别处去了。但对某些特殊的方向,事情格外简单:变换只把向量拉长或压短,方向纹丝不动(或恰好反向)。

核心画面。想象 \(A\) 把整个平面"揉"了一下:大多数箭头会转向,但有那么一两根方向上的箭头,揉完之后还躺在原来那条直线上,只是变长或变短了。这些方向就是变换的"骨架"。理解一个变换,就是找出它的骨架。

用式子说:若存在非零向量 \(v\) 和标量 \(\lambda\),使得

\[ Av = \lambda v, \]

则称 \(v\) 是 \(A\) 的一个特征向量 eigenvector,\(\lambda\) 是对应的特征值 eigenvalue。等号左边是"做变换",右边是"纯缩放 \(\lambda\) 倍"。特征向量正是那些"被变换 = 被缩放"的方向;\(\lambda\) 就是缩放倍数。

特征向量在变换 A 下方向不变,仅被缩放变换前变换后(A 作用)v₁v₂λ₁v₁λ₂v₂特征方向 v₁:λ₁≈2 >1(拉长)特征方向 v₂:0<λ₂<1(压短)普通向量:方向被旋转/扭转虚线=两特征方向所在直线(不变)
图1:变换前后的对比。左图画出单位圆上的若干向量(箭头)及两根特征方向 v1、v2;右图是被 A 作用后的结果——大多数箭头都旋转/扭转到了新方向,唯独沿 v1、v2 的箭头仍躺在原来的直线上,只是分别被拉长 λ1 倍、缩短/缩放 λ2 倍。用醒目颜色标注两根不动方向,并标注 λ1>1(拉长)、0<λ2<1(压短),直观传达'特征向量=方向不变、只被缩放'。

易错

特征向量必须非零(\(v=0\) 永远满足 \(A\cdot 0=\lambda\cdot 0\),毫无信息)。而特征值 \(\lambda=0\) 是允许的——它对应被压扁的方向。两件事别混。还有:若 \(v\) 是特征向量,那么 \(2v、-v、cv\)(任意 \(c\neq0\))都是同一个特征值的特征向量——特征向量描述的是方向(一条直线),不是某根特定长度的箭头。所以习惯上我们把它归一化到单位长度再报告。

2. 怎么找它们:特征方程 det(A−λI)=0

把定义改写成 \(Av-\lambda v=0\),即

\[ (A-\lambda I)\,v = 0. \]

这是一个齐次线性方程组。我们要的是非零解 \(v\)。线性代数告诉我们:方阵 \(M\) 有非零解 \(Mv=0\) 当且仅当 \(M\) 不可逆,也就是行列式为零。于是特征值必满足

\[ \boxed{\det(A-\lambda I)=0.} \]

这叫特征方程 characteristic equation,左边展开是关于 \(\lambda\) 的多项式(特征多项式)。对 \(n\times n\) 矩阵它是 \(n\) 次多项式,所以(在复数范围内、计重数)恰有 \(n\) 个特征值。

2×2 手算流程

设 \(A=\begin{bmatrix} a & b \\ c & d \end{bmatrix}\)。则

\[ A-\lambda I=\begin{bmatrix} a-\lambda & b \\ c & d-\lambda \end{bmatrix},\qquad \det(A-\lambda I)=(a-\lambda)(d-\lambda)-bc. \]

展开得到一个二次方程:

\[ \lambda^2-(a+d)\,\lambda+(ad-bc)=0. \]

注意 \(\lambda^1\) 项带着负号 \(-(a+d)\),常数项是 \(ad-bc\)。由韦达定理(二次方程根与系数的关系),两根之和与两根之积分别是:

\[ \lambda_1+\lambda_2=a+d=\operatorname{tr}(A),\qquad \lambda_1\lambda_2=ad-bc=\det(A). \]

这里冒出两个值得记住的量:\(a+d\) 是矩阵的迹 trace \(\operatorname{tr}(A)\)(主对角线之和),\(ad-bc\) 是行列式 determinant \(\det(A)\)。于是对 2×2 我们得到两条干净结论:两根之和 = 迹,两根之积 = 行列式。这两条既能快速求解,又能事后验算。求出 \(\lambda\) 后,把每个 \(\lambda\) 代回 \((A-\lambda I)v=0\) 解出方向 \(v\)(两行一定成比例,取一行即可)。

例题:手算 2×2 的特征值与特征向量并验证

取 \(A=\begin{bmatrix} 4 & 1 \\ 2 & 3 \end{bmatrix}\)。

第 1 步,写特征多项式。\(\operatorname{tr}(A)=4+3=7\),\(\det(A)=4\cdot3-1\cdot2=10\)。所以

\[ \lambda^2-7\lambda+10=0\;\Longrightarrow\;(\lambda-5)(\lambda-2)=0. \]

得 \(\lambda_1=5,\ \lambda_2=2\)。验算:\(5+2=7=\operatorname{tr}\),\(5\cdot2=10=\det\),吻合。

第 2 步,求 \(\lambda_1=5\) 的特征向量。解 \((A-5I)v=0\):

\[ A-5I=\begin{bmatrix} -1 & 1 \\ 2 & -2 \end{bmatrix},\quad -v_1+v_2=0\;\Rightarrow\;v_2=v_1. \]

取 \(v^{(1)}=\begin{bmatrix}1\\1\end{bmatrix}\)。

第 3 步,求 \(\lambda_2=2\) 的特征向量。解 \((A-2I)v=0\):

\[ A-2I=\begin{bmatrix} 2 & 1 \\ 2 & 1 \end{bmatrix},\quad 2v_1+v_2=0\;\Rightarrow\;v_2=-2v_1. \]

取 \(v^{(2)}=\begin{bmatrix}1\\-2\end{bmatrix}\)。

第 4 步,验证 \(Av=\lambda v\)。

\[ A\begin{bmatrix}1\\1\end{bmatrix}=\begin{bmatrix}4+1\\2+3\end{bmatrix}=\begin{bmatrix}5\\5\end{bmatrix}=5\begin{bmatrix}1\\1\end{bmatrix},\qquad A\begin{bmatrix}1\\-2\end{bmatrix}=\begin{bmatrix}4-2\\2-6\end{bmatrix}=\begin{bmatrix}2\\-4\end{bmatrix}=2\begin{bmatrix}1\\-2\end{bmatrix}. \]

两个都对。

3. 特征空间、几何重数与代数重数

对固定的 \(\lambda\),所有满足 \((A-\lambda I)v=0\) 的向量(含 \(0\))构成一个子空间,叫 \(\lambda\) 的特征空间 eigenspace。它就是 \(A-\lambda I\) 的零空间,里面装着该特征值的全部特征向量加上原点。

恒有 \(1\le\text{几何重数}\le\text{代数重数}\)。当某个特征值"几何 < 代数"时(特征向量不够用),矩阵就不可对角化(即下一节要讲的那件事——"换到特征基、让变换变成纯缩放"——做不成,因为凑不齐足够多的独立特征方向当坐标轴),称为亏损 defective(例如 \(\begin{bmatrix}1&1\\0&1\end{bmatrix}\):\(\lambda=1\) 代数重数 2,但只有一根特征向量方向)。好消息是:本课后面将看到,对称矩阵永远不亏损——而 ML 里我们关心的矩阵(协方差、海森、核矩阵)大多是对称的。

4. 对角化:换到特征基,变换变成纯缩放

假设 \(n\times n\) 矩阵 \(A\) 有 \(n\) 根线性无关的特征向量 \(v^{(1)},\dots,v^{(n)}\)(对应 \(\lambda_1,\dots,\lambda_n\))。把它们当列拼成矩阵 \(P=[\,v^{(1)}\ \cdots\ v^{(n)}\,]\),把特征值放进对角阵 \(D=\operatorname{diag}(\lambda_1,\dots,\lambda_n)\)。逐列看 \(Av^{(i)}=\lambda_i v^{(i)}\) 就是

\[ AP=PD\;\Longrightarrow\;\boxed{A=PDP^{-1}.} \]

这叫对角化 diagonalization,或特征分解 eigendecomposition。它的几何含义非常美:

三步走的画面。\(A=PDP^{-1}\) 把"复杂的变换"拆成三步——读法是从右往左:

  1. \(P^{-1}\):把向量从标准坐标换到特征基坐标(用特征向量当新的坐标轴);
  2. \(D\):在特征基下,变换退化成沿各轴的纯缩放(第 \(i\) 轴乘 \(\lambda_i\)),不再有任何旋转或剪切(剪切 shear 指把方块"推斜"成平行四边形的那种变换,像把正体字写成斜体);
  3. \(P\):换回标准坐标。

一句话:选对了坐标系,扭曲的变换就变成了简单的拉伸。这正是特征向量的威力——它们是让 \(A\) "看起来最简单"的那组坐标轴。

对角化 A=PDP⁻¹ 的换基—缩放—换回三步对角化 A = P D P⁻¹:换基 → 纯缩放 → 换回标准坐标下 A 作用A·□倾斜(剪切+缩放)特征基坐标系v₁v₂λ₁↕λ₂↔D·□只拉伸,不歪斜沿两轴纯缩放换回标准坐标A·□与直接作用 A 相同P⁻¹DP在特征基里 D = diag(λ₁, λ₂)选对坐标系,扭曲的 A 变成简单的轴向拉伸
图2:对角化 A=PDP⁻¹ 的'换基—缩放—换回'三步。把一个含剪切的方格网格,经 P⁻¹ 换到特征基坐标(坐标轴变成特征向量方向),在该坐标系里变换退化成沿两轴的纯缩放 D(方格只被横竖拉伸、不歪斜),再由 P 换回标准坐标。三联画从左到右展示原始→特征基下纯缩放→变回,传达'选对坐标系,扭曲变换变成简单拉伸'。

例题:一般(非对称)矩阵的对角化

沿用第 2 节的 \(A=\begin{bmatrix} 4 & 1 \\ 2 & 3 \end{bmatrix}\),那里已经算好 \(\lambda_1=5,\ \lambda_2=2\),\(v^{(1)}=\begin{bmatrix}1\\1\end{bmatrix}\),\(v^{(2)}=\begin{bmatrix}1\\-2\end{bmatrix}\)。注意这两根特征向量并不正交(\(v^{(1)}\cdot v^{(2)}=1\cdot1+1\cdot(-2)=-1\neq0\))——这是一般矩阵的常态。

组装:\(P=\begin{bmatrix}1&1\\1&-2\end{bmatrix}\),\(D=\begin{bmatrix}5&0\\0&2\end{bmatrix}\)。因为 \(P\) 的列不正交,\(P^{-1}\) 只能老老实实按 2×2 求逆公式算(\(\det P=1\cdot(-2)-1\cdot1=-3\)):

\[ P^{-1}=\frac{1}{-3}\begin{bmatrix}-2&-1\\-1&1\end{bmatrix}=\frac13\begin{bmatrix}2&1\\1&-1\end{bmatrix}. \]

验证 \(A=PDP^{-1}\):

\[ PD=\begin{bmatrix}5&2\\5&-4\end{bmatrix},\qquad PDP^{-1}=\begin{bmatrix}5&2\\5&-4\end{bmatrix}\cdot\frac13\begin{bmatrix}2&1\\1&-1\end{bmatrix}=\frac13\begin{bmatrix}12&3\\6&9\end{bmatrix}=\begin{bmatrix}4&1\\2&3\end{bmatrix}=A. \]

对得上。关键观察:对一般矩阵,换基矩阵 \(P^{-1}\) 必须真的求逆。下一节会看到,对称矩阵省掉了这步——它的 \(P^{-1}\) 直接是转置。

立刻的回报:算 \(A^n\)

反复相乘时,对角化让计算坍缩成对角元的乘方。因为中间的 \(P^{-1}P\) 成对消掉:

\[ A^n=(PDP^{-1})(PDP^{-1})\cdots(PDP^{-1})=P\,D^n\,P^{-1},\qquad D^n=\operatorname{diag}(\lambda_1^n,\dots,\lambda_n^n). \]

对角阵的乘方只是把每个对角元各自取 \(n\) 次方——\(O(n)\) 而非 \(O(n)\) 次矩阵乘法。这条式子是后面理解"反复相乘的稳定性"的关键:\(A^n\) 的命运完全由 \(\lambda_i^n\) 决定。

5. 对称矩阵的特权:谱定理

上一节的对角化例子里,特征向量歪歪斜斜、\(P^{-1}\) 得费劲求逆——这是一般矩阵的常态(特征值甚至可能是复数,特征向量可能不够用)。但实对称矩阵(\(A^\top=A\))享有一条极强的保证:

要点:谱定理 spectral theorem

若 \(A\) 是实对称矩阵,则:

  • 它的特征值全是实数
  • 不同特征值的特征向量相互正交,且总能选出一组标准正交的特征向量当基(即使有重根也行,对称矩阵永不亏损);
  • 因此可正交对角化:存在正交矩阵 \(Q\)(\(Q^\top Q=I\),列是单位特征向量)和实对角阵 \(\Lambda\),使 \[ \boxed{A=Q\Lambda Q^\top.} \]

这里 \(P^{-1}\) 直接变成了 \(Q^\top\),原因在于 \(Q\) 是正交矩阵 orthogonal matrix:它的各列是标准正交向量(两两垂直、各自单位长),由此可推出 \(Q^\top Q=I\),所以它的逆恰好就是转置,\(Q^{-1}=Q^\top\);几何上它只做旋转 / 反射,不改变长度与角度(这几条性质我们到专讲正交矩阵那一课会严格证明,这里先当作工具用)。于是对称矩阵的变换图景特别干净:先旋转到主轴(\(Q^\top\)),沿主轴各自缩放(\(\Lambda\)),再旋转回来(\(Q\)),全程没有任何剪切。这组主轴就是它的特征向量。

例题:对一个 2×2 对称矩阵做正交对角化并算 A³

取对称矩阵 \(A=\begin{bmatrix} 2 & 1 \\ 1 & 2 \end{bmatrix}\)。

特征值:\(\operatorname{tr}=4,\ \det=3\),故 \(\lambda^2-4\lambda+3=(\lambda-3)(\lambda-1)=0\),得 \(\lambda_1=3,\ \lambda_2=1\)。

特征向量:\(\lambda=3\):\((A-3I)v=\begin{bmatrix}-1&1\\1&-1\end{bmatrix}v=0\Rightarrow v^{(1)}=\begin{bmatrix}1\\1\end{bmatrix}\);\(\lambda=1\):\(\begin{bmatrix}1&1\\1&1\end{bmatrix}v=0\Rightarrow v^{(2)}=\begin{bmatrix}1\\-1\end{bmatrix}\)。这两根互相垂直(\(v^{(1)}\cdot v^{(2)}=0\))——正是谱定理预言的对称矩阵特权。

组装:这里我们用未归一化的 \(P=\begin{bmatrix}1&1\\1&-1\end{bmatrix}\),\(D=\begin{bmatrix}3&0\\0&1\end{bmatrix}\)。由于 \(P\) 的两列虽正交但长度都是 \(\sqrt2\),有 \(P^\top P=2I\),于是 \(P^{-1}=\dfrac12 P^\top=\dfrac12\begin{bmatrix}1&1\\1&-1\end{bmatrix}\)——求逆退化成"转置再除以 2",比上一节的一般矩阵省力得多。(若把每列再除以 \(\sqrt2\) 归一化成正交矩阵 \(Q\),则严格地 \(P^{-1}=Q^\top\)。)

算 \(A^3\):\(D^3=\operatorname{diag}(27,1)\),于是

\[ A^3=P D^3 P^{-1}=\begin{bmatrix}1&1\\1&-1\end{bmatrix}\begin{bmatrix}27&0\\0&1\end{bmatrix}\cdot\tfrac12\begin{bmatrix}1&1\\1&-1\end{bmatrix}=\tfrac12\begin{bmatrix}27&1\\27&-1\end{bmatrix}\begin{bmatrix}1&1\\1&-1\end{bmatrix}=\begin{bmatrix}14&13\\13&14\end{bmatrix}. \]

直接连乘 \(A\cdot A\cdot A\) 也得 \(\begin{bmatrix}14&13\\13&14\end{bmatrix}\),一致。

6. 二次型与正定性

对称矩阵天然和二次型 quadratic form \(f(x)=x^\top A x\) 绑在一起(这是一个把向量 \(x\) 映成标量的函数,每一项都是 \(x\) 的两个分量相乘,故称"二次")。把 \(A=Q\Lambda Q^\top\) 代入,令 \(y=Q^\top x\)(换到主轴坐标),则

\[ x^\top A x=x^\top Q\Lambda Q^\top x=(Q^\top x)^\top\Lambda(Q^\top x)=y^\top\Lambda y=\sum_{i}\lambda_i\,y_i^2. \]

最后一步是关键:因为 \(\Lambda\) 是对角阵,\(\Lambda y\) 把第 \(i\) 个分量变成 \(\lambda_i y_i\),再与 \(y^\top\) 做内积就是 \(\sum_i y_i\cdot\lambda_i y_i=\sum_i\lambda_i y_i^2\)——各分量平方各乘对应对角元,没有任何交叉项 \(y_i y_j\)(交叉项只会来自非对角元,而对角阵的非对角元全是 0)。所以 \(x^\top A x\) 的符号完全由特征值的符号决定

名称条件等价的特征值条件几何/含义
正定 positive definite\(x^\top A x>0\)(\(\forall x\neq0\))所有 \(\lambda_i>0\)碗朝上,唯一极小
半正定 PSD\(x^\top A x\ge0\)所有 \(\lambda_i\ge0\)碗朝上、可能有平底
负定 / 半负定\(x^\top A x<0\) / \(\le0\)所有 \(\lambda_i<0\) / \(\le0\)碗朝下
不定 indefinite有正有负\(\lambda_i\) 有正有负鞍点

ML 和 ML 的联系

这张表直接对应优化里的"形状判断"。损失函数 \(L\) 在某点的海森矩阵 Hessian(二阶导组成的对称矩阵)的特征值告诉你这点是什么:全正 → 局部极小(碗底);全负 → 极大;有正有负 → 鞍点 saddle point。深度网络的高维损失面里鞍点远多于真正的极小点,这是优化研究的核心母题之一。特征值的大小则是曲率 curvature:某方向 \(\lambda\) 越大,曲面越陡、梯度变化越剧烈——这正是为什么"病态"(最大与最小特征值之比,即条件数很大)的损失面让梯度下降走 Z 字形、收敛慢。

7. 协方差矩阵与 PCA:主成分就是特征向量

现在把特征分解用到数据上。设数据矩阵每是一个样本(共 \(m\) 个、\(n\) 维),先把每列中心化(减去该特征的均值)得到 \(X\)。协方差矩阵 covariance matrix

\[ C=\frac{1}{m-1}\,X^\top X \]

是 \(n\times n\) 对称半正定矩阵:对角元 \(C_{ii}\) 是第 \(i\) 个特征的方差,非对角元 \(C_{ij}\) 是特征 \(i,j\) 的协方差(一起变大 / 反向变 / 无关)。

由谱定理 \(C=Q\Lambda Q^\top\)。它的特征向量 \(q_1,q_2,\dots\)(按特征值从大到小排)就是数据点云的主轴方向,称主成分 principal component;对应特征值 \(\lambda_i\) 就是数据沿该方向的方差

要点:PCA 一句话

主成分 = 协方差矩阵的特征向量;该方向上的方差 = 对应的特征值。第一主成分是数据散得最开(方差最大)的方向,第二主成分是与它正交方向里散得最开的,依此类推。降维就是只保留前 \(k\) 个大特征值对应的方向、丢掉小特征值方向(那些方向上数据几乎不变、信息少)。被保留的方差占比 \(\big(\sum_{i\le k}\lambda_i\big)/\big(\sum_i\lambda_i\big)\) 就是"保留了多少信息"。

图3:PCA 的几何 —— 主成分是协方差的特征向量,方差是特征值沿约45度方向拉长的二维点云,叠加两根正交的主成分箭头与一个标准差等高椭圆。图3:PCA 的几何 —— 主成分 = 协方差特征向量x₁x₂第一主成分 (PC1)长度 ∝ √λ₁,λ₁ 大第二主成分 (PC2)长度 ∝ √λ₂,λ₂ 小1 个标准差等高椭圆半轴长 = √特征值质心箭头方向 = 特征向量 · 方差(伸展量) = 特征值
图3:PCA 的几何。一团二维数据点云沿斜方向拉长;叠加协方差矩阵的两根特征向量作为主轴箭头——长轴(第一主成分)指向方差最大方向、箭头长度正比于 sqrt(λ1),短轴(第二主成分)与之正交、长度正比于 sqrt(λ2)。再画出 1 个标准差等高椭圆,其半轴方向=特征向量、半轴长度=sqrt(特征值),直观说明'主成分=协方差特征向量、方差=特征值'。

为什么是协方差的特征向量?沿单位方向 \(u\) 投影后数据的方差恰是 \(u^\top C u\)(一个二次型!)。"找方差最大的方向"就是在 \(\|u\|=1\) 下最大化 \(u^\top C u\)——由第 6 节的 \(\sum\lambda_i y_i^2\) 展开可知,答案就是最大特征值对应的特征向量,最大值就是最大特征值本身。优化问题的答案,被特征分解一口吞下。

8. 幂迭代:不解方程也能找主方向

当矩阵很大、只想要最大那个特征值/特征向量时,有个极简算法叫幂迭代 power iteration:随便取一个向量 \(b_0\),反复做"乘 \(A\)、再归一化":

\[ b_{k+1}=\frac{A b_k}{\|A b_k\|}. \]

为什么有效?把初始向量按特征基展开 \(b_0=\sum_i c_i v^{(i)}\),反复乘 \(A\) 后变成 \(A^k b_0=\sum_i c_i\lambda_i^k v^{(i)}\)。设 \(|\lambda_1|\) 严格最大、且初始向量在 \(v^{(1)}\) 方向有非零分量(\(c_1\neq0\);随机取一个向量几乎必然满足),提出公因子:

\[ A^k b_0=\lambda_1^k\Big(c_1 v^{(1)}+\sum_{i\ge2}c_i\big(\tfrac{\lambda_i}{\lambda_1}\big)^k v^{(i)}\Big). \]

因为 \(|\lambda_i/\lambda_1|<1\),那些项随 \(k\) 指数衰减——最大特征值方向越乘越占主导,归一化后 \(b_k\) 收敛到 \(v^{(1)}\) 张成的那条直线(可能相差一个符号)。具体地:若 \(\lambda_1>0\),\(b_k\) 收敛到 \(\pm v^{(1)}\) 中某个固定方向;若 \(\lambda_1<0\),\(\lambda_1^k\) 的符号每步翻转,\(b_k\) 会在 \(+v^{(1)}\) 与 \(-v^{(1)}\) 之间来回跳,但方向(那条直线)依然收敛

要从 \(b_k\) 读出特征值本身,可用瑞利商 Rayleigh quotient \(\dfrac{b^\top A b}{b^\top b}\)(对单位向量 \(b\) 就简化为 \(b^\top A b\)),它衡量 \(A\) 在方向 \(b\) 上的"缩放倍数",且带符号——能区分 \(\lambda_1\) 的正负,收敛到 \(\lambda_1\) 本身。相比之下 \(\|Ab_k\|\) 只能收敛到 \(|\lambda_1|\)(永远非负,丢了符号),所以读特征值时瑞利商更常用。Google 早年的 PageRank 本质就是对网页链接矩阵做幂迭代找主特征向量。

9. 谱半径与稳定性:梯度消失 / 爆炸的根

定义谱半径 spectral radius \(\rho(A)=\max_i|\lambda_i|\),即特征值模长的最大值。它决定了"反复相乘"会发生什么。由 \(A^n=PD^nP^{-1}\),\(A^n\) 的增长由 \(\max_i|\lambda_i|^n=\rho(A)^n\) 主导:

ML 和 ML 的联系:梯度消失 / 爆炸的根源

循环网络 RNN 把同一个权重矩阵 \(W\) 在时间步上反复相乘;深层网络反向传播时,梯度也要穿过许多层连乘一串雅可比矩阵。无论哪种,"信号穿过 \(T\) 步"都近似一个 \(W^T\) 那样的连乘。于是:

  • 谱半径 \(\rho(W)<1\) → 梯度按 \(\rho^T\) 指数消失 vanishing,网络学不到长程依赖;
  • \(\rho(W)>1\) → 梯度指数爆炸 exploding,训练发散(NaN)。

这就是第 4 节 \(A^n=PD^nP^{-1}\) 埋下的伏笔在 ML 里现身。应对手段也都围着谱半径转:梯度裁剪、正交 / 单位范数初始化(让 \(\rho\approx1\))、LSTM/GRU 的门控、残差连接,以及 GAN 里的谱归一化 spectral normalization——直接把权重矩阵除以它的最大奇异值(下一课会看到,对一般矩阵该用奇异值而非特征值)来把"放大倍数"压到 1 附近、稳住训练。谁控制了谱半径,谁就控制了深层 / 循环网络的稳定性。

10. 代码:用 numpy 验证手算

下面的代码验证第 2、5 节的两个例题,并演示 \(Av=\lambda v\)、对角化重构、以及一次幂迭代。只用 numpy,几秒跑完。

import numpy as np

# ---- 例题1:A=[[4,1],[2,3]],手算得 lambda=5,2 ----
A = np.array([[4., 1.],
              [2., 3.]])
vals, vecs = np.linalg.eig(A)          # vals: 特征值; vecs 的每"列"是一个特征向量
print("特征值:", vals)                  # [5. 2.]
print("特征向量(按列):\n", vecs)

# 验证 A v = lambda v(对每一列)
for i in range(2):
    v = vecs[:, i]
    print(f"  lambda={vals[i]:.1f}: Av={A@v},  lambda*v={vals[i]*v}")

# 用我们手算的整数向量验证(无需归一化)
print("A@[1,1]  =", A @ np.array([1., 1.]),  " 应= 5*[1,1]")
print("A@[1,-2] =", A @ np.array([1., -2.]), " 应= 2*[1,-2]")

# ---- 例题2:对称矩阵 A=[[2,1],[1,2]] 的对角化与 A^3 ----
S = np.array([[2., 1.],
              [1., 2.]])
w, Q = np.linalg.eigh(S)               # 对称矩阵用 eigh:返回实特征值 + 正交特征向量
print("\n对称矩阵特征值:", w)            # [1. 3.]
print("Q 是否正交 (Q^T Q ≈ I):\n", np.round(Q.T @ Q, 10))

# 对角化重构 S = Q Λ Qᵀ
recon = Q @ np.diag(w) @ Q.T
print("Q Λ Qᵀ 重构 S:\n", np.round(recon, 10))

# 用特征分解算 S^3 ,与直接连乘对比
S3_eig = Q @ np.diag(w**3) @ Q.T
print("S^3 (经特征值):\n", np.round(S3_eig, 8))
print("S^3 (直接连乘):\n", np.linalg.matrix_power(S, 3))   # 应都为 [[14,13],[13,14]]

# ---- 幂迭代:找最大特征值方向 ----
b = np.array([1., 0.])
for _ in range(50):
    b = S @ b
    b = b / np.linalg.norm(b)
lam = b @ (S @ b) / (b @ b)              # 瑞利商(带符号),估计最大特征值;b 已归一化故分母≈1
print("\n幂迭代得到的主方向:", np.round(b, 4), " 估计 lambda:", round(lam, 4))
print("(应收敛到 [0.7071,0.7071] 方向, lambda≈3)")

调一调,观察现象

下面三个小实验都只用 numpy 和 print,几秒跑完。动手改一改矩阵,亲眼看看特征值是实是虚、迹和行列式跟特征值是什么关系、幂迭代怎么把符号"藏"起来。

实验 1:把矩阵换成"旋转",看特征值从实数变虚数

改什么:分别对三个矩阵求特征值——本课的一般矩阵 \(\begin{bmatrix}4&1\\2&3\end{bmatrix}\)、对称矩阵 \(\begin{bmatrix}2&1\\1&2\end{bmatrix}\),以及一个 90° 旋转 \(\begin{bmatrix}0&-1\\1&0\end{bmatrix}\)。

预期现象:一般矩阵给实特征值 \(5,2\),对称矩阵给实特征值 \(3,1\);旋转矩阵的特征值却是一对共轭虚数 \(\pm i\),打印出来是 0.+1.j 0.-1.j(带 j)。

为什么:特征向量是"被变换后方向不变"的方向。旋转把每一个实方向都转走了,平面里根本没有不动的实方向,所以解只能落到复数域——这正是第 5 节说"一般矩阵特征值甚至可能复"的具体例子,而对称矩阵(谱定理)永远给实特征值。

import numpy as np
for name, M in [("general", np.array([[4.,1.],[2.,3.]])),
                ("symmetric", np.array([[2.,1.],[1.,2.]])),
                ("rotation90", np.array([[0.,-1.],[1.,0.]]))]:
    print(name, "特征值:", np.linalg.eigvals(M))
# general -> [5. 2.]; symmetric -> [3. 1.]; rotation90 -> [0.+1.j 0.-1.j]

实验 2:验证"两根之和=迹,两根之积=行列式"——连虚根也成立

改什么:对上面三个矩阵,把特征值之和、之积分别和 \(\operatorname{tr}\)、\(\det\) 比一比。

预期现象:三个矩阵都满足 sum(eig)=traceprod(eig)=det。即使旋转矩阵特征值是 \(\pm i\),和仍是 0(=迹),积仍是 1(=行列式),虚部恰好抵消。

为什么:这是第 2 节韦达定理的直接结论,与特征值是实是虚无关——它对任意 \(n\times n\) 都成立(和=迹,积=行列式)。所以这两条既能求解又能验算

import numpy as np
for name, M in [("general", np.array([[4.,1.],[2.,3.]])),
                ("symmetric", np.array([[2.,1.],[1.,2.]])),
                ("rotation90", np.array([[0.,-1.],[1.,0.]]))]:
    w = np.linalg.eigvals(M)
    print(name, "sum=", np.round(w.sum().real,4), "trace=", np.trace(M),
          "| prod=", np.round(np.prod(w).real,4), "det=", round(np.linalg.det(M),4))
# 每行都是 sum==trace 且 prod==det
# general:   sum=7 trace=7 | prod=10 det=10
# symmetric: sum=4 trace=4 | prod=3  det=3
# rotation90:sum=0 trace=0 | prod=1  det=1

实验 3:负的最大特征值——看幂迭代"跳来跳去",瑞利商却抓住符号

改什么:把幂迭代用在 \(\begin{bmatrix}-2&-1\\-1&-2\end{bmatrix}\)(特征值 \(-1,-3\),模长最大的是 \(-3\)),打印每一步的 \(b\),再分别用瑞利商和 \(\|Ab\|\) 估特征值。

预期现象:每一步 \(b\) 在 \(+[0.707,0.707]\) 和 \(-[0.707,0.707]\) 之间逐步翻号(奇数步为正、偶数步为负),但方向(那条直线)稳定收敛到 \(\pm[0.707,0.707]\)。瑞利商收敛到 -3.0(带符号),而 \(\|Ab\|\) 只给 3.0(丢了符号)。

为什么:第 8 节说当 \(\lambda_1<0\) 时 \(\lambda_1^k\) 逐步翻号,于是 \(b\) 来回跳,但直线方向不变;要读出 \(\lambda\) 的正负必须用带符号的瑞利商,\(\|Ab\|\) 永远非负只能给 \(|\lambda_1|\)。

import numpy as np
Sn = np.array([[-2.,-1.],[-1.,-2.]])   # 特征值 -1, -3
b = np.array([1., 0.3])
for k in range(6):
    b = Sn @ b; b = b / np.linalg.norm(b)
    print(f"step{k}: b={np.round(b,3)}")   # 符号每步翻转,方向稳定
print("瑞利商 b·(Sn b) =", round(b @ (Sn @ b), 4))   # -3.0 带符号
print("||Sn b||        =", round(np.linalg.norm(Sn @ b), 4))  # 3.0 丢符号

动手练习

  1. 手算 + 验证。对 \(A=\begin{bmatrix}3&0\\1&2\end{bmatrix}\):用 \(\operatorname{tr}/\det\) 写特征多项式、求出两个特征值与各自一根特征向量,并手验 \(Av=\lambda v\)。再用下面骨架核对。
    import numpy as np
    A = np.array([[3., 0.],
                  [1., 2.]])
    vals, vecs = np.linalg.eig(A)
    print("特征值:", vals)              # 期望 3 和 2
    for i in range(2):
        v = vecs[:, i]
        print(vals[i], "Av=", A@v, "lambda*v=", vals[i]*v)
  2. 对角化算高次幂。对第 1 题的 \(A\),写出 \(P,D\),用 \(A^n=PD^nP^{-1}\) 求 \(A^{10}\),并和 np.linalg.matrix_power(A,10) 对比。观察 \(A^{10}\) 的元素由 \(3^{10}\) 还是 \(2^{10}\) 主导。
  3. 判断正定性。对 \(B=\begin{bmatrix}2&-1\\-1&2\end{bmatrix}\) 用 np.linalg.eigh 求特征值,判断它是否正定;再随机取 50 个 \(x\) 计算 \(x^\top B x\) 看是否恒正。
    import numpy as np
    B = np.array([[2., -1.], [-1., 2.]])
    w, _ = np.linalg.eigh(B)
    print("特征值:", w, " 全正?", np.all(w > 0))
    xs = np.random.randn(50, 2)
    vals = np.einsum('ij,jk,ik->i', xs, B, xs)   # 每行算 xᵀBx
    print("min xᵀBx =", vals.min())              # 应 > 0
  4. PCA 雏形。合成一团沿 45° 拉长的二维数据,中心化后求协方差矩阵的特征向量/值,验证第一主成分指向数据散得最开的方向、其特征值最大。
    import numpy as np
    np.random.seed(0)
    # 沿方向 [1,1] 拉长的点云:行=样本
    t = np.random.randn(500, 1)
    noise = 0.3 * np.random.randn(500, 2)
    X = t * np.array([1., 1.]) + noise
    X = X - X.mean(axis=0)                        # 列中心化
    C = (X.T @ X) / (len(X) - 1)                  # 协方差矩阵
    w, Q = np.linalg.eigh(C)                      # 特征值升序
    print("特征值(方差):", np.round(w, 3))
    print("第一主成分(最大特征值方向):", np.round(Q[:, -1], 3))  # 应≈ ±[0.707,0.707]
  5. 谱半径与稳定性。构造 \(W_1=0.9\cdot I\) 与 \(W_2=1.1\cdot R\)(\(R\) 为某旋转矩阵)。各自计算 \(\rho(W)\),再对一个向量连乘 100 次,打印范数,观察"消失 vs 爆炸"。

掌握自检

下一课,我们把特征分解推广到任意(非方、非对称)矩阵——那就是奇异值分解 SVD。你会看到 \(A=U\Sigma V^\top\) 如何把"任意线性变换"拆成"旋转—缩放—旋转",谱归一化里那个"最大奇异值"也将在那里正式登场。