把 agent 用回你的數學課
三個 Lab 已經練過「提出要求、執行、檢查結果」。接著選一題你感興趣的問題,把同樣的方法用在新的情境。不需要先學完所有公式;每題先補上直覺,再說明要交付什麼。
開始前:先寫出你怎麼判斷完成
沿用工作坊的 ai-math-lab 資料夾與 uv 環境。下面三題只用既有的 numpy、matplotlib 與 networkx,不需要登入新服務或安裝其他模型。
每題都留下程式、圖和一小段筆記。圖放 figs/,筆記放 notes/。讓 agent 實際執行程式,接著由你打開成果、讀懂檢查的意義。可以參考把工作做完整的任務模板。
線性代數:用較少資訊近似一張影像
先看問題
一張灰階影像可以排成矩陣:每個數字是一個像素的亮度。如果畫面有重複的紋理,也許不用記住每個像素,就能保留大部分形狀。
秩一矩陣是「一個直向向量乘上一個橫向向量」得到的表格。把幾個這種簡單圖樣加起來,就能近似原圖。SVD(奇異值分解)提供一種排序方式,讓我們從最重要的圖樣開始保留。
想接到公式時再看
SVD 把矩陣寫成 $A=U\Sigma V^\top$。只保留最大的 $k$ 個奇異值,得到 $A_k=U_{:k}\Sigma_{:k}V_{:k}^\top$。
這裡的誤差使用平方和 $\|A-A_k\|_F^2$,也就是所有像素差的平方相加。它等於被捨棄的奇異值平方和。這個等式可以幫我們獨立核對程式,而不只看圖像是否相似。
交給 agent 的任務
用 numpy 和 matplotlib 寫 low_rank.py,先用白話說明低秩近似。
用 np.linspace(-1, 1, 48) 產生座標,np.meshgrid 得到 x, y;
建立 A = exp(-5*(x*x+y*y)) + 0.2*cos(6*x+3*y)。
用 np.linalg.svd(A, full_matrices=False) 做分解,保留 k=1、2、4 個成分。
所有影像共用原始 A 的 vmin/vmax,並標明它是示意亮度,不是下載的真實照片。
將原圖和三張近似圖排成一張 figs/low_rank.png。
印出每個 k 的重建平方誤差,與被捨棄奇異值的平方和比對。
驗證誤差隨 k 增加不會變大;再用完整分解確認可重建原矩陣。
用 uv run python low_rank.py 實際執行。
最後寫 notes/low_rank.md:哪些圖樣先留下?圖看起來接近,是否就能代表程式正確?
換你判讀
- 原矩陣是三個秩一圖樣的和,所以保留四個成分已足以在浮點誤差內重建;不要把這個特殊例子當成所有影像的結果。
- 先檢查平方誤差與尾端奇異值平方和是否接近,再檢查圖。兩種證據互相補充。
- 改成自己設計的紋理後,先預測需要的成分會變多還是變少,再請 agent 執行。
微積分:步子太大,會不會越走越遠
先看問題
找 $f(x)=(x-3)^2$ 的最小值,可以直接看出答案在 $x=3$。我們刻意用已知答案的問題,檢查 agent 寫出的梯度下降。
導數 $f'(x)=2(x-3)$ 告訴你函數往哪邊上升。每次沿反方向走一小步:$x_{t+1}=x_t-\eta f'(x_t)$,其中 $\eta$ 是步長。
交給 agent 的任務
寫 gradient_steps.py,求 f(x)=(x-3)^2 的最小值。
先解釋導數如何決定移動方向,再從 x0=0 開始,
分別用步長 0.1、0.8、1.1 做 30 次梯度下降。
印出最後的 x 與 f(x),保留完整迭代軌跡。
把三種步長的 f(x) 隨迭代次數變化畫在同一張圖,y 軸用對數刻度,
存成 figs/gradient_steps.png。
用中央差分在 x=0、1、4 檢查你寫的導數,h=1e-5。
另外逐步比對解析式 x_t-3 = (1-2*eta)^t*(x0-3)。
用 uv run python gradient_steps.py 執行,
寫 notes/gradient_steps.md,說明哪個步長收斂、哪個振盪,以及哪個發散。
換你判讀
- $0.1$ 的步長逐漸靠近最小值;$0.8$ 左右交替,但距離仍縮短;$1.1$ 的距離越來越大。
- 「左右交替」不一定是失敗。觀察的是離解的距離是否縮小,而不是每一步都走同一個方向。
- 這個二次函數有簡單的解析式。換成其他函數時,不能直接沿用相同的收斂範圍。
為什麼能用解析式驗證
代入更新式可得 $x_{t+1}-3=(1-2\eta)(x_t-3)$。所以誤差每次乘上同一個數,遞推就得到任務中的公式。
當 $|1-2\eta|<1$,誤差的大小縮小;當這個倍數為負,誤差正負交替。這樣就能用代數獨立檢查迴圈,而不是拿兩份幾乎相同的程式互相比。
離散數學:最短路線可以怎麼驗
先看問題
把地點當作點、可以走的路當作邊,每條邊標上距離,便得到一張帶權重的圖。我們用小型虛構路網練習,不把它當成實際校園地圖。
這題不要求先學過圖論。只要知道「一路走過的距離要相加」,就能先找一條路,再檢查有沒有更短的。下面的「簡單路徑」指不重複經過同一個點的路徑。
交給 agent 的任務
寫 shortest_path.py,用 networkx 建立無向圖:
A-B:2、A-C:5、B-C:1、B-D:4、C-D:1、C-E:5、D-E:1。
先列出各邊,再用 Dijkstra 找 A 到 E 的最短路徑與總距離。
獨立列舉所有 A 到 E 的簡單路徑,逐條把邊長加總,核對最小值。
把圖和最短路徑畫到 figs/shortest_path.png,佈局使用固定座標:
A=(0,1)、B=(1,2)、C=(1,0)、D=(2,1)、E=(3,1)。
再加一個沒有連邊的 F,確認查詢 A 到 F 時能清楚回報「無路徑」。
用 uv run python shortest_path.py 執行,
寫 notes/shortest_path.md:列舉法為何適合驗證這張小圖,卻不適合大型路網?
換你判讀
- A → B → C → D → E 的距離是 $2+1+1+1=5$。列舉結果應確認沒有更短的路線。
- Dijkstra 的這項用法要求邊長非負;這題所有邊長都是正數。
- 沒有路徑是合法的問題結果,程式應能處理,不應把它當成距離零。
做完一題之後
請用自己的話回答:「agent 幫我省下哪一段工作?哪個數學判斷仍然由我負責?」接著把問題改一個條件,再使用工作法練習要求 agent 先說明需要改哪些地方。
如需對照,可閱讀講師參考程式。先完成自己的版本,再比較驗證方式;不要只比程式長得像不像。