QR 把矩阵拆成旋转与三角
矩阵的列通常是歪的:彼此不垂直,长度也各不相同。QR 把这些列干净地拆成两块。它先用格拉姆-施密特把列摆正,化成彼此垂直的单位向量。这就是 Q,一个不动长度也不动角度的纯旋转(或反射)。而摆正时削去的长度和重叠,全收进 R 里,奇妙的是 R 永远只有上三角被填满。A = QR,一个旋转加一个三角。这一行就是求解最小二乘最稳定的路,也是数值线性代数的主力。
用按钮一步步走。阶段0是 A 的两列 a1、a2,斜着、长度也不一样。阶段1用上一讲的格拉姆-施密特把它们摆正。把 a1 的方向缩到单位长就得到 q1;从 a2 中减去它在 q1 上的影子,把剩下的正交分量单位化就得到 q2。现在 q1 与 q2 恰好垂直,长度都为 1(点积显示为 0)。阶段2给出 R。因为 R = Qᵀ A,它自动是上三角,左下角的分量 r21 等于 0。A 是歪的列,Q 是摆正的标准正交列,R 是连接两者的小三角。这就是 A = QR。
Q 的两列是彼此垂直的单位向量,所以把 Q 作用到平面上,网格不会变形,只是整体刚性地旋转。拖动角度滑块。格子既不拉伸也不歪斜,正方形仍是正方形,因为长度和角度都被保住。按反射按钮,它像镜子一样翻转,但列依然标准正交,形状不变。这正是正交矩阵的定义:QᵀQ = I。看下方的 QᵀQ,在任何角度它都保持单位矩阵。这就是 Q 不过是旋转或反射的证据。
R 为什么永远只有上三角被填满?每个分量是 rij = qi · aj,也就是把第 j 个原始列投到第 i 个摆正方向上的影子长度。切换各格读出点积。关键在对角线以下的格子。r21 = q2 · a1,而 q2 正是从 a2 中去掉 a1 方向后剩下的分量,所以它恰好与 a1 垂直。垂直就意味着点积为 0,于是 r21 等于 0。一般地,靠后造出的方向 qi 绝不会进入靠前的列 aj(j < i),因为那一列已经被前面的方向完全表示了。所以对角线以下全为 0,R 是上三角。
这次反过来:把 R 抓在手里,重建 A。把 Q 固定为 20 度旋转,用滑块移动 R 的三个分量,A = QR 就实时重画。r11 决定第一列 a1 的长度,调大它,a1 就更长。r22 是第二个方向能伸多远,也就是正交分量的长度。r12 是剪切:第二列朝第一个方向倾斜多少。这三个数承担全部长度与倾斜,而 Q 只是把结果整体转 20 度。你能看到分工:R 管形状,Q 管方向。
现在到 QR 真正发挥作用的地方:最小二乘。在之前的投影那一讲里,最贴合数据的直线,就是让残差(竖直虚线)的平方和最小的那条线。移动斜率与截距滑块,把 SSE 缩小。课本通常说构造 AᵀA、解正规方程。可 AᵀA 对误差敏感,数值上常常不稳定。QR 跳过这一步。代入 A = QR,正规方程就缩成 R x = Qᵀ b,而 R 是三角的,回代一次即可完成。按下按钮跳到那个 QR 解,SSE 取最小。不构造 AᵀA 而更稳定地得到同一答案,这正是 QR 的用处。