把奇異值分解看成一疊排好序的「秩-1 圖片」
上一篇你認識了奇異值分解:任何 m×n 的實矩陣 A 都可分解成 A = U S V^T,其中 U 與 V 是正交矩陣,S 是對角矩陣,裝著奇異值 sigma_1 >= sigma_2 >= ... >= 0,由大到小排好。這個分解是完全正確、毫無遺漏的,但有一種讀法能把它變成一件工具。把它乘開,A 就不是一整塊——它是一個總和:A = sigma_1 u_1 v_1^T + sigma_2 u_2 v_2^T + ...,其中 u_i 與 v_i 是 U 與 V 的各個行向量。
盯著其中一項看。外積 u_i v_i^T 是個 m×n 矩陣,但它是最簡單的非零矩陣:每一列都是 v_i 的某個倍數,每一行都是 u_i 的某個倍數。它的秩是 1——它只承載一個方向份量的資訊。所以奇異值分解在說:A 是由一疊秩-1 圖片堆出來的,而 sigma_i 就是第 i 張圖片的亮度旋鈕。因為奇異值是排好序的,第一項是 A 裡最響亮的單一花樣,第二項是去掉第一項後剩下最響亮的花樣,如此一路下去,直到一條又長又近乎全黑、幾乎沒有貢獻的尾巴。
截斷它,而埃卡特-楊定理保證這是最好的
現在做那件顯而易見的事。只留前 k 項,其餘全丟:A_k = sigma_1 u_1 v_1^T + ... + sigma_k u_k v_k^T。這個 A_k 是個秩-k 矩陣——把最好的 k 張秩-1 圖片以全亮度加起來。它就是你的低秩近似,而很自然的擔憂是:把尾巴砍掉算是個好的近似嗎,還是我只是在這個例子上運氣好?答案是一條定理,而且乾淨得不尋常。
埃卡特-楊定理說:A_k 是 A 的所有可能秩-k 近似裡最好的那一個——沒有任何別的秩-k 矩陣能更接近。而你付出的誤差,恰恰就是你丟掉那些圖片的亮度:在譜範數下,差距 ||A - A_k||_2 等於 sigma_{k+1},也就是你丟掉的第一個奇異值。所以奇異值不只是排序用的標籤;它們是一份精確、可直接讀出的誤差預算。如果 sigma_{k+1} 很小,你的截斷就近乎完美;如果奇異值衰減得慢,那就沒有任何低秩近似會好,這份資料是真的需要許多維度。
為什麼這能壓縮,又在哪裡不行
把儲存量算一算,魔術就出現了。完整的 m×n 矩陣需要 m 乘 n 個數字。但 A_k 是由 k 個向量 u_i(長度 m)、k 個向量 v_i(長度 n)與 k 個奇異值組成的——也就是 k 乘 (m + n + 1) 個數字。一張 1000×1000 的影像保留到秩 50,你就只存大約 50 乘 2001、約十萬個數字,而非一百萬個:縮小了十倍,畫面卻依然看得對,因為被丟掉的奇異值都很小。這正是奇異值分解影像壓縮背後字面意義的機制;同一套算術也解釋了為什麼推薦系統對每位使用者、每件物品只存幾個潛在因子,而不是一張巨大的評分網格。
還有第二個更微妙的回報:截斷會去雜訊。真實的量測,是前幾個方向裡的訊號,加上一層散佈在所有微小奇異值上、又寬又淡的隨機雜訊噴霧。砍掉尾巴,丟掉的大多是雜訊,留下的大多是訊號——這正是你會看到用來穩定不適定反問題的截斷奇異值想法。同一刀既壓縮,也清潔。
主成分分析:戴上統計學家帽子的奇異值分解
主成分分析是這一切最著名的應用,而它字面上就是一個前面加了一道記帳手續的截斷奇異值分解。假設你有 N 個資料點,每個都是一列量測值——病人對檢驗值、顧客對購買紀錄。把它們疊成一個矩陣,然後置中:把每一行減去該行的平均值,讓每個特徵的平均都變成零。主成分分析要找的,是特徵空間裡資料變化最大的那些方向;第一主成分是捕捉到最大散佈的單一方向,第二主成分是與第一垂直、散佈最大的方向,依此類推。
關鍵的連結在這裡。那些「變異最大」的方向,是共變異數矩陣的特徵向量——而對置中後的資料 A,共變異數正比於 A^T A。你大可組出 A^T A,再對它跑一個特徵值求解器,因為它是個對稱特徵問題。但這整個級別最該動手記住的一課是:別這麼做。A 的右奇異向量 v_i 恰恰就是那些特徵向量,而奇異值的平方 sigma_i^2 就是沿著它們的變異數,全程根本不必組出 A^T A。各個主成分就是 v_i;把你的資料投影到最前面 k 個之上,正是換了身衣服的秩-k 截斷。
當矩陣大到連奇異值分解都吃不消時
對一個稠密的 m×n 矩陣做完整的奇異值分解,運算量大約是 O(m n^2)——和本級稍早那些稠密特徵值求解器同樣帶著立方味道的代價,做法是先做 Golub-Kahan 雙對角化,再對雙對角形式跑一個隱式的 QR 式迭代。對中等大小的矩陣,這沒問題。但現代的資料龐大無比——上百萬列與行——而你往往只想要最前面 k 組奇異三元組,且 k 遠小於 n。為了只留前 50 個方向而把整個奇異值分解算完,既浪費,甚至可能塞不進記憶體。
兩條逃生路線都倚賴本級的想法。古典的那條是克雷洛夫:你在大型稀疏特徵問題裡認識的 Lanczos/Arnoldi 機制,可施加於 A^T A(或施加於 A 的某個巧妙對稱嵌入),只用矩陣-向量乘積就萃取出最前面幾組奇異三元組——對稀疏或無矩陣的 A 再完美不過。現代廣受歡迎的那條是隨機化奇異值分解:用一個小的隨機矩陣去乘 A,草繪出它主導的行空間,再在那份草圖內部做一個微小的精確奇異值分解。
隨機草繪一個矩陣聽起來莽撞,其實根基穩固:只要草圖比 k 略寬一點,隨機化奇異值分解回傳的秩-k 近似,在高機率下幾乎和埃卡特-楊的最佳解一樣好,代價大約是 O(m n k) 而非 O(m n^2)。但要說個誠實的但書——這是個機率性保證,隨機化方法給的是「高機率下的好答案」而非確定的答案,而由於虛擬亂數產生器是確定性的,固定種子就能讓這一輪可重現。當奇異值衰減得快時,它精準得驚人;衰減得慢時,你就多取幾個草圖行、再加一個可選的修正步驟來找回品質。
為這一級收尾:一個分解,十來種應用
回望你剛爬完的這道階梯。你學到了為什麼不能靠解特徵多項式來求特徵值,認識了冪法與反迭代,看著 QR 演算法成為主力工具,見識了對稱特徵問題額外的禮物,也認識了應付真正大規模問題的克雷洛夫求解器。奇異值分解把這一切編織在一起——而本篇展示了:對一個排好序的奇異值分解做截斷這單一動作,被埃卡特-楊定理加持為最佳,無論你管它叫壓縮、去雜訊、正則化,還是主成分分析,其實都是同一招。
Low-rank approximation in three honest lines U, s, Vt = svd(A) # s sorted: s[0] >= s[1] >= ... >= 0 k = number of s[i] above your tolerance # read the elbow A_k = U[:, :k] @ diag(s[:k]) @ Vt[:k, :] # best rank-k matrix # Eckart-Young: ||A - A_k||_2 = s[k] (the first dropped value) # PCA: columns of V[:, :k] are the principal components, # s[i]^2 / (N-1) is the variance along component i. # Storage: k*(m + n + 1) numbers instead of m*n.
如果你只帶走一樣東西,就帶走這個重新框定:矩陣不是一張靜止的數字網格,而是一個排好序的簡單花樣總和,而奇異值會誠實地、預先告訴你,只保留重要花樣會損失多少。這一句話,把本級抽象的特徵值機制,連到了地球上最常被使用的資料工具——而且一路上對有損性、條件數、浮點、以及快速演算法那些機率性的細則,都保持誠實。