前面讨论 Krylov subspace methods 时,我们关心的是如何用
b, Ab, A2b,…
构造一个低维子空间,然后在这个子空间里近似求解线性系统或者近似捕捉谱信息
这一章换一个角度:如果目标不是解
Ax=b
而是求矩阵 A 的 eigenvalues,那么 QR 分解、Hessenberg 形式、shift 和 Krylov 方法之间会自然连在一起
核心主线可以先写成
A⟶H⟶shifted QR iteration⟶eigenvalues
其中 H 是一个和 A 相似的 Hessenberg 矩阵。对于对称矩阵,H 会进一步简化成三对角矩阵
这条路线背后的思想是:我们不断改变坐标系,但不改变特征值;坐标系越来越接近特征向量方向时,矩阵就越来越接近上三角形式,最后特征值会出现在对角线上
从 QR 分解到 QR iteration
普通 QR 分解只是把一个矩阵分解成
A0=Q0R0
其中 Q0 是正交矩阵,R0 是上三角矩阵
这里要特别注意一点:QR 分解的数学定义虽然可以用 Gram-Schmidt 正交化来理解,但实际数值计算里一般不会直接使用最朴素的 Gram-Schmidt
原因是 Gram-Schmidt 在数值上可能损失正交性,尤其当列向量接近线性相关时,舍入误差会让得到的 Q 不够正交
实际算法更常用的是
- Householder reflections
- Givens rotations
Householder reflections 更适合一次性把一整列下面的元素消掉,常用于稠密矩阵的 QR 分解和 Hessenberg reduction;Givens rotations 则适合一次消掉一个指定元素,常用于稀疏结构、局部更新,以及隐式 QR step 中追逐非零元素
所以在理解 QR iteration 时,可以把 Gram-Schmidt 当作概念入口,但不要把它当成实际算法的默认实现
如果只停在这一步,它只是一个分解。但 QR eigenvalue algorithm 的关键是把顺序反过来,定义
A1=R0Q0
然后继续重复
Ak=QkRk
Ak+1=RkQk
这个过程叫 QR iteration
表面上看,它只是不断拆开再乘回去;但乘回去的顺序变了,所以矩阵元素会变化
关键问题是:这样做会不会改变特征值?
由于
Ak=QkRk
所以
Rk=Qk⊤Ak
代入下一步定义:
Ak+1=RkQk=Qk⊤AkQk
因此 Ak+1 和 Ak 是相似矩阵
Ak+1=Qk⊤AkQk
相似矩阵有相同的特征值,所以整个序列
A0,A1,A2,…
虽然元素不断变化,但特征值始终不变
这就是 QR iteration 可以用来求特征值的第一个原因:
每一步都是正交相似变换,因此不改变 eigenvalues
为什么最后看对角线
如果矩阵 A 是实对称矩阵,那么它可以被正交对角化:
A=VΛV⊤
其中
Λ=diag(λ1,λ2,…,λn)
如果 QR iteration 逐渐把当前坐标系调整到特征向量方向,那么矩阵在这个坐标系下就会越来越接近对角矩阵
Ak⟶Λ
这时对角线上的元素就是特征值
对于一般非对称矩阵,情况稍微不同。一般矩阵不一定能被正交对角化,但可以被化到 Schur form
A=UTU⊤
其中 T 是上三角矩阵
T=λ100∗λ20∗∗λ3
上三角矩阵的特征值就是对角线元素,因为
det(T−λI)=i∏(tii−λ)
所以更准确地说,QR iteration 的目标不是一定把矩阵变成对角矩阵,而是把它推向上三角形式
一般矩阵趋向 Schur form;对称矩阵进一步趋向对角形式
非对角元素为什么会变小
QR iteration 可以理解成一种同时追踪多个方向的 power method
普通 power method 从一个向量出发,不断做
x, Ax, A2x,…
如果
∣λ1∣>∣λ2∣≥⋯
并且初始向量在 v1 方向上有非零分量,那么反复乘 A 以后,最大的特征方向会逐渐占主导
QR iteration 做的是更完整的事情:它不是只追踪一个向量,而是追踪一组正交向量,并且每一步都重新正交化
可以把这个过程粗略理解为
Ak的信息被不断重新整理到一组正交基里
当这组正交基越来越接近特征向量基时,矩阵在这组基底下就越来越少发生“方向混合”
在特征向量基底中有
Avi=λivi
这表示每个方向只缩放自己,不混到别的方向。因此矩阵表示会接近对角或者上三角形式,非对角元素就会变小
所以非对角元素可以理解为不同特征方向之间的混合量。当坐标轴越来越贴近特征方向,这种混合量就逐渐消失
Shifted QR iteration
朴素 QR iteration 理论上很漂亮,但实际收敛可能很慢。尤其当两个特征值大小很接近时,类似 power method 里的收敛比率会很不理想
为了加速收敛,引入 shift
给定一个数 μk,不直接对 Ak 做 QR 分解,而是对
Ak−μkI
做 QR 分解:
Ak−μkI=QkRk
然后定义
Ak+1=RkQk+μkI
看起来好像只是先减去 μkI,最后又加回来,但重点在于 QR 分解得到的 Qk 已经变了
它仍然保持相似关系。由
Ak−μkI=QkRk
得到
Rk=Qk⊤(Ak−μkI)
因此
Ak+1=RkQk+μkI=Qk⊤(Ak−μkI)Qk+μkI=Qk⊤AkQk−μkQk⊤Qk+μkI=Qk⊤AkQk
所以 shifted QR 仍然不改变特征值
shift 的作用不是改变答案,而是改变每一步选择的正交变换,使它更快地把某个特征值分离出来
如果 μk 很接近某个特征值 λj,那么
λj−μk
会变得很小。对 Ak−μkI 做 QR 分解时,这个方向会被更有针对性地处理,相关的次对角元素会更快下降
这就是为什么实际算法通常使用 shifted QR,而不是最朴素的 QR iteration
对于对称三对角矩阵,常用的 Wilkinson shift 往往会带来非常快的局部收敛。直观上,如果某个角度误差本来像
sinθ
一次迭代后可能变成类似
sin3θ
那么当误差已经小的时候,它会极快地被压下去
Deflation
QR iteration 过程中,我们通常观察次对角线元素
ai+1,i
如果某个次对角元素已经非常小,比如
∣ai+1,i∣≈0
那么矩阵就近似分裂成块上三角形式
Ak≈[B0∗C]
块上三角矩阵的特征值等于对角块的特征值合在一起,所以可以把问题拆开
λ(Ak)=λ(B)∪λ(C)
这一步叫 deflation
如果右下角已经近似变成一个 1×1 块
[B0∗λn]
那么 λn 就可以认为已经被求出来了。接下来只需要继续对左上角的 B 做 QR iteration
因此 QR 算法不是一口气把所有特征值同时“算完”,而是不断让某些次对角元素变小,然后把已经收敛的部分切出来
为什么先化成 Hessenberg
如果每一步都对完整的稠密矩阵做 QR 分解,代价很高
实际算法通常先用 Householder 变换把一般矩阵化成 Hessenberg 形式
H=∗∗00∗∗∗0∗∗∗∗∗∗∗∗
也就是主对角线下一条以外的元素全为 0
这个化简通过正交相似变换完成
H=Q⊤AQ
所以 H 和 A 有相同特征值
Hessenberg 形式的好处是:它足够简单,但又能在 QR step 中被保持。也就是说,如果 Hk 是 Hessenberg 矩阵,那么一次 QR iteration 后得到的 Hk+1 仍然是 Hessenberg 矩阵
于是后续每一步 shifted QR 都可以利用这个结构,避免处理大量本来就应该为 0 的元素
对于实对称矩阵,Hessenberg 形式会进一步退化成三对角矩阵
T=∗∗00∗∗∗00∗∗∗00∗∗
这是因为对称性要求
T⊤=T
而 Hessenberg 结构只允许主对角线下一条非零。两者合起来,就只剩主对角线和上下两条副对角线
所以实际求对称矩阵特征值的流程通常是
AQ⊤AQTshifted QRΛ
和 Krylov 方法的连接
Hessenberg 形式也正是 Krylov 方法里自然出现的结构
从一个向量 b 出发,构造 Krylov 子空间
Km(A,b)=span{b,Ab,A2b,…,Am−1b}
Arnoldi 过程会构造一组正交基
Qm=[q1,q2,…,qm]
使得
span(Qm)=Km(A,b)
并得到关系
AQm=Qm+1Hˉm
等价地,可以写成
AQm=QmHm+hm+1,mqm+1em⊤
其中 Hm 是一个 m×m 的小 Hessenberg 矩阵
如果忽略最后那个残差项,那么可以把
Hm≈Qm⊤AQm
理解为 A 在 Krylov 子空间上的投影
于是求大矩阵 A 的部分特征值,可以变成求小矩阵 Hm 的特征值
Hmy=θy
再令
x=Qmy
那么 θ 就是 A 的近似特征值,x 是对应的近似特征向量。这些 θ 叫 Ritz values
所以 QR 和 Krylov 的关系可以概括为
完整 QR:先把整个 A 化成 Hessenberg,再求全部特征值。
Krylov / Arnoldi:只在低维子空间里得到小 Hessenberg,再求部分特征值。
二者都离不开 Hessenberg 结构,只是规模不同
奇异值和 bidiagonal QR
特征值问题讨论的是
Ax=λx
而奇异值来自 SVD
A=UΣV⊤
其中
Σ=diag(σ1,σ2,…)
奇异值和特征值的联系是
A⊤A=VΣ2V⊤
所以
λi(A⊤A)=σi2
也就是
σi=λi(A⊤A)
从理论上看,可以先求 A⊤A 的特征值,再开平方得到奇异值
但实际数值计算通常不显式形成 A⊤A,因为这会把条件数平方
κ(A⊤A)=κ(A)2
小奇异值方向的误差会因此被放大
更稳定的做法是先通过左右正交变换把 A 化成双对角矩阵
B=U⊤AV
其中
B=d1000e1d2000e2d3000e3d4
注意这里不是普通的相似变换,因为左右两边的正交矩阵一般不同
普通特征值相似变换是
Q⊤AQ
它保持特征值
而 SVD 里的左右正交变换
U⊤AV
保持的是奇异值
原因是
B⊤B=(U⊤AV)⊤(U⊤AV)=V⊤A⊤UU⊤AV=V⊤A⊤AV
所以 B⊤B 和 A⊤A 相似,具有相同特征值
因此
σi(B)=σi(A)
接下来实际算法并不显式对 B⊤B 做 QR,而是在 B 上做隐式的 shifted QR,也就是 bidiagonal QR / Golub-Kahan SVD step
可以这样理解:
理论目标:求 B⊤B 的特征值。
实际操作:直接迭代 B,避免形成 B⊤B。
每一步都是
Bk+1=Uk⊤BkVk
因此奇异值不变;但双对角线上的非对角元素会逐渐被消掉
Bk⟶Σ
最后对角线上的非负数就是奇异值
总结
QR eigenvalue algorithm 的关键不是 QR 分解本身,而是 QR 分解之后把顺序反过来
Ak=QkRk,Ak+1=RkQk
每一步都等价于
Ak+1=Qk⊤AkQk
所以特征值保持不变
随着迭代进行,矩阵逐渐接近 Schur form;如果矩阵对称,则逐渐接近对角形式。于是对角线元素给出特征值
实际算法会先把矩阵化成 Hessenberg 形式,或者在对称情形下化成三对角形式,再做 shifted QR。Hessenberg 让每一步便宜,shift 让收敛更快,deflation 让已经收敛的特征值可以被分离出去
Krylov / Arnoldi 方法也会产生 Hessenberg 矩阵。区别在于:完整 QR 处理整个空间,目标是全部特征值;Krylov 方法只处理低维子空间,目标通常是大型稀疏矩阵的一部分重要特征值
而对于奇异值,理论上可以通过 A⊤A 的特征值求平方根;实际算法则更倾向于先做双对角化,再在双对角矩阵上做隐式 shifted QR,从而避免显式形成条件数更差的 A⊤A