法方程(normal equations)
到底要怎麼計算最小平方解?最直接的做法是把一個矩形系統變成一個方形系統。把過定的 A x = b 兩邊都左乘 A^T(A 的轉置),就得到 A^T A x = A^T b。這個方形的 n×n 系統——稱為法方程——其解正好就是最小平方的 x。這裡的「法」(normal)意指垂直:這組方程式編碼了「殘差垂直(正交)於行空間」這件事。
它從何而來?取殘差平方目標 ||A x - b||_2^2,用微積分求極小。它的梯度是 2 A^T (A x - b);令其為零得到 A^T (A x - b) = 0,也就是 A^T A x = A^T b。矩陣 A^T A 是 n×n、對稱的,且(當 A 行滿秩時)正定——因此你可以用喬列斯基分解便宜地解它。對於直線擬合,這就是統計課上可能見過的那一對方程式,關聯著 x_i、y_i、x_i^2 與 x_i y_i 的各種總和。
陷阱——而且是嚴重的陷阱——在於條件數。A^T A 的條件數是 A 條件數的「平方」:kappa(A^T A) = kappa(A)^2。所以若 A 哪怕只是輕微病態(譬如 kappa(A) ~ 10^8),建立 A^T A 就把它推到 ~10^16,逼近雙精度的極限,你可能會失去全部準確度。法方程快速、簡單,對良態問題沒問題,但對任何精細的問題,QR 或 SVD 途徑——它們從不建立 A^T A——更受青睞。知道何時這個便宜方法是安全的,才是真正的本事。
對 A 的各列為 (1,1)、(1,2)、(1,3) 且 b = (2,2,4)^T,矩陣 A^T A 的各列為 (3,6) 與 (6,14),且 A^T b = (8,18)^T。求解 2×2 系統 [各列 (3,6)、(6,14)] x = (8,18)^T 得到 x = (2/3, 1)^T——同樣是最佳擬合直線 y = 2/3 + x,如今由一個小小的 2×2 求解得出,而非矩形系統。
A^T A 既小又對稱——很方便——但它的條件數是 A 的平方。
對病態的 A 切勿建立 A^T A:它會把條件數平方,可能摧毀準確度。法方程方便,但並非預設就安全——有疑慮時就改用 QR 或 SVD。