读完这一课,你将能够
- 用一句话说清 \(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\) 就是缩放倍数。
- \(\lambda>1\):沿该方向被拉长;
- \(0<\lambda<1\):被压短;
- \(\lambda<0\):方向反过来(再缩放);
- \(\lambda=0\):该方向被压扁到原点,说明 \(A\) 不可逆(核非平凡)。
易错
特征向量必须非零(\(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\) 的零空间,里面装着该特征值的全部特征向量加上原点。
- 代数重数 algebraic multiplicity:\(\lambda\) 作为特征多项式根的重数(在因式分解里出现几次)。
- 几何重数 geometric multiplicity:特征空间的维数(该方向上"独立的特征向量有几根")。
恒有 \(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}\) 把"复杂的变换"拆成三步——读法是从右往左:
- \(P^{-1}\):把向量从标准坐标换到特征基坐标(用特征向量当新的坐标轴);
- \(D\):在特征基下,变换退化成沿各轴的纯缩放(第 \(i\) 轴乘 \(\lambda_i\)),不再有任何旋转或剪切(剪切 shear 指把方块"推斜"成平行四边形的那种变换,像把正体字写成斜体);
- \(P\):换回标准坐标。
一句话:选对了坐标系,扭曲的变换就变成了简单的拉伸。这正是特征向量的威力——它们是让 \(A\) "看起来最简单"的那组坐标轴。
例题:一般(非对称)矩阵的对角化
沿用第 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)\) 就是"保留了多少信息"。
为什么是协方差的特征向量?沿单位方向 \(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\) 主导:
- \(\rho(A)<1\):\(A^n\to 0\),反复相乘衰减到零;
- \(\rho(A)>1\):\(A^n\) 范数爆炸到无穷;
- \(\rho(A)=1\):临界,刚好不增不减(对应"稳定"边界)。
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)=trace、prod(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 丢符号
动手练习
- 手算 + 验证。对 \(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) - 对角化算高次幂。对第 1 题的 \(A\),写出 \(P,D\),用 \(A^n=PD^nP^{-1}\) 求 \(A^{10}\),并和
np.linalg.matrix_power(A,10)对比。观察 \(A^{10}\) 的元素由 \(3^{10}\) 还是 \(2^{10}\) 主导。 - 判断正定性。对 \(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 - 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] - 谱半径与稳定性。构造 \(W_1=0.9\cdot I\) 与 \(W_2=1.1\cdot R\)(\(R\) 为某旋转矩阵)。各自计算 \(\rho(W)\),再对一个向量连乘 100 次,打印范数,观察"消失 vs 爆炸"。
掌握自检
- 我能用一句话说清 \(Av=\lambda v\) 的几何含义,并解释为什么 \(v\) 必须非零、而 \(\lambda=0\) 允许。
- 给一个 2×2 矩阵,我能在两分钟内用 \(\operatorname{tr}/\det\) 写出特征方程、求出特征值与特征向量,并验算。
- 我能说明 \(A=PDP^{-1}\) 的"换基—缩放—换回"三步画面,并据此解释 \(A^n=PD^nP^{-1}\)。
- 我能复述谱定理的三条结论(实特征值、正交特征向量、\(A=Q\Lambda Q^\top\)),并知道它为何对协方差/海森这类对称矩阵成立。
- 我能把 \(x^\top A x\) 的符号与特征值符号对应起来,并据此判断海森给出的是极小、极大还是鞍点。
- 我能解释"主成分 = 协方差特征向量、方差 = 特征值",以及降维时为什么丢小特征值方向。
- 我能用幂迭代和谱半径,说清楚 RNN/深层网络梯度消失与爆炸的根源。
下一课,我们把特征分解推广到任意(非方、非对称)矩阵——那就是奇异值分解 SVD。你会看到 \(A=U\Sigma V^\top\) 如何把"任意线性变换"拆成"旋转—缩放—旋转",谱归一化里那个"最大奇异值"也将在那里正式登场。
可以先放过的点
- 几何重数 vs 代数重数、"亏损矩阵"那一段(第 3 节):知道"对称矩阵永不亏损、够用"就行,重数的精确判定现在不必死磕,等你真遇到不可对角化的矩阵再回来。
- 谱定理"为什么"成立(第 5 节):现在把 \(A=Q\Lambda Q^\top\) 当好用的工具直接拿来用即可,正交矩阵 \(Q^{-1}=Q^\top\) 的严格证明留到专讲正交矩阵那一课。
- 幂迭代里瑞利商带符号、\(\|Ab\|\) 丢符号的细节(第 8 节):第一遍记住"反复乘 A 会偏向最大特征值方向"这个直觉就够,符号那点小机关下次需要读出 \(\lambda\) 正负时再细看。
- 谱归一化用奇异值而非特征值这一句(第 9 节):为什么是奇异值,要等下一课《SVD 与低秩压缩》把奇异值正式讲清才会豁然开朗,这里先存个疑。