上一篇把我們留在哪裡
你帶著一肚子抱怨來到這裡。為了把模型擬合到比未知數還多的資料上,你建立了一個超定系統 A x = b,並要找出讓殘差 ||A x - b||_2 最小的那個 x。上一篇把 法方程 A^T A x = A^T b 交給你,那是個乾淨的方陣系統,可以用 Cholesky 來解——但它同時帶來了壞消息:構造 A^T A 會把條件數平方。如果 A 的條件數是 10^4,那麼 A^T A 的條件數就約是 10^8,而透過「準確度 = 條件性 乘以 穩定性」,你在求解器都還沒開工之前,就已經悄悄丟掉了大約一半、約 16 位的雙精度位數。
很自然的問題是:這份損失究竟是本質性的,還是只是自找的?它是自找的。原始的最小平方問題,其條件數通常落在 A 附近,而不是 A 的平方;平方化是「方法」的人工產物,而不是「問題」的本質。本文要談的是通往同一個 x 的另一條路——它從不構造 A^T A、從不把任何東西平方,而且對如其所是的最小平方問題而言,可證明是 向後穩定 的。這個訣竅,一如數值線性代數中常見的那樣,就是正交性。
為什麼正交性能救場
回想本階稍早談過的幾何:最小平方解是 b 到 A 的行空間(column space)上的 正交投影,而殘差則垂直地戳出那個空間之外。正交方向之所以特別,背後有一個同時也是數值上的理由:正交變換 Q 保持長度,對每個向量 v 都有 ||Q v||_2 = ||v||_2。它只旋轉與反射,從不拉伸。所以若你拿這樣一個 Q 同時作用在 A x - b 的兩邊,你正在最小化的那個殘差範數絲毫不變——你只是換了一個旋轉過的相機角度在看同一個問題。
這就是整套策略。聰明地選一個旋轉,使得在新的視角下,最小化變得一眼就能讀出。因為旋轉不改變任何長度,它也就不改變任何條件數:它無法把問題變難或變易,只能把它變清楚。把這拿去和法方程那條路比一比,那條路用 A^T 來變換問題——而那個操作可是會大大改變長度、並把條件性平方的。先正交、其餘其次:這份直覺會在整門學問裡幫到你,從特徵值求解器一路到 SVD 本身。
QR:日常的主力
QR 分解 把又高又瘦的矩陣 A(列比行多)寫成 A = Q R,其中 Q 的各行互相正交且為單位長度,R 則是上三角的方陣。把它代入殘差,再用上正交部分保持長度的性質:最小化 ||A x - b||_2 就變成了最小化 ||R x - Q^T b||_2。但 R 是上三角的,所以這只是一個小小的三角系統 R x = Q^T b——用你自直接求解法那一階以來就一直在做的向後代入,立刻就能解出。整個過程從不構造 A^T A,而 R 的條件性與 A 相符,不是它的平方。
Least squares two ways for min || A x - b ||_2 :
normal equations : A^T A x = A^T b cond ~ cond(A)^2 (risky)
QR route : A = Q R cond ~ cond(A) (stable)
then solve R x = Q^T b by back substitution
why the residual norm is unchanged:
|| A x - b || = || Q(R x) - b || = || Q^T(Q R x - b) || = || R x - Q^T b ||
(Q^T preserves length, so the thing we minimize never changes)那麼分解本身又是怎麼算出來的?你在特徵值那一階見過 格拉姆-施密特正交化——把各行一個接一個地正交化——它確實會產生一個 QR 分解,但其素樸版本在浮點下會嚴重失去正交性,不建議用於正經的工作(修正版格拉姆-施密特較佳,但仍屬二流)。專業的方法是用 豪斯霍爾德反射 來建構 Q:每個反射都是一個正交矩陣,能一次把某一行裡某個對角元下方的所有東西歸零,串起 n 個反射就把 A 三角化了。豪斯霍爾德 QR 是向後穩定的,當你要求做最小平方求解時,LAPACK 實際跑的就是它。至於本來就近乎三角、或一次來一列的矩陣,吉文斯旋轉(Givens rotation,每次只歸零一個元素的正交矩陣)是更俐落的選擇。
SVD:替病態問題說真話的人
QR 是正確的預設選擇,但它假設 A 具有滿行秩——也就是它的各行真的彼此獨立。當它們近乎相依時(下一篇用高次多項式擬合的范德蒙基底你會正好看到這種情形),R 會有一個極小的對角元,向後代入會除以某個接近零的東西,於是即使是完美穩定的演算法,也會回給你一個被劇烈放大、不可信的 x。是問題本身病態,而沒有任何穩定方法救得了一個病態問題——穩定的演算法給的是某個鄰近問題的精確解,而在這裡,鄰近的問題有著天差地別的答案。你現在需要的不是更快的求解,而是一份診斷。
奇異值分解 就是那份診斷。從特徵值那一階你已經知道它把 A 分解成 A = U S V^T,其中 U 與 V 為正交,S 為對角、裝著 奇異值 sigma_1 >= sigma_2 >= ... >= 0。對最小平方而言,SVD 能做一件 QR 做不到的事:它把條件性攤開來給你看。比值 sigma_max / sigma_min 恰好就是條件數,所以瞄一眼奇異值,就能知道你的擬合是健康的還是注定完蛋。極小的奇異值,正是各行近乎相依的精確指紋——也就是資料幾乎沒能約束模型的那些方向。
SVD 還給出對最小平方答案最誠實的單一公式:摩爾-潘洛斯偽逆 A^+ = V S^+ U^T,其中 S^+ 把每個非零的奇異值取倒數(把 sigma 換成 1/sigma),對那些零則原封不動。於是 x = A^+ b 就是最小平方解——而且,當各行相依、答案因此不唯一時,它正是其中範數最小的那個特定解。請小心「逆」這個字:偽逆是「描述」解的乾淨方式,但你幾乎從不為了解一個實際問題而把 A^+ 構造成一個明確的矩陣,這和你從不為了解 A x = b 而構造真正的逆矩陣是同一回事。你計算 SVD,然後套用它的各個零件。
哪條路,在什麼時候走
你現在握有通往同一個最小平方 x 的三條路,而在它們之間做選擇是一個真實的工程決策,而非品味問題。以下是誠實的排序,最便宜的在前、最安全的在後。
- 法方程(A^T A x = A^T b,再做 Cholesky):最便宜,浮點運算量約為 QR 的一半,當 A 條件良好、且你只需要幾位數時很夠用——但它會把條件數平方,所以一旦準確度或條件性有疑慮,就該立刻讓它退場。
- 經由豪斯霍爾德的 QR(A = Q R,再解 R x = Q^T b):滿秩問題的日常預設。向後穩定、條件性與 A 相符而非 A 的平方,成本約為法方程的兩倍——這個代價你幾乎總是該付。
- SVD(A = U S V^T,再用偽逆):最貴卻也最能提供資訊。當各行可能秩虧或近乎相依、當你需要最小範數解、或當你想在決定是否正則化之前,直接從奇異值讀出條件數時,就用它。
一條把整階串起來的實用經驗法則:預設走 QR;一旦你懷疑病態,就立刻伸手去拿 SVD,因為只有它能告訴你病得「多重」,並給你那個可以對症下藥的奇異值把手。本階的最後一篇正是從這裡接手——它正面迎戰高次多項式擬合那個病態的范德蒙矩陣,並展示如何藉由截斷小奇異值、或加上一個 Tikhonov 懲罰項,用一點點偏差換取大量穩定性,把一個注定失敗的擬合變成一個有用的擬合。