Processing math: 100%

10-3 Du夆jkG洏 fminsearch

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

以數學來描述,假設所用的數學模型是 y=f(x,θ),其中 f(x 是輸入向量,θ) 是可變非線性函數,y 是輸出變數,則總平方誤差為 E(θ)=ni=1(yif(xi,θ))2

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

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

y=a1eλ1x+a2eλ2x

其中,a1a2 為線性參數,但 λ1λ2 為非線性參數,則此模型為非線性,總平方誤差可表示如下: E(a1,a2,λ1,λ2)=mi=1(yia1eλ1xia2eλ2xi)2

欲找出使 E(a1,a2,λ1,λ2) 為最小的 a1a2λ1λ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 是參數向量,包含了 a1a2λ1λ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程式設計:進階篇