核心演算法全部手刻——高斯消去、Householder QR、Jacobi 與 Golub-Reinsch SVD、FFT、QR 演算法,沒有用任何現成的線性代數庫。理論說「可以這樣算」,這裡量的是「真的用電腦算下去會發生什麼」。
七層理論教材 回答「為什麼這樣定義」,八個專案回答「當我真的要用電腦算出來,會遇到什麼理論課沒說的事」。 每一層的開頭都有一個「動手驗證」表格,把該層的概念直接連到對應的互動示範。
| 教材層次 | 對應專案 |
|---|---|
| 第零層 · 向量空間 | 01 線性變換視覺化器 |
| 第一層 · 四大子空間 | 02 高斯消去求解器 |
| 第二層 · 內積與投影 | 03 最小二乘 · 04 傅立葉 |
| 第三層 · 特徵值 | 05 特徵值計算器 · 01 |
| 第四層 · SVD | 06 SVD 圖片壓縮器 |
| 第五層 · 矩陣微分 | 07 梯度下降視覺化 |
| 第六層 · 機器學習 | 08 PCA 資料探索器 |
專案之間互相 import:03 的 Householder QR 被 05 的 QR 演算法用;
02 的高斯消去被 03、05、07 用;
06 的 SVD 與 03 的 Jacobi 各自撐起 08 的兩條 PCA 路徑。
條件數 κ 出現三次,每次意思不同: 專案 03 決定「解得準不準」、專案 07 決定「收斂得快不快」、專案 08 決定「該不該標準化」。
兩種以上的做法並排跑,讓差異可以被量測而不只是被描述。
| 專案 | 對照組 | 量到的差異 |
|---|---|---|
| 02 | 選主元 vs 不選 | ε=1e-16 時解從 1 變成 2.22 |
| 03 | Normal Equation vs QR | SSE 9.1e-18 vs 168.6 |
| 03 | 古典 vs 修正 Gram-Schmidt | ‖QᵀQ−I‖ 從 1.3e-13 到 2.5 |
| 05 | 位移 vs 未位移 QR 演算法 | 2 步 vs 2224 步 |
| 06 | Jacobi vs Golub-Reinsch | 真實影像 3000ms vs 680ms |
| 07 | GD vs 動量 vs Newton | 761 / 92 / 1 步 |
| 08 | 手刻 PCA vs scikit-learn | 一致到 1e-15 |
測試幾乎都建立在「數學上必須成立什麼」而不是「答案應該等於幾」——
PA = LU、QᵀQ = I、Av = λv、
Aᵀ(Ax̂ − b) = 0、USVᵀ = A、λᵢ = σᵢ²/(n−1)。
這類測試不需要事先知道正確答案,卻能抓到最深的 bug:專案 06 的 Golub-Reinsch
第一版有 19 個測試失敗,其中「U 正交」「奇異值遞減」「雙對角化正確」全部通過,
只有 A = UΣVᵀ 掛掉。測部件的性質遠遠不夠,一定要測部件之間的關係。