10-3 Du夆jkG洏 fminsearch

相對而言,非線性迴歸(Nonlinear Regression)是一個比較困難的問題,原因如下:

以數學來描述,假設所用的數學模型是 $y=f(\mathbf{x}, \mathbf{\theta})$,其中 $f(\mathbf{x}$ 是輸入向量,$\mathbf{\theta})$ 是可變非線性函數,$y$ 是輸出變數,則總平方誤差為 $$ E(\mathbf{\theta}) = \sum_{i=1}^n (y_i - f(\mathbf{x}_i, \mathbf{\theta}))^2 $$

其中 $(\mathbf{x}_i, y_i)$ 是第 $i$ 個已知資料點。由於 $\mathbf{\theta}$ 是 $f$ 的非線性參數,所以 $E(\mathbf{\theta})$ 並不是 $\mathbf{\theta}$ 的二次式,因此我們並無法由 $\mathbf{\theta}$ 對 $\mathbf{\theta}$ 的導式為零來解出最佳的 $\mathbf{\theta}$ 值。退而求其次,我們必須用一般最佳化(Optimization)的方法,來找出 $E(\mathbf{\theta})$ 的最小值,例如梯度下降法(Gradient Descent),或是 Simplex 下坡式搜尋(Simplex Downhill search)等。

舉例來說,假設所用的數學模型為

$$ y= a_1 e^{\lambda_1 x} + a_2 e^{\lambda_2 x} $$

其中,$a_1$、$a_2$ 為線性參數,但 $\lambda_1$、$\lambda_2$ 為非線性參數,則此模型為非線性,總平方誤差可表示如下: $$ E(a_1, a_2, \lambda_1, \lambda_2) = \sum_{i=1}^{m} (y_i - a_1 e^{\lambda_1 x_i} - a_2 e^{\lambda_2 x_i})^2 $$

欲找出使 $E(a_1, a_2, \lambda_1, \lambda_2)$ 為最小的 $a_1$、$a_2$、$\lambda_1$ 及 $\lambda_2$,我們需將 $E$ 寫成一個 MATLAB 函式,並由其它最佳化的方法來求出此函式的最小值。假設此函式為 errorMeasure1.m,其內容可顯示如下:

Example 1: 10-曲線擬合與迴歸分析/errorMeasure1.mfunction squaredError = errorMeasure1(theta, data) if nargin<1; return; end x = data(:,1); y = data(:,2); y2 = theta(1)*exp(theta(3)*x)+theta(2)*exp(theta(4)*x); squaredError = sum((y-y2).^2);

其中 theta 是參數向量,包含了 $a_1$、$a_2$、$\lambda_1$ 及 $\lambda_2$,data 則是觀察到的資料點,傳回的值則是總平方誤差。欲求出此函式的最小值,我們可使用 fminsearch 指令,請見下列範例:

Example 2: 10-曲線擬合與迴歸分析/nonlinearFit01.mload data.txt theta0 = [0 0 0 0]; tic theta = fminsearch(@(x)errorMeasure1(x, data), theta0); fprintf('計算時間 = %g\n', toc); x = data(:, 1); y = data(:, 2); y2 = theta(1)*exp(theta(3)*x)+theta(2)*exp(theta(4)*x); plot(x, y, 'ro', x, y2, 'b-'); legend('Sample data', 'Regression curve'); fprintf('誤差平方和 = %d\n', sum((y-y2).^2));計算時間 = 0.0762827 誤差平方和 = 5.337871e-01

上圖的曲線即為 fminsearch 指令所產生的迴歸曲線。在上述程式中,data 矩陣包含自變數(即data(:,1))和因變數(即 data(:,2)),以方便將之傳入函式 errorMeasure1.m。Theta0 則是可變參數 theta 的起始值。fminsearch 指令則是一個使用 Simplex 下坡式搜尋法(Downhill Simplex Search)的最佳化方法,用來找出 errorMeasure1 的極小值,並傳回 theta 的最佳值。欲詳知此方法的細節,可詳閱筆者的另一著作「Neural-Fuzzy and Soft Computing – A Computational Approach to Learning and Machine Intelligence」,Prentice Hall ,1997。


MATLAB程式設計:進階篇