Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

2.3 正交化与 QR 分解

本节属“补充篇 · 数值线性代数工具箱”:2.x 是补充篇内部编号,不是课堂第 2 章的节号。课堂第 2 章是线性方程组的解法。

2.1 说「标准正交基下求解退化成做内积」,2.2 说「投影与最小二乘的关键是列空间的正交结构」——两句话指向同一个技术需求:把一组线性无关的向量造成标准正交基。最有用的产物是 QR 分解 A=QRA=QR(m>nm\gt n 时 QQ 为列正交的长方阵,见 定义 2.1.3):最小二乘、特征值、SVD 共用一个稳定内核。本节给出四种正交化方法(经典与修正 Gram–Schmidt、Householder 反射、Givens 旋转),并用实测数据说明取舍标准。

2.3.1 Gram–Schmidt 正交化

直觉 · 一步一步「减去投影」

想造一组互相垂直的向量,手上却只有一组歪斜的 a1,…,an\boldsymbol{a}_1,\dots,\boldsymbol{a}_n。做法极其朴素:

  1. 拿第一个向量,拉成单位长,作为第一个坐标轴方向 q1\boldsymbol{q}_1;
  2. 拿第二个向量,减去它在 q1\boldsymbol{q}_1 上的投影(投影公式见 2.2.3),剩下的部分自然垂直于 q1\boldsymbol{q}_1;单位化,得 q2\boldsymbol{q}_2;
  3. 拿第三个向量,减去它在 q1\boldsymbol{q}_1 和 q2\boldsymbol{q}_2 上的投影,剩下的部分垂直于前两个;单位化,得 q3\boldsymbol{q}_3;
  4. 依此类推,直到第 nn 个向量。

每加一个新轴,就把新向量里「已经用过的方向」全部扣掉,剩下的必然是全新的垂直方向。这就是 Gram–Schmidt。

算法 2.3.1 · 经典 Gram–Schmidt(CGS)

输入 线性无关向量组 a1,…,an\boldsymbol{a}_1,\dots,\boldsymbol{a}_n(即 AA 的列,AA 列满秩)。 输出 标准正交组 q1,…,qn\boldsymbol{q}_1,\dots,\boldsymbol{q}_n 与上三角矩阵 RR,使 A=QRA=QR。

for j = 1, ..., n:
    v = a_j                                  # 从原始向量出发
    for i = 1, ..., j-1:
        r_ij = q_i^T a_j                      # 注意:用 q_i 内积【原始】a_j
        v = v - r_ij * q_i
    r_jj = ||v||_2
    q_j  = v / r_jj

复杂度: 每个 (i,j)(i,j) 组合要做一次内积(2m2m flops)和一次向量修正(2m2m flops),共约 2mn22mn^2 flops(m≥nm\ge n),与 QR 分解同量级。

定理 2.3.1(新增) · Gram–Schmidt 的正确性与 QR 分解

设 a1,…,an\boldsymbol{a}_1,\dots,\boldsymbol{a}_n 线性无关(A=[a1,…,an]∈Rm×nA=[\boldsymbol{a}_1,\dots,\boldsymbol{a}_n]\in\mathbb{R}^{m\times n},m≥nm\ge n),则由算法 2.3.1 得到的 {q1,…,qn}\{\boldsymbol{q}_1,\dots,\boldsymbol{q}_n\} 是标准正交组,且

A=QR,Q=[q1,…,qn]∈Rm×n (QTQ=In),R=[rij]∈Rn×n 上三角且对角元>0.(2.14)A=QR,\qquad Q=[\boldsymbol{q}_1,\dots,\boldsymbol{q}_n]\in\mathbb{R}^{m\times n}\ (Q^{\mathrm T}Q=I_n),\qquad R=[r_{ij}]\in\mathbb{R}^{n\times n}\ \text{上三角且对角元}\gt0 . \tag{2.14}

证明

归纳证明正交性。 假设 q1,…,qj−1\boldsymbol{q}_1,\dots,\boldsymbol{q}_{j-1} 已标准正交。算法中 v=aj−∑i<jrijqi\boldsymbol{v}=\boldsymbol{a}_j-\sum_{i\lt j}r_{ij}\boldsymbol{q}_i。对任意 k<jk\lt j,

qkTv=qkTaj−∑i<jrijqkTqi⏟δki=qkTaj−rkj=qkTaj−qkTaj=0.\boldsymbol{q}_k^{\mathrm T}\boldsymbol{v}=\boldsymbol{q}_k^{\mathrm T}\boldsymbol{a}_j-\sum_{i\lt j}r_{ij}\underbrace{\boldsymbol{q}_k^{\mathrm T}\boldsymbol{q}_i}_{\delta_{ki}}=\boldsymbol{q}_k^{\mathrm T}\boldsymbol{a}_j-r_{kj}=\boldsymbol{q}_k^{\mathrm T}\boldsymbol{a}_j-\boldsymbol{q}_k^{\mathrm T}\boldsymbol{a}_j=0 .

(CGS 里 rkj=qkTajr_{kj}=\boldsymbol{q}_k^{\mathrm T}\boldsymbol{a}_j 恰好就是 qk\boldsymbol{q}_k 在原向量上的系数,所以 qkTv=0\boldsymbol{q}_k^{\mathrm T}\boldsymbol{v}=0 在精确算术下精确成立。)所以新向量与所有旧轴都正交;且 v≠0\boldsymbol{v}\neq\boldsymbol{0}(否则 aj∈span⁡{q1,…,qj−1}=span⁡{a1,…,aj−1}\boldsymbol{a}_j\in\operatorname{span}\{\boldsymbol{q}_1,\dots,\boldsymbol{q}_{j-1}\}=\operatorname{span}\{\boldsymbol{a}_1,\dots,\boldsymbol{a}_{j-1}\},与线性无关矛盾),因此可以单位化。

A=QRA=QR: 由 v=rjjqj\boldsymbol{v}=r_{jj}\boldsymbol{q}_j 与 v\boldsymbol{v} 的定义反解,

aj=rjjqj+rijqi+⋯+rj−1,jqj−1,\boldsymbol{a}_j=r_{jj}\boldsymbol{q}_j+r_{ij}\boldsymbol{q}_i+\cdots+r_{j-1,j}\boldsymbol{q}_{j-1},

即 AA 的第 jj 列是 QQ 前 jj 列的线性组合,系数正好是 RR 的第 jj 列——这正是 A=QRA=QR。又 rjj=∥v∥2>0r_{jj}=\lVert\boldsymbol{v}\rVert_2\gt0。

几何含义: QQ 与 AA 逐列张成同一个子空间,即 C(Q)=C(A)C(Q)=C(A),但 QQ 的列标准正交;RR 记录的是「正交坐标 → 原坐标」的换算。由上面的证明还能看出更强的结构:

span⁡{q1,…,qk}=span⁡{a1,…,ak}(k=1,…,n).(2.15)\operatorname{span}\{\boldsymbol{q}_1,\dots,\boldsymbol{q}_k\}=\operatorname{span}\{\boldsymbol{a}_1,\dots,\boldsymbol{a}_k\}\qquad(k=1,\dots,n) . \tag{2.15}

(2.15)是 QR 分解区别于 SVD 的关键性质,也是 QR 迭代求特征值(原书第 3 章 3.3 节)的基础。

∎
例 2.3.1(新增) · 三向量的 Gram–Schmidt 手算

对

A=(110101011)A=\begin{pmatrix}1&amp;1&amp;0\\1&amp;0&amp;1\\0&amp;1&amp;1\end{pmatrix}

做 Gram–Schmidt,求出 QQ 与 RR(保留根号形式)。

解

第 1 列。 a1=(1,1,0)T\boldsymbol{a}_1=(1,1,0)^{\mathrm T},∥a1∥=2\lVert\boldsymbol{a}_1\rVert=\sqrt2,故

r11=2,q1=12(110).r_{11}=\sqrt2,\qquad \boldsymbol{q}_1=\frac{1}{\sqrt2}\begin{pmatrix}1\\1\\0\end{pmatrix}.

第 2 列。 r12=q1Ta2=1⋅1+1⋅0+0⋅12=12r_{12}=\boldsymbol{q}_1^{\mathrm T}\boldsymbol{a}_2=\dfrac{1\cdot1+1\cdot0+0\cdot1}{\sqrt2}=\dfrac{1}{\sqrt2}。

v=a2−r12q1=(101)−12(110)=(12−121).\boldsymbol{v}=\boldsymbol{a}_2-r_{12}\boldsymbol{q}_1=\begin{pmatrix}1\\0\\1\end{pmatrix}-\frac12\begin{pmatrix}1\\1\\0\end{pmatrix}=\begin{pmatrix}\frac12\\-\frac12\\1\end{pmatrix}.

∥v∥=14+14+1=62,r22=62,q2=16(1−12).\lVert\boldsymbol{v}\rVert=\sqrt{\tfrac14+\tfrac14+1}=\frac{\sqrt6}{2},\qquad r_{22}=\frac{\sqrt6}{2},\qquad \boldsymbol{q}_2=\frac{1}{\sqrt6}\begin{pmatrix}1\\-1\\2\end{pmatrix}.

第 3 列。 r13=q1Ta3=0+1+02=12r_{13}=\boldsymbol{q}_1^{\mathrm T}\boldsymbol{a}_3=\dfrac{0+1+0}{\sqrt2}=\dfrac{1}{\sqrt2};r23=q2Ta3=16(0−1+2)=16r_{23}=\boldsymbol{q}_2^{\mathrm T}\boldsymbol{a}_3=\dfrac{1}{\sqrt6}(0-1+2)=\dfrac{1}{\sqrt6}。

v=a3−r13q1−r23q2=(011)−12(110)−16(1−12)=(−232323).\boldsymbol{v}=\boldsymbol{a}_3-r_{13}\boldsymbol{q}_1-r_{23}\boldsymbol{q}_2 =\begin{pmatrix}0\\1\\1\end{pmatrix}-\frac12\begin{pmatrix}1\\1\\0\end{pmatrix}-\frac16\begin{pmatrix}1\\-1\\2\end{pmatrix} =\begin{pmatrix}-\frac23\\\frac23\\\frac23\end{pmatrix}.

∥v∥=23,r33=23,q3=32⋅23(−111)=13(−111).\lVert\boldsymbol{v}\rVert=\frac{2}{\sqrt3},\qquad r_{33}=\frac{2}{\sqrt3},\qquad \boldsymbol{q}_3=\frac{\sqrt3}{2}\cdot\frac23\begin{pmatrix}-1\\1\\1\end{pmatrix}=\frac{1}{\sqrt3}\begin{pmatrix}-1\\1\\1\end{pmatrix}.

结果:

Q=(1216−1312−161302613),R=(21212062160023).Q=\begin{pmatrix}\frac{1}{\sqrt2}&amp;\frac{1}{\sqrt6}&amp;-\frac{1}{\sqrt3}\\[2pt]\frac{1}{\sqrt2}&amp;-\frac{1}{\sqrt6}&amp;\frac{1}{\sqrt3}\\[2pt]0&amp;\frac{2}{\sqrt6}&amp;\frac{1}{\sqrt3}\end{pmatrix},\qquad R=\begin{pmatrix}\sqrt2&amp;\frac{1}{\sqrt2}&amp;\frac{1}{\sqrt2}\\[2pt]0&amp;\frac{\sqrt6}{2}&amp;\frac{1}{\sqrt6}\\[2pt]0&amp;0&amp;\frac{2}{\sqrt3}\end{pmatrix}.

核对: q1Tq2=1−1+012=0\boldsymbol{q}_1^{\mathrm T}\boldsymbol{q}_2=\frac{1-1+0}{\sqrt{12}}=0 ✓;q1Tq3=−1+1+06=0\boldsymbol{q}_1^{\mathrm T}\boldsymbol{q}_3=\frac{-1+1+0}{\sqrt6}=0 ✓;q2Tq3=−1−1+218=0\boldsymbol{q}_2^{\mathrm T}\boldsymbol{q}_3=\frac{-1-1+2}{\sqrt{18}}=0 ✓;三个范数均为 11 ✓;QRQR 能复原 AA ✓。

注意 RR 的对角元都为正——这是 定理 2.3.2 唯一性条款的来源。

手算口诀: 每一列先算它与已有各轴的内积(即 rijr_{ij}),逐个扣掉;剩余向量的长度就是 rjjr_{jj}。全程只需要「内积」和「减法」。

∎

2.3.2 QR 分解的存在唯一性

定理 2.3.2(新增) · QR 分解的存在与唯一性

存在性: 设 A∈Rm×nA\in\mathbb{R}^{m\times n}(m≥nm\ge n)列满秩,则存在 Q∈Rm×nQ\in\mathbb{R}^{m\times n} 列正交(QTQ=InQ^{\mathrm T}Q=I_n)与对角元为正的上三角 R∈Rn×nR\in\mathbb{R}^{n\times n},使 A=QRA=QR。(由 定理 2.3.1 直接得到。)

唯一性: 在「RR 的对角元全为正」的规范化下,这样的分解唯一。

全 QR(full QR): 若把 QQ 补全为 mm 阶正交方阵 Qˉ=[Q, Q⊥]\bar Q=[Q,\ Q_\perp](Q⊥Q_\perp 的列是 C(A)⊥=N(AT)C(A)^{\perp}=N(A^{\mathrm T}) 的标准正交基,见 2.2.1),则

A=QˉRˉ,Rˉ=(RO)∈Rm×n,A=\bar Q\bar R,\qquad \bar R=\begin{pmatrix}R\\O\end{pmatrix}\in\mathbb{R}^{m\times n},

其中 Q⊥Q_\perp 的列在乘积中不起作用,对应的系数是零块。

证明(唯一性)

设有两种分解 A=Q1R1=Q2R2A=Q_1R_1=Q_2R_2,Q1TQ1=Q2TQ2=IQ_1^{\mathrm T}Q_1=Q_2^{\mathrm T}Q_2=I,R1,R2R_1,R_2 上三角且对角元为正。由 Q1Q_1 列满秩,Q2TQ1Q_2^{\mathrm T}Q_1 是 n×nn\times n 可逆阵,且

Q2TQ1=R2R1−1=:S.Q_2^{\mathrm T}Q_1=R_2R_1^{-1}=:S .

等号左边列正交、右边上三角(上三角阵的逆仍是上三角,乘积也是上三角),所以 SS 是上三角阵。又由 Q1=Q2SQ_1=Q_2S 得

I=Q1TQ1=STQ2TQ2S=STS,I=Q_1^{\mathrm T}Q_1=S^{\mathrm T}Q_2^{\mathrm T}Q_2S=S^{\mathrm T}S,

故 SS 也是正交矩阵。上三角且正交的矩阵必为对角阵,对角元为 ±1\pm1:正交性要求 SS 的各列是单位向量且两两正交;看 SS 的第 1 列,它的第 2,…,n2,\dots,n 个分量为零,于是只剩 s11=±1s_{11}=\pm1;归纳地看第 kk 列,它的第 k+1,…,nk+1,\dots,n 个分量为零,又要与前 k−1k-1 列正交(那些列都只有第 ii 个分量非零),于是也只剩 skk=±1s_{kk}=\pm1。

最后由 S=R2R1−1S=R_2R_1^{-1} 得 sii=rii(2)/rii(1)>0s_{ii}=r_{ii}^{(2)}/r_{ii}^{(1)}\gt0(对角元都为正),结合 ∣sii∣=1\lvert s_{ii}\rvert=1 得 sii=1s_{ii}=1。故 S=IS=I,于是 Q1=Q2Q_1=Q_2、R1=R2R_1=R_2。

∎
秩亏时怎么办

若 AA 不满秩,Gram–Schmidt 会在某一步得到 v=0\boldsymbol{v}=\boldsymbol{0}(rjj=0r_{jj}=0):分解仍然存在,但不再唯一(唯一性证明中断在「R1R_1 可逆」处)。实用做法是列主元 QR(column-pivoted QR):每一步把剩余部分范数最大的列换到前面,得到

AP=QR,∣r11∣≥∣r22∣≥⋯≥∣rnn∣,AP=QR,\qquad \lvert r_{11}\rvert\ge\lvert r_{22}\rvert\ge\cdots\ge\lvert r_{nn}\rvert ,

这样得到的 ∣rkk∣\lvert r_{kk}\rvert 还能给出秩的估计:它相对 ∣r11∣\lvert r_{11}\rvert 骤降的位置,就是数值秩的候选。这正是 LAPACK 的 geqp3 与 MATLAB qr(A,0) 走的路径。与 SVD 的对比见 2.6.5。

2.3.3 经典 Gram–Schmidt 的致命缺陷:修正版

算法 2.3.1(CGS)在精确算术下完美无缺,在浮点下却有一个严重缺陷:它看起来很好,实际很差——正是 2.1 提到的「静默失效」的第二个实例。

直觉 · 差别只有一个「时态」

CGS 与修正 Gram–Schmidt(MGS)的代码只差一行:算 rijr_{ij} 时,CGS 用原始的 aj\boldsymbol{a}_j,MGS 用被前几轮修正过的 qj\boldsymbol{q}_j 当前值。

CGS:rij=qiTajMGS:rij=qiTv  (v 是当前值)\text{CGS:}\quad r_{ij}=\boldsymbol{q}_i^{\mathrm T}\boldsymbol{a}_j\qquad\qquad \text{MGS:}\quad r_{ij}=\boldsymbol{q}_i^{\mathrm T}\boldsymbol{v}\ \ (\boldsymbol{v}\ \text{是当前值})

精确算术下两者数学等价(内积值逐次相同)。但在浮点下,MGS 的每次内积都作用在「已经扣掉旧分量」的向量上,误差不会被后续步骤反复引用;CGS 恰好相反:每个 qj\boldsymbol{q}_j 携带的舍入误差都会被后面所有列的修正一遍遍引用,并在那些列上累积出一个 cond(A)\mathrm{cond}(A) 的额外因子。一行之差,稳定性量级相差一个 cond\mathrm{cond}。

算法 2.3.2 · 修正 Gram–Schmidt(MGS)
for j = 1, ..., n:
    v = a_j                                  # 从原始向量出发
    for i = 1, ..., j-1:
        r_ij = q_i^T v                        # 注意:用 q_i 内积【当前】v
        v = v - r_ij * q_i                    # v 被就地更新
    r_jj = ||v||_2
    q_j  = v / r_jj

与 CGS 的唯一差别是:rijr_{ij} 用当前的 v\boldsymbol{v}(即 qj\boldsymbol{q}_j 的当前值),而不是原始的 aj\boldsymbol{a}_j。精确算术下两者给出的 Q,RQ,R 完全相同;浮点下 MGS 的正交误差小得多。

代价: 两者 flops 几乎相同(MGS 略多),但 MGS 的访存模式不如 CGS 适合向量化(CGS 的内积可以一次性对所有列批量做)。历史上因此出现过「CGS + 再正交化」方案:做两遍 CGS 就能达到 MGS 的量级。现代库则直接用 Householder。

实测对照 · 正交性损失(本章运行数据)

对 n×nn\times n Vandermonde 矩阵 A=[xi j−1]A=[x_i^{\,j-1}](xix_i 均匀取自 [0.1,1][0.1,1],cond2\mathrm{cond}_2 随 nn 快速增大)分别用三种方法做 QR 分解,报告正交性损失 ∥QTQ−I∥2\lVert Q^{\mathrm T}Q-I\rVert_2:

nn cond2(A)\mathrm{cond}_2(A) CGS MGS Householder
6 1.02×1041.02\times10^{4} 8.8×10−108.8\times10^{-10} 1.5×10−131.5\times10^{-13} 1.2×10−151.2\times10^{-15}
8 7.40×1057.40\times10^{5} 2.5×10−52.5\times10^{-5} 2.3×10−112.3\times10^{-11} 1.3×10−151.3\times10^{-15}
10 5.60×1075.60\times10^{7} 1.19\mathbf{1.19} 8.1×10−108.1\times10^{-10} 2.5×10−152.5\times10^{-15}
12 4.34×1094.34\times10^{9} 2.46\mathbf{2.46} 1.2×10−71.2\times10^{-7} 2.1×10−152.1\times10^{-15}
14 3.42×10113.42\times10^{11} 4.48\mathbf{4.48} 4.7×10−64.7\times10^{-6} 2.2×10−152.2\times10^{-15}
16 2.73×10132.73\times10^{13} 6.55\mathbf{6.55} 4.7×10−44.7\times10^{-4} 3.0×10−153.0\times10^{-15}

三点结论:

  1. Householder 永远 ∼u\sim u(10−1510^{-15}):与 cond(A)\mathrm{cond}(A) 完全无关。这是「每一步都用正交变换」的回报。
  2. MGS 按 cond(A)⋅u\mathrm{cond}(A)\cdot u 增长:n=14n=14 时 cond⋅u=3.8×10−5\mathrm{cond}\cdot u=3.8\times10^{-5},实测 4.7×10−64.7\times10^{-6};n=16n=16 时 3.0×10−33.0\times10^{-3} 对 4.7×10−44.7\times10^{-4}——同量级 ✓。
  3. CGS 按 cond2(A)⋅u\mathrm{cond}^2(A)\cdot u 增长,随后饱和:n=10n=10 时 cond2u=3.5×10−1\mathrm{cond}^2u=3.5\times10^{-1}、实测已到 1.21.2;n≥12n\ge12 时 cond2u≫1\mathrm{cond}^2u\gg1,实测停在 O(1)∼O(10)O(1)\sim O(10)——正交性完全丧失(∥QTQ−I∥2\lVert Q^{\mathrm T}Q-I\rVert_2 的平凡上界是 n+1n+1,n=16n=16 时为 1717)。

分界线: cond(A)2u≳1\mathrm{cond}(A)^2u\gtrsim1,即 cond(A)≳u−1/2≈108\mathrm{cond}(A)\gtrsim u^{-1/2}\approx10^{8}(双精度)。超过它,CGS 彻底失效;MGS 还能撑到 cond≈u−1≈1016\mathrm{cond}\approx u^{-1}\approx10^{16}。结论:要用 Gram–Schmidt 就必须用 MGS;要最好的正交性,用 Householder。

例 2.3.2(新增) · 亲手看见 CGS 失效(数值实验)

用 Python 复现上面这张表,并回答:为什么 CGS 的 ∥QTQ−I∥\lVert Q^{\mathrm T}Q-I\rVert 会「饱和」在 O(1)O(1),而 MGS 不会?

解
import numpy as np
u = np.finfo(float).eps / 2      # 单位舍入误差 ≈ 1.11e-16
def cgs(A):                      # 经典:r_ij 用【原始】列
    m, n = A.shape; Q = A.astype(float).copy(); R = np.zeros((n, n))
    for j in range(n):
        for i in range(j):
            R[i, j] = Q[:, i] @ A[:, j]
            Q[:, j] -= R[i, j] * Q[:, i]
        R[j, j] = np.linalg.norm(Q[:, j]); Q[:, j] /= R[j, j]
    return Q, R
def mgs(A):                      # 修正:r_ij 用【当前】列
    m, n = A.shape; Q = A.astype(float).copy(); R = np.zeros((n, n))
    for j in range(n):
        for i in range(j):
            R[i, j] = Q[:, i] @ Q[:, j]
            Q[:, j] -= R[i, j] * Q[:, i]
        R[j, j] = np.linalg.norm(Q[:, j]); Q[:, j] /= R[j, j]
    return Q, R
print(f"{'n':>3} {'cond':>10} {'CGS':>11} {'MGS':>11} {'cond*u':>10} {'cond^2*u':>10}")
for n in [6, 8, 10, 12, 14, 16]:
    x = np.linspace(0.1, 1.0, n); A = np.vander(x, n, increasing=True)
    c = np.linalg.cond(A)
    f = lambda Q: np.linalg.norm(Q.T @ Q - np.eye(n))
    print(f"{n:3d} {c:10.2e} {f(cgs(A)[0]):11.2e} {f(mgs(A)[0]):11.2e} {c*u:10.2e} {c*c*u:10.2e}")
  n       cond         CGS         MGS     cond*u   cond^2*u
  6   1.02e+04    8.78e-10    1.47e-13    1.1e-12    1.2e-08
  8   7.40e+05    2.51e-05    2.28e-11    8.2e-11    6.1e-05
 10   5.60e+07    1.19e+00    8.11e-10    6.2e-09    3.5e-01
 12   4.35e+09    2.47e+00    1.24e-07    4.8e-07    2.1e+03
 14   3.42e+11    4.48e+00    4.70e-06    3.8e-05    1.3e+07
 16   2.73e+13    6.55e+00    4.70e-04    3.0e-03    8.3e+10

为什么 CGS 饱和而 MGS 不饱和?

(i)误差的「引用结构」不同。 CGS 的系数 rijr_{ij} 用原始 aj\boldsymbol{a}_j 计算,而 aj\boldsymbol{a}_j 在第 jj 步之前从未被修正过;于是 qj\boldsymbol{q}_j 一旦带上舍入误差,这个误差就会被后来所有更大下标 j′j&#x27; 的系数计算反复引用,按 cond\mathrm{cond} 逐层累积。而 MGS 每一步用的都是已经扣掉旧分量的当前向量,误差只被引用一次。

(ii)「饱和」只是平凡的几何效应,不代表安全。 ∥QTQ−I∥2\lVert Q^{\mathrm T}Q-I\rVert_2 的最大可能值是 ∥QTQ∥2+1≤∥Q∥22+1\lVert Q^{\mathrm T}Q\rVert_2+1\le\lVert Q\rVert_2^2+1。当 CGS 算出的 Q^\hat Q 已经几乎不正交(各列趋于平行)时,∥Q^∥2\lVert\hat Q\rVert_2 增长到 n\sqrt n 量级,这个指标就只能停在 O(n)O(n)——错到顶了,再坏也坏不下去。

n=10n=10 时理论值 cond2u=0.35\mathrm{cond}^2u=0.35 尚小于 11,实测 1.191.19 已饱和;n≥12n\ge12 时理论值远大于 11,实测停在 2.5∼6.62.5\sim6.6。所以「不再增长」恰恰是最坏的情形。

验收标准: 输出应与上表同量级(逐位因平台的 BLAS 实现而异);把 xx 换成更病态的分布(如几何分布 xi=0.5 i−1x_i=0.5^{\,i-1}),观察 cond\mathrm{cond} 与表中 CGS、MGS 两列误差是否同步增大。

∎

2.3.4 Householder 反射

MGS 补上了 CGS 的漏洞,误差却仍按 cond⋅u\mathrm{cond}\cdot u 增长。要彻底摆脱条件数,就得让每一步都是正交变换——正交变换不放大误差(定理 2.1.6)。Householder 反射是这种做法最简洁的实现。

直觉 · 用一面镜子把向量「拍」到坐标轴上

给你 x∈Rk\boldsymbol{x}\in\mathbb{R}^k,想把它变成 ±∥x∥2e1\pm\lVert\boldsymbol{x}\rVert_2\boldsymbol{e}_1(除第一个分量外全部清零)。怎么办?

找一面镜子。 镜像保长度,所以 x\boldsymbol{x} 只能映成同样长度的 ±∥x∥e1\pm\lVert\boldsymbol{x}\rVert\boldsymbol{e}_1。镜面的法线应沿着「x\boldsymbol{x} 与它的像的中点方向」——因为入射向量与出射向量关于镜面对称。Householder 反射就是这面镜子:

H=I−2vvTvTv.H=I-2\frac{\boldsymbol{v}\boldsymbol{v}^{\mathrm T}}{\boldsymbol{v}^{\mathrm T}\boldsymbol{v}}.

HH 对称、正交(HTH=IH^{\mathrm T}H=I)、且 H2=IH^2=I(照两次镜子回到原处),det⁡H=−1\det H=-1。一次矩阵乘法,就能消掉一整列的对角线以下元素。

定义 2.3.1 · Householder 变换

设 v∈Rk\boldsymbol{v}\in\mathbb{R}^k、v≠0\boldsymbol{v}\neq\boldsymbol{0},称

H=I−2vTvvvT∈Rk×k(2.16)H=I-\frac{2}{\boldsymbol{v}^{\mathrm T}\boldsymbol{v}}\boldsymbol{v}\boldsymbol{v}^{\mathrm T}\in\mathbb{R}^{k\times k} \tag{2.16}

为 Householder 变换(或初等反射矩阵),v\boldsymbol{v} 为反射向量。

定理 2.3.3(新增) · Householder 变换的性质

HH 由(2.16)定义,则

  1. 对称: HT=HH^{\mathrm T}=H;
  2. 正交: HTH=IH^{\mathrm T}H=I,故 H−1=HH^{-1}=H、H2=IH^2=I;
  3. 反射几何: 对任意 x\boldsymbol{x},HxH\boldsymbol{x} 是 x\boldsymbol{x} 关于超平面 v⊥={y:vTy=0}\boldsymbol{v}^{\perp}=\{\boldsymbol{y}:\boldsymbol{v}^{\mathrm T}\boldsymbol{y}=0\} 的镜像;特别地 Hv=−vH\boldsymbol{v}=-\boldsymbol{v},而 v⊥\boldsymbol{v}^{\perp} 上的向量不动;
  4. 行列式: det⁡H=−1\det H=-1;
  5. 特征值: −1-1(一重,特征向量 v\boldsymbol{v})与 11(k−1k-1 重,特征空间 v⊥\boldsymbol{v}^{\perp})。
证明

记 β=2/(vTv)\beta=2/(\boldsymbol{v}^{\mathrm T}\boldsymbol{v}),H=I−βvvTH=I-\beta\boldsymbol{v}\boldsymbol{v}^{\mathrm T}。

1: (vvT)T=vvT(\boldsymbol{v}\boldsymbol{v}^{\mathrm T})^{\mathrm T}=\boldsymbol{v}\boldsymbol{v}^{\mathrm T},故 HT=HH^{\mathrm T}=H。

2: 用 HT=HH^{\mathrm T}=H, HTH=H2=I−2βvvT+β2v(vTv)vT=I−2βvvT+β2⋅2βvvT=I.H^{\mathrm T}H=H^2=I-2\beta\boldsymbol{v}\boldsymbol{v}^{\mathrm T}+\beta^2\boldsymbol{v}(\boldsymbol{v}^{\mathrm T}\boldsymbol{v})\boldsymbol{v}^{\mathrm T} =I-2\beta\boldsymbol{v}\boldsymbol{v}^{\mathrm T}+\beta^2\cdot\frac{2}{\beta}\boldsymbol{v}\boldsymbol{v}^{\mathrm T}=I .

3: 对任意 x\boldsymbol{x},分解 x=x∥+x⊥\boldsymbol{x}=\boldsymbol{x}_{\parallel}+\boldsymbol{x}_{\perp},其中 x∥=vTxvTvv\boldsymbol{x}_{\parallel}=\frac{\boldsymbol{v}^{\mathrm T}\boldsymbol{x}}{\boldsymbol{v}^{\mathrm T}\boldsymbol{v}}\boldsymbol{v}、x⊥⊥v\boldsymbol{x}_{\perp}\perp\boldsymbol{v}。则 Hx=x−2vTxvTvv=x−2x∥=−x∥+x⊥,H\boldsymbol{x}=\boldsymbol{x}-\frac{2\boldsymbol{v}^{\mathrm T}\boldsymbol{x}}{\boldsymbol{v}^{\mathrm T}\boldsymbol{v}}\boldsymbol{v}=\boldsymbol{x}-2\boldsymbol{x}_{\parallel}=-\boldsymbol{x}_{\parallel}+\boldsymbol{x}_{\perp}, 即 v\boldsymbol{v} 方向翻转、v⊥\boldsymbol{v}^{\perp} 方向不动——正是镜像。

4、5: 由 3,Hv=−vH\boldsymbol{v}=-\boldsymbol{v};u⊥v⇒Hu=u\boldsymbol{u}\perp\boldsymbol{v}\Rightarrow H\boldsymbol{u}=\boldsymbol{u},而 dim⁡v⊥=k−1\dim\boldsymbol{v}^{\perp}=k-1。故特征值为 −1-1(一重)与 11(k−1k-1 重),det⁡H=(−1)⋅1k−1=−1\det H=(-1)\cdot1^{k-1}=-1。

∎
算法 2.3.3 · 用一个 Householder 变换消去一列的对角线以下元素

给定 x∈Rk\boldsymbol{x}\in\mathbb{R}^k(k≥2k\ge2,x≠0\boldsymbol{x}\neq\boldsymbol{0}),构造 HH 使 Hx=αe1H\boldsymbol{x}=\alpha\boldsymbol{e}_1。

目标只能取 α=±∥x∥2\alpha=\pm\lVert\boldsymbol{x}\rVert_2(保长度)。取

α=−sgn⁡(x1)∥x∥2(规定 x1=0 时 sgn⁡(x1)=1),\alpha=-\operatorname{sgn}(x_1)\lVert\boldsymbol{x}\rVert_2\qquad(\text{规定}\ x_1=0\ \text{时}\ \operatorname{sgn}(x_1)=1),

v=x−αe1=x+sgn⁡(x1)∥x∥2e1,\boldsymbol{v}=\boldsymbol{x}-\alpha\boldsymbol{e}_1=\boldsymbol{x}+\operatorname{sgn}(x_1)\lVert\boldsymbol{x}\rVert_2\boldsymbol{e}_1 ,

则 H=I−2vvT/(vTv)H=I-2\boldsymbol{v}\boldsymbol{v}^{\mathrm T}/(\boldsymbol{v}^{\mathrm T}\boldsymbol{v}) 满足 Hx=αe1H\boldsymbol{x}=\alpha\boldsymbol{e}_1。

为什么这样取符号? 若取 α=+∥x∥\alpha=+\lVert\boldsymbol{x}\rVert,当 x1>0x_1\gt0 时 v\boldsymbol{v} 的首分量就是 x1−∥x∥x_1-\lVert\boldsymbol{x}\rVert,这是两个相近数相减(1.2.4 原则 (3))。反过来取符号后,首分量变成 x1+sgn⁡(x1)∥x∥x_1+\operatorname{sgn}(x_1)\lVert\boldsymbol{x}\rVert,是相加,永远不损失有效数字。这是数值分析里反复出现的符号选择技巧:能用加就不用减。

例 2.3.3(新增) · 手算一个 Householder 反射

对 x=(3,4)T\boldsymbol{x}=(3,4)^{\mathrm T} 构造 Householder 矩阵使 Hx=αe1H\boldsymbol{x}=\alpha\boldsymbol{e}_1。

解

∥x∥2=9+16=5\lVert\boldsymbol{x}\rVert_2=\sqrt{9+16}=5,x1=3>0x_1=3\gt0,故 α=−5\alpha=-5。

v=x−αe1=(34)−(−50)=(84).\boldsymbol{v}=\boldsymbol{x}-\alpha\boldsymbol{e}_1=\begin{pmatrix}3\\4\end{pmatrix}-\begin{pmatrix}-5\\0\end{pmatrix}=\begin{pmatrix}8\\4\end{pmatrix}.

vTv=64+16=80,H=I−280(64323216)=(1001)−(1.60.80.80.4)=(−0.6−0.8−0.80.6).\boldsymbol{v}^{\mathrm T}\boldsymbol{v}=64+16=80,\qquad H=I-\frac{2}{80}\begin{pmatrix}64&amp;32\\32&amp;16\end{pmatrix}=\begin{pmatrix}1&amp;0\\0&amp;1\end{pmatrix}-\begin{pmatrix}1.6&amp;0.8\\0.8&amp;0.4\end{pmatrix}=\begin{pmatrix}-0.6&amp;-0.8\\-0.8&amp;0.6\end{pmatrix}.

验证: Hx=(−1.8−3.2−2.4+2.4)=(−50)=−5e1H\boldsymbol{x}=\begin{pmatrix}-1.8-3.2\\-2.4+2.4\end{pmatrix}=\begin{pmatrix}-5\\0\end{pmatrix}=-5\boldsymbol{e}_1 ✓。

验证性质: HT=HH^{\mathrm T}=H ✓;H2=(0.36+0.640.48−0.480.48−0.480.64+0.36)=IH^2=\begin{pmatrix}0.36+0.64&amp;0.48-0.48\\0.48-0.48&amp;0.64+0.36\end{pmatrix}=I ✓;det⁡H=(−0.6)(0.6)−(−0.8)(−0.8)=−0.36−0.64=−1\det H=(-0.6)(0.6)-(-0.8)(-0.8)=-0.36-0.64=-1 ✓。

几何: HH 是以 v=(8,4)T\boldsymbol{v}=(8,4)^{\mathrm T}(斜率 1/21/2)为法线的镜面反射,把 (3,4)T(3,4)^{\mathrm T} 映成 (−5,0)T(-5,0)^{\mathrm T}——长度不变,方向关于镜面对称。

规范化形式: 令 u=v/∥v∥=(2/5, 1/5)T\boldsymbol{u}=\boldsymbol{v}/\lVert\boldsymbol{v}\rVert=(2/\sqrt5,\ 1/\sqrt5)^{\mathrm T},则 H=I−2uuT=(1−8/5−4/5−4/51−2/5)H=I-2\boldsymbol{u}\boldsymbol{u}^{\mathrm T}=\begin{pmatrix}1-8/5&amp;-4/5\\-4/5&amp;1-2/5\end{pmatrix},与上面的结果相同 ✓。代码里用规范化形式更稳(避免 vTv\boldsymbol{v}^{\mathrm T}\boldsymbol{v} 上溢 / 下溢)。

∎
算法 2.3.4 · 用 Householder 做 QR 分解

对 A∈Rm×nA\in\mathbb{R}^{m\times n}(m≥nm\ge n),逐列消元:

R = copy(A);  Q = I_m
for k = 1, ..., n:
    x = R[k:m, k]                       # 当前列从对角线开始的片段
    if ||x|| == 0: continue
    alpha = -sign(x_1) * ||x||_2
    v = x - alpha * e_1
    v = v / ||v||_2                     # 规范化,避免溢出
    R[k:m, k:n] = R[k:m, k:n] - 2*v*(v' * R[k:m, k:n])   # 左乘 H_k
    Q[:, k:m]   = Q[:, k:m]   - 2*(Q[:, k:m]*v)*v'       # 累积 Q = H_1 H_2 ... H_n

第 kk 步把第 kk 列中第 k+1,…,mk+1,\dots,m 个元素全部化为零,同时不破坏已经产生的零。最终 RR 上三角,QQ 是 mm 阶正交阵(只保留前 nn 列,就得到「瘦」QR)。

复杂度: 约 2mn2−23n32mn^2-\frac23n^3 flops,与 Gram–Schmidt 同量级,但正交性总是 ∼u\sim u,与 cond(A)\mathrm{cond}(A) 无关。

例 2.3.4(新增) · 用 Householder 做一次 QR

对 A=(3142)A=\begin{pmatrix}3&amp;1\\4&amp;2\end{pmatrix} 做 Householder QR。

解

第 1 步。 x=(3,4)T\boldsymbol{x}=(3,4)^{\mathrm T},由例 2.3.3 已得

H1=(−0.6−0.8−0.80.6),H1A=(−1.8−3.2−0.6−1.6−2.4+2.4−0.8+1.2)=(−5−2.200.4).H_1=\begin{pmatrix}-0.6&amp;-0.8\\-0.8&amp;0.6\end{pmatrix},\qquad H_1A=\begin{pmatrix}-1.8-3.2&amp;-0.6-1.6\\-2.4+2.4&amp;-0.8+1.2\end{pmatrix}=\begin{pmatrix}-5&amp;-2.2\\0&amp;0.4\end{pmatrix}.

2×22\times2 情形第 1 步即完成:R=(−5−2.200.4)R=\begin{pmatrix}-5&amp;-2.2\\0&amp;0.4\end{pmatrix},Q=H1T=H1Q=H_1^{\mathrm T}=H_1。

验证 A=QRA=QR: H1R=(3−0.6(−2.2)−0.8(0.4)4−0.8(−2.2)+0.6(0.4))=(31.32−0.3241.76+0.24)=(3142)H_1R=\begin{pmatrix}3&amp;-0.6(-2.2)-0.8(0.4)\\4&amp;-0.8(-2.2)+0.6(0.4)\end{pmatrix}=\begin{pmatrix}3&amp;1.32-0.32\\4&amp;1.76+0.24\end{pmatrix}=\begin{pmatrix}3&amp;1\\4&amp;2\end{pmatrix} ✓。

注意 RR 的对角元是负的(r11=−5r_{11}=-5)。要化成「对角元为正」的规范形式,把 QQ 的第 1 列与 RR 的第 1 行同时变号(R→diag⁡(−1,1)RR\to\operatorname{diag}(-1,1)R、Q→Qdiag⁡(−1,1)Q\to Q\operatorname{diag}(-1,1),QRQR 不变)。工程上常直接允许负对角元(LAPACK 不保证正号),因为唯一性只在规范形式下成立。

∎

2.3.5 Givens 旋转

Householder 一次消掉一整列,效率高,但不局部:它要改动整个子块 Rk:m,k:nR_{k:m,k:n}。矩阵稀疏,或者只需消掉少数几个元素时,Householder 会把零结构破坏掉——这时该改用 Givens 旋转。

直觉 · 用一次平面旋转「点掉」一个元素

想把 (x1,x2)T(x_1,x_2)^{\mathrm T} 变成 (r,0)T(r,0)^{\mathrm T}?这正是 2.1 的平面旋转矩阵 RθR_\theta:取合适的 θ\theta 就能把它「转」到 x1x_1 轴上:

(cs−sc)(x1x2)=(r0),c=x1r, s=x2r, r=x12+x22 (c2+s2=1).\begin{pmatrix}c&amp;s\\-s&amp;c\end{pmatrix}\begin{pmatrix}x_1\\x_2\end{pmatrix}=\begin{pmatrix}r\\0\end{pmatrix},\qquad c=\frac{x_1}{r},\ s=\frac{x_2}{r},\ r=\sqrt{x_1^2+x_2^2}\ (c^2+s^2=1).

一次只消一个元素,而且想消哪个就消哪个——这正是稀疏矩阵需要的。Givens 是「外科手术」,Householder 是「大扫除」。

定义 2.3.2 · Givens 旋转

设 c2+s2=1c^2+s^2=1。在 Rk\mathbb{R}^k 中只作用在第 i,ji,j 两个坐标上的矩阵 G(i,j,c,s)G(i,j,c,s)(单位阵基础上把 (i,i),(i,j),(j,i),(j,j)(i,i),(i,j),(j,i),(j,j) 位置改为 c,s,−s,cc,s,-s,c)称为 Givens 旋转(或 Givens 变换)。它是正交矩阵,且 det⁡G=1\det G=1(保定向,与 Householder 相反)。

定理 2.3.4(新增) · Givens 旋转消元

给定 x=(x1,x2)T≠0\boldsymbol{x}=(x_1,x_2)^{\mathrm T}\neq\boldsymbol{0},取

r=x12+x22 (实际用 hypot),c=x1r,s=x2r,r=\sqrt{x_1^2+x_2^2}\ (\text{实际用}\ \texttt{hypot}),\qquad c=\frac{x_1}{r},\qquad s=\frac{x_2}{r},

则 (cs−sc)(x1x2)=(r0)\begin{pmatrix}c&amp;s\\-s&amp;c\end{pmatrix}\begin{pmatrix}x_1\\x_2\end{pmatrix}=\begin{pmatrix}r\\0\end{pmatrix}。若 x2=0x_2=0,取 c=1, s=0c=1,\ s=0。

证明

直接代入:cx1+sx2=x12+x22r=rcx_1+sx_2=\dfrac{x_1^2+x_2^2}{r}=r,−sx1+cx2=−x2x1+x1x2r=0-sx_1+cx_2=\dfrac{-x_2x_1+x_1x_2}{r}=0。正交性:c2+s2=(x12+x22)/r2=1c^2+s^2=(x_1^2+x_2^2)/r^2=1。

∎
算 rr 时不要写成 x12+x22\sqrt{x_1^2+x_2^2}

直接算 x12+x22x_1^2+x_2^2,当 x\boldsymbol{x} 的分量接近 1015410^{154} 时会上溢(超出 double 范围),接近 10−16010^{-160} 时会下溢成零。正确做法是用 hypot:

r=x12+x22 ⟶ r=hypot(x1,x2)(先按量级缩放再开方).r=\sqrt{x_1^2+x_2^2}\ \longrightarrow\ r=\texttt{hypot}(x_1,x_2)\quad(\text{先按量级缩放再开方}) .

Python 用 math.hypot / np.hypot,C 用 hypot(C99 标准)。同理:∥x∥2\lVert\boldsymbol{x}\rVert_2 在代码里用 np.linalg.norm(内部做缩放),不要手写 np.sqrt(x @ x)。 这是「浮点可表示范围有限」(1.2.5)带来的工程细节。

例 2.3.5(新增) · 手算一个 Givens 旋转

用 Givens 旋转把 A=(3443)A=\begin{pmatrix}3&amp;4\\4&amp;3\end{pmatrix} 化为上三角。

解

对第 1 列 (3,4)T(3,4)^{\mathrm T} 消元:r=5r=5,c=3/5=0.6c=3/5=0.6,s=4/5=0.8s=4/5=0.8。

G=(0.60.8−0.80.6),GA=(1.8+3.22.4+2.4−2.4+2.4−3.2+1.8)=(54.80−1.4).G=\begin{pmatrix}0.6&amp;0.8\\-0.8&amp;0.6\end{pmatrix},\qquad GA=\begin{pmatrix}1.8+3.2&amp;2.4+2.4\\-2.4+2.4&amp;-3.2+1.8\end{pmatrix}=\begin{pmatrix}5&amp;4.8\\0&amp;-1.4\end{pmatrix}.

2×22\times2 已上三角:R=(54.80−1.4)R=\begin{pmatrix}5&amp;4.8\\0&amp;-1.4\end{pmatrix},Q=GT=(0.6−0.80.80.6)Q=G^{\mathrm T}=\begin{pmatrix}0.6&amp;-0.8\\0.8&amp;0.6\end{pmatrix}。

验证 A=QRA=QR: QR=(0.6−0.80.80.6)(54.80−1.4)=(32.88+1.1243.84−0.84)=(3443)QR=\begin{pmatrix}0.6&amp;-0.8\\0.8&amp;0.6\end{pmatrix}\begin{pmatrix}5&amp;4.8\\0&amp;-1.4\end{pmatrix}=\begin{pmatrix}3&amp;2.88+1.12\\4&amp;3.84-0.84\end{pmatrix}=\begin{pmatrix}3&amp;4\\4&amp;3\end{pmatrix} ✓。

与 Householder 对比: 同一个矩阵,Householder 给出的 QQ 满足 det⁡Q=−1\det Q=-1(含反射),Givens 给出 det⁡Q=+1\det Q=+1(纯旋转)。两者都能完成 QR,选哪个取决于要消多少元素:本例 2×22\times2 只需一次旋转,成本相同;但若是 1000×10001000\times1000 的三对角矩阵,「只动两行」的局部性才是 Givens 的杀手锏。

∎
四种正交化方法的对比(本节结论)
方法 一次消多少 flops(m×nm\times n,m≥nm\ge n) ∥QTQ−I∥2\lVert Q^{\mathrm T}Q-I\rVert_2 适用场合
CGS 一列(逐步投影) 2mn22mn^2 cond2u\mathrm{cond}^2u(勿用于生产) 教学、理论推导
MGS 一列(逐步投影) 2mn22mn^2 cond u\mathrm{cond}\,u 需要显式 QQ、条件数温和
Householder 一整列(>1&gt;1 个元素) 2mn2−23n32mn^2-\frac23n^3 u\boldsymbol{u}(与 cond 无关) 稠密矩阵的默认选择
Givens 一个元素 约 6mn26mn^2(3 倍) uu(与 cond 无关) 稀疏 / 带状 / 局部修改 / 并行

口诀:稠密用 Householder,稀疏用 Givens;MGS 在条件数温和且需要 QQ 的显式列时可用;CGS 只用于教学。 LAPACK 的 geqrf(Householder)是 NumPy np.linalg.qr、MATLAB qr、SciPy 的共同默认路径。

课程预告 · QR 的另一个大用途

本节把 QR 当作「解最小二乘的稳定工具」。QR 还有一个更深刻的应用:QR 迭代求全部特征值(原书第 3 章 3.3 节)。核心思路正是(2.15)后面的观察——A=QR⇒A′=RQ=QTAQA=QR\Rightarrow A&#x27;=RQ=Q^{\mathrm T}AQ 与 AA 相似(特征值不变),反复迭代后 RR 的对角元趋于特征值。「QR 分解」与「QR 方法」是两件事,但后者完全建立在前者之上。

2.3.6 用 QR 解最小二乘:为什么比正态方程好

直觉 · 把「平方」消掉

正态方程 ATAx=ATbA^{\mathrm T}A\boldsymbol{x}=A^{\mathrm T}\boldsymbol{b} 的毛病出在 cond(ATA)=cond(A)2\mathrm{cond}(A^{\mathrm T}A)=\mathrm{cond}(A)^2(ATAA^{\mathrm T}A 的奇异值是 AA 的奇异值的平方,见 2.6.3):条件数一平方,有效数字就掉一半。

QR 的做法是代入 A=QRA=QR,利用正交不变性(定理 2.1.6):

∥Ax−b∥22=∥QRx−b∥22=∥Rx−QTb∥22,\lVert A\boldsymbol{x}-\boldsymbol{b}\rVert_2^2=\lVert QR\boldsymbol{x}-\boldsymbol{b}\rVert_2^2=\lVert R\boldsymbol{x}-Q^{\mathrm T}\boldsymbol{b}\rVert_2^2,

于是问题变成解一个上三角方程组,从头到尾都不形成 ATAA^{\mathrm T}A:条件数保持 cond(A)\mathrm{cond}(A),没有被平方。

定理 2.3.5(新增) · QR 解最小二乘与误差量级

设 A∈Rm×nA\in\mathbb{R}^{m\times n}(m≥nm\ge n)列满秩,取其全 QR 分解 A=Qˉ(RO)A=\bar Q\begin{pmatrix}R\\O\end{pmatrix}(Qˉ\bar Q 为 mm 阶正交,RR 为 nn 阶非奇异上三角)。把 QˉTb\bar Q^{\mathrm T}\boldsymbol{b} 分块为 (cd)\begin{pmatrix}\boldsymbol{c}\\ \boldsymbol{d}\end{pmatrix}(c∈Rn\boldsymbol{c}\in\mathbb{R}^n、d∈Rm−n\boldsymbol{d}\in\mathbb{R}^{m-n}),则

∥Ax−b∥22=∥Rx−c∥22+∥d∥22.\lVert A\boldsymbol{x}-\boldsymbol{b}\rVert_2^2=\lVert R\boldsymbol{x}-\boldsymbol{c}\rVert_2^2+\lVert\boldsymbol{d}\rVert_2^2 .

因此最小二乘解由上三角方程组 Rx^=cR\hat{\boldsymbol{x}}=\boldsymbol{c} 给出(回代,O(n2)O(n^2)),最小残差范数为 ∥d∥2\lVert\boldsymbol{d}\rVert_2。误差量级:

正态方程:∥x^−x∥∥x∥∼cond(A)2 u;QR:∥x^−x∥∥x∥∼cond(A) u.\text{正态方程:}\quad\frac{\lVert\hat{\boldsymbol{x}}-\boldsymbol{x}\rVert}{\lVert\boldsymbol{x}\rVert}\sim\mathrm{cond}(A)^2\,u;\qquad \text{QR:}\quad\frac{\lVert\hat{\boldsymbol{x}}-\boldsymbol{x}\rVert}{\lVert\boldsymbol{x}\rVert}\sim\mathrm{cond}(A)\,u .

证明

分解最小化问题: 由 定理 2.1.6(正交矩阵保 2-范数),

∥Ax−b∥2=∥QˉT(Ax−b)∥2=∥(RO)x−(cd)∥2=∥(Rx−c−d)∥2.\lVert A\boldsymbol{x}-\boldsymbol{b}\rVert_2=\lVert\bar Q^{\mathrm T}(A\boldsymbol{x}-\boldsymbol{b})\rVert_2=\left\lVert\begin{pmatrix}R\\O\end{pmatrix}\boldsymbol{x}-\begin{pmatrix}\boldsymbol{c}\\\boldsymbol{d}\end{pmatrix}\right\rVert_2=\left\lVert\begin{pmatrix}R\boldsymbol{x}-\boldsymbol{c}\\-\boldsymbol{d}\end{pmatrix}\right\rVert_2 .

取平方即得。第二项与 x\boldsymbol{x} 无关,故只能令第一项为零;RR 非奇异(AA 列满秩)故解唯一,最小值 ∥d∥22\lVert\boldsymbol{d}\rVert_2^2。

误差量级(要点): 正态方程显式形成并求解一个条件数为 cond(A)2\mathrm{cond}(A)^2 的问题,任何后向稳定的解法(如 Cholesky)只能保证相对误差 ∼cond(A)2u\sim\mathrm{cond}(A)^2u;QR 路径中所有变换都是正交的(定理 2.1.6:不放大误差),误差只经过 cond(R)=cond(A)\mathrm{cond}(R)=\mathrm{cond}(A) 一次。严格的后向误差分析见 Higham《Accuracy and Stability of Numerical Algorithms》§20.3–20.5。

∎
实测对照 · QR vs 正态方程(本章运行数据)

取 Vandermonde 设计矩阵与真解 c=1\boldsymbol{c}=\boldsymbol{1},构造相容右端 b=Ac\boldsymbol{b}=A\boldsymbol{c}(残差理论上为零),比较两种方法恢复 c\boldsymbol{c} 的最大分量误差:

mm nn cond(A)\mathrm{cond}(A) 正态方程误差 QR 误差
12 10 6.84×1066.84\times10^{6} 1.3×10−41.3\times10^{-4} 5.4×10−11\mathbf{5.4\times10^{-11}}
20 15 6.03×10106.03\times10^{10} 2.8×101\mathbf{2.8\times10^{1}}(完全失效) 2.2×10−6\mathbf{2.2\times10^{-6}}

第二行是最重要的一格: 条件数 6×10106\times10^{10} 时,正态方程解出的系数误差达到 2828——相比真值 11 毫无意义;QR 仍给出 10−610^{-6} 量级。理论预测: 正态方程 cond2u≈(6.03×1010)2×1.1×10−16≈4×105\mathrm{cond}^2u\approx(6.03\times10^{10})^2\times1.1\times10^{-16}\approx4\times10^{5}(实测 2828,误差被部分抵消但仍不可用);QR 为 cond⋅u≈6×10−6\mathrm{cond}\cdot u\approx6\times10^{-6},实测 2.2×10−62.2\times10^{-6} ✓。

结论:条件数超过约 108≈u−1/210^{8}\approx u^{-1/2} 时,必须放弃正态方程,改用 QR 或 SVD。 这是「公式最简的写法未必是最稳定的算法」(1.1.3)在矩阵层面的重演。

例 2.3.6(新增) · 用 QR 解一个最小二乘问题

用 QR 分解求下面方程组的最小二乘解:

(111001)(x1x2)=(211).\begin{pmatrix}1&amp;1\\1&amp;0\\0&amp;1\end{pmatrix}\begin{pmatrix}x_1\\x_2\end{pmatrix}=\begin{pmatrix}2\\1\\1\end{pmatrix}.

解

记 A=(111001)A=\begin{pmatrix}1&amp;1\\1&amp;0\\0&amp;1\end{pmatrix}、b=(2,1,1)T\boldsymbol{b}=(2,1,1)^{\mathrm T}。用 Householder 化 AA(数值结果,符号可能因实现而异):

Q=(−0.70710.4082−0.7071−0.408200.8165),R=(−1.4142−0.707101.2247),QTb=(−2.12131.2247).Q=\begin{pmatrix}-0.7071&amp;0.4082\\-0.7071&amp;-0.4082\\0&amp;0.8165\end{pmatrix},\qquad R=\begin{pmatrix}-1.4142&amp;-0.7071\\0&amp;1.2247\end{pmatrix},\qquad Q^{\mathrm T}\boldsymbol{b}=\begin{pmatrix}-2.1213\\1.2247\end{pmatrix}.

回代解 Rx^=QTbR\hat{\boldsymbol{x}}=Q^{\mathrm T}\boldsymbol{b}: 由第二行 1.2247x2=1.2247⇒x2=11.2247x_2=1.2247\Rightarrow x_2=1;由第一行 −1.4142x1−0.7071x2=−2.1213⇒x1=−2.1213+0.7071−1.4142=1-1.4142x_1-0.7071x_2=-2.1213\Rightarrow x_1=\dfrac{-2.1213+0.7071}{-1.4142}=1。

x^=(1,1)T.\hat{\boldsymbol{x}}=(1,1)^{\mathrm T}.

核对: Ax^=(1,1,0)T+(1,0,1)T=(2,1,1)T=bA\hat{\boldsymbol{x}}=(1,1,0)^{\mathrm T}+(1,0,1)^{\mathrm T}=(2,1,1)^{\mathrm T}=\boldsymbol{b}——残差为零,这说明 b∈C(A)\boldsymbol{b}\in C(A),最小二乘解恰好就是精确解。

换一个右端: 取 b=(1,1,1)T\boldsymbol{b}=(1,1,1)^{\mathrm T},此时 b∉C(A)\boldsymbol{b}\notin C(A)。QTb=(−1.4142, 0.8165)TQ^{\mathrm T}\boldsymbol{b}=(-1.4142,\ 0.8165)^{\mathrm T},解得 x2=0.6667x_2=0.6667、x1=0.6667x_1=0.6667,即 x^=(0.6667,0.6667)T=(23,23)T\hat{\boldsymbol{x}}=(0.6667,0.6667)^{\mathrm T}=\bigl(\tfrac23,\tfrac23\bigr)^{\mathrm T}(正态方程 (2112)x=(2,2)T\begin{pmatrix}2&amp;1\\1&amp;2\end{pmatrix}\boldsymbol{x}=(2,2)^{\mathrm T} 的解),残差 ∥Ax^−b∥2=0.5774=1/3\lVert A\hat{\boldsymbol{x}}-\boldsymbol{b}\rVert_2=0.5774=1/\sqrt3 ✓,且 ATr=0A^{\mathrm T}\boldsymbol{r}=\boldsymbol{0} 成立。

∎

2.3.7 小结与常见错误

本节公式速查
概念 公式 / 结论
CGS 系数 rij=qiTajr_{ij}=\boldsymbol{q}_i^{\mathrm T}\boldsymbol{a}_j(原始列)
MGS 系数 rij=qiTvr_{ij}=\boldsymbol{q}_i^{\mathrm T}\boldsymbol{v}(当前列)← 数值上必须用它
QR 分解 A=QRA=QR,QTQ=IQ^{\mathrm T}Q=I,RR 上三角;对角元为正时唯一
分层张成 span⁡{q1..qk}=span⁡{a1..ak}\operatorname{span}\{\boldsymbol{q}_1..\boldsymbol{q}_k\}=\operatorname{span}\{\boldsymbol{a}_1..\boldsymbol{a}_k\}
Householder H=I−2vvT/vTvH=I-2\boldsymbol{v}\boldsymbol{v}^{\mathrm T}/\boldsymbol{v}^{\mathrm T}\boldsymbol{v};HT=HH^{\mathrm T}=H,H2=IH^2=I,det⁡H=−1\det H=-1
消元向量 v=x+sgn⁡(x1)∥x∥2e1\boldsymbol{v}=\boldsymbol{x}+\operatorname{sgn}(x_1)\lVert\boldsymbol{x}\rVert_2\boldsymbol{e}_1,α=−sgn⁡(x1)∥x∥2\alpha=-\operatorname{sgn}(x_1)\lVert\boldsymbol{x}\rVert_2
Givens c=x1/rc=x_1/r,s=x2/rs=x_2/r,r=hypot(x1,x2)r=\texttt{hypot}(x_1,x_2);det⁡G=+1\det G=+1
正交性损失 CGS:cond2u\mathrm{cond}^2u;MGS:cond u\mathrm{cond}\,u;Householder / Givens:uu
复杂度 GS:2mn22mn^2;Householder:2mn2−23n32mn^2-\frac23n^3;Givens:约 6mn26mn^2
QR 最小二乘 Rx^=(QTb)1:nR\hat{\boldsymbol{x}}=(Q^{\mathrm T}\boldsymbol{b})_{1:n};∥r∥2=∥d∥2\lVert\boldsymbol{r}\rVert_2=\lVert\boldsymbol{d}\rVert_2
常见错误清单 · 自查七条
  1. 把经典 Gram–Schmidt 当生产代码。 条件数超过 10810^{8} 时,CGS 给出的 QQ 完全不正交(见 2.3.3 的表格),后续所有基于 QQ 的结论同时失效。代码里请用 Householder(np.linalg.qr),至少也要用 MGS。
  2. MGS 写成 CGS。 两者只差「内积用原始列还是当前列」,数学上等价,数值上差别巨大。写代码时必须逐列就地更新,不能先留一份原始备份再用备份算系数。
  3. Householder 消元向量取错符号。 若取 α=+∥x∥\alpha=+\lVert\boldsymbol{x}\rVert 且 x1>0x_1\gt0,v\boldsymbol{v} 的首分量 x1−∥x∥x_1-\lVert\boldsymbol{x}\rVert 是相近数相减,损失有效数字(1.2.4)。正确取 α=−sgn⁡(x1)∥x∥\alpha=-\operatorname{sgn}(x_1)\lVert\boldsymbol{x}\rVert,让首分量变成相加。
  4. 手写 x12+x22\sqrt{x_1^2+x_2^2} 算 Givens 的 rr。 会溢出 / 下溢;用 hypot。同理 ∥x∥2\lVert\boldsymbol{x}\rVert_2 用 np.linalg.norm,别手写 sqrt(x@x)。
  5. 以为 QR 分解唯一。 只有「RR 对角元为正」的规范形式才唯一;LAPACK 与 NumPy 允许负对角元,所以不同库给出的 Q,RQ,R 可以差若干列的符号。比较 Q,RQ,R 前先统一符号,或改为比较 QRQR 与 AA、QTQQ^{\mathrm T}Q 与 II。
  6. 用 QR 解最小二乘时把整个 Qˉ\bar Q 都算出来。 如果只要解,可以只存 Householder 向量(O(mn)O(mn) 内存)并直接作用在 b\boldsymbol{b} 上,不必形成 m×mm\times m 的 Qˉ\bar Q(O(m2)O(m^2) 内存)——这是大规模最小二乘的标准优化。
  7. 秩亏时仍用普通 QR 判断秩。 AA 秩亏或接近秩亏时,RR 的对角元只会出现「很小但不为零」的值,靠它判断秩并不可靠——请用列主元 QR(定理 2.3.2 后的注)或 SVD(2.6.5)。
课程预告 · 本节之后
  • 「cond\mathrm{cond} 平方」这个坑有多深?下节 2.4 把条件数讲成「能保住几位有效数字」的定量工具;
  • RR 的对角元为什么能判秩?2.6 用 SVD 给出更可靠、更几何的判据;
  • QR 迭代求特征值:原书第 3 章 3.3 节;列主元 QR:原书第 2 章 2.2.2 与 2.6.5。