技術導讀

以圖形方式把模型擬合到資料

由殘差、Chebyshev 準則與最小二乘法,介紹插值與曲線擬合的分別。

2024年7月28日 · 約 1 分鐘閱讀

延續數值分析系列,本文討論曲線擬合。插值建立一條穿過全部資料點的曲線;曲線擬合則尋找最能代表資料整體趨勢的曲線,不一定通過每一點。

曲線擬合

當資料帶有雜訊或誤差,穿過所有點的插值未必能代表底層趨勢,此時可用曲線擬合尋找較合理的函數。

如何判斷擬合是否良好?一種做法是計算殘差——觀測值與模型預測值的差,再調整模型參數以減少殘差。常見準則包括:

  • **Chebyshev 近似準則:**最小化資料與模型之間的最大絕對誤差。
  • **最小二乘準則:**最小化殘差平方和。

如果用多項式擬合,可透過最小二乘法求出令殘差平方和最小的係數,問題可轉化成線性代數計算。

最小二乘法

最小二乘法適用於線性、多項式、指數等多類模型。給定資料 (x1,y1),,(xn,yn)(x_1,y_1),\ldots,(x_n,y_n),要擬合 mm 次多項式

f(x)=a0+a1x+a2x2++amxm,f(x)=a_0+a_1x+a_2x^2+\cdots+a_mx^m,

目標是找出令殘差平方和最小的 a0,,ama_0,\ldots,a_m。設計矩陣形式為

Aa=b,\mathbf A\mathbf a=\mathbf b,

其中:

  • A\mathbf An×(m+1)n\times(m+1) 矩陣,第 ii 列為 (1,xi,xi2,,xim)(1,x_i,x_i^2,\ldots,x_i^m)
  • a=(a0,a1,,am)T\mathbf a=(a_0,a_1,\ldots,a_m)^T 是係數向量;
  • b=(y1,y2,,yn)T\mathbf b=(y_1,y_2,\ldots,y_n)^T 是觀測向量。

例如資料為:

xxyy
11
23.9
39.1
415.8

希望擬合 f(x)=a0+a1x+a2x2f(x)=a_0+a_1x+a_2x^2。相應方程寫成

a0+a1+a2=1,a0+2a1+22a2=3.9,a0+3a1+32a2=9.1,a0+4a1+42a2=15.8.\begin{aligned} a_0+a_1+a_2&=1,\\ a_0+2a_1+2^2a_2&=3.9,\\ a_0+3a_1+3^2a_2&=9.1,\\ a_0+4a_1+4^2a_2&=15.8. \end{aligned}

實際最小二乘問題有四條方程、三個未知數,通常以 normal equations、QR 分解或 SVD 求近似解,而不是要求每條方程同時完全成立。

我的專案

專案先以圖形介紹資料擬合,再使用 Python、numpymatplotlib 實作。numpy.polyfit 負責多項式擬合,matplotlib.plot 顯示資料與擬合模型。

以下 HTML 互動視覺化展示專案結果: