MATLAB拟合算法
與插值問題不同,在擬合問題中不需要曲線一定經過給定的點。擬合問題的目標是尋求一個函數(曲線),使得該曲線在某種準則下與所有的數據點最為接近,即曲線擬合的最好(最小化損失函數)。
插值算法中,得到的多項式f(x)要經過所有樣本點。但是如果樣本點太多,那么這個多項式次數過高,會造成龍格現象。盡管我們可以選擇分段的方法避免這種現象,但是更多時候我們更傾向于得到一個確定的曲線,盡管這條曲線不能經過每一個樣本點,但只要保證誤差足夠小即可,這就是擬合的思想。(擬合的結果是得到一個確定的曲線)
先給出一組例子:
clear;clc; x = 0.1:0.1:1; y = [1.978,2.45,3.28,6.16,7.34,7.66,9.58,9.48,9.3,11.2]; plot(x,y,'o') xlabel('x的值'); ylabel('y的值');設這些樣本點為(xi,yi),i=1,2,…,n,我們可以設置擬合曲線為y = k*x+b
利用最小二乘法:
n = size(x,1); k = (n*sum(x.*y)-sum(x)*sum(y))/(n*sum(x.*x)-sum(x)*sum(x)) b = (sum(x.*x)*sum(y)-sum(x).*sum(x.*y))/(n*sum(x.*x)-sum(x).*sum(x)) hold on grid on f=@(x) k*x+b; fplot(f,[0,1]); legend('樣本數據','擬合函數','location','SouthEast') hold off利用一元線性函數,得到擬合出來的圖像 :
得出結果后,如何知道自己擬合數據圖形的好壞呢?
這里需要用到擬合優度R2,與R2有關的三個系數SSR、SSE、SST:
可以證明:SST = SSE + SSR?
?R2 =SSR/SST(R2越接近1,說明誤差平方和越接近0,誤差越小說明擬合的越好。注意:R2只能用于擬合函數是線性函數時,擬合結果的評價,線性函數和其他函數(例如復雜的指數函數〉比較擬合的好壞,直接看SSE即可,假如R2是個負數,說明擬合效果不好)
(我們這里說的線性函數是指對參數為線性(線性于參數)。)
因此引入一個概念:
1、對變量為線性
對線性的第一種并且也許是更“自然”的一種解釋是,¥的條件期望值是X;的線性函數。從幾何意義上說,這時回歸曲線是一條直線。按照這種解釋,諸如 E(Y|X)=β1+β2*X2的回歸函數,由于變量X以冪或指數⒉出現,就不是線性的。
2、對參數為線性
對線性的第二種解釋是,Y的條件期望E(Y│X)是參數β的一個線性函數;它可以是或不是變量X的線性函數。2對于這種解釋,E(Y |X)=β1+β2*X2就是一個線性(于參數〉回歸模型。為了看出這-一點,讓我們假設X取值為3。因此,E(Y |X=3)=β1+9β2,顯然它是β和的線性函數。
計算擬合優度的代碼:
y_hat = k *x+b; % y的擬合值 SSR = sum ( (y _hat-mean (y) ) .^2) %回歸平方和 SSE = sum( (y _hat-y).^2) %誤差平方和 SST = sum ( (y-mean(y) ).^2) %總體平方和 R_2 = SSR / SST以上是利用最小二乘法的思想對數據進行擬合,matlab中也有自帶的“擬合工具箱”:cftool
進入曲線擬合工具箱界面“Curve Fitting tool”
(1)點擊“Data”按鈕,彈出“Data”窗口;
(2)利用X data和Y data的下拉菜單讀入數據x,y,可修改數據集名“Data set name”,然后點擊“Create data set”按鈕,退出“Data”窗口,返回工具箱界面,這時會自動畫出數據集的曲線圖;
(3)點擊“Fitting”按鈕,彈出“Fitting”窗口;
(4)點擊“New fit”按鈕,可修改擬合項目名稱“Fit name”,通過“Data set”下拉菜單選擇數據集,然后通過下拉菜單“Type of fit”選擇擬合曲線的類型,工具箱提供的擬合類型有:
Custom Equations:用戶自定義的函數類型
Exponential:指數逼近,有2種類型, a*exp(b*x) 、 a*exp(b*x) + c*exp(d*x)
Fourier:傅立葉逼近,有7種類型,基礎型是 a0 + a1*cos(x*w) + b1*sin(x*w)
Gaussian:高斯逼近,有8種類型,基礎型是 a1*exp(-((x-b1)/c1)^2)
Interpolant:插值逼近,有4種類型,linear、nearest neighbor、cubic spline、shape-preserving
Polynomial:多形式逼近,有9種類型,linear ~、quadratic ~、cubic ~、4-9th degree ~
Power:冪逼近,有2種類型,a*x^b 、a*x^b + c
Rational:有理數逼近,分子、分母共有的類型是linear ~、quadratic ~、cubic ~、4-5th degree ~;此外,分子還包括constant型
Smoothing Spline:平滑逼近(翻譯的不大恰當,不好意思)
Sum of Sin Functions:正弦曲線逼近,有8種類型,基礎型是 a1*sin(b1*x + c1)
Weibull:只有一種,a*b*x^(b-1)*exp(-a*x^b)
選擇好所需的擬合曲線類型及其子類型,并進行相關設置:
——如果是非自定義的類型,根據實際需要點擊“Fit options”按鈕,設置擬合算法、修改待估計參數的上下限等參數;
——如果選Custom Equations,點擊“New”按鈕,彈出自定義函數等式窗口,有“Linear Equations線性等式”和“General Equations構造等式”兩種標簽。
在本例中選Custom Equations,點擊“New”按鈕,選擇“General Equations”標簽,輸入函數類型y=a*x*x + b*x,設置參數a、b的上下限,然后點擊OK。
(5)類型設置完成后,點擊“Apply”按鈕,就可以在Results框中得到擬合結果,如下例:
general model: f(x) = a*x*x+b*x Coefficients (with 95% confidence bounds): a = 0.009194 (0.009019, 0.00937) b = 1.78e-011 (fixed at bound) Goodness of fit: SSE: 6.146 R-square: 0.997 Adjusted R-square: 0.997 RMSE: 0.8263同時,也會在工具箱窗口中顯示擬合曲線。
這樣,就完成一次曲線擬合啦,十分方便快捷。當然,如果你覺得擬合效果不好,還可以在“Fitting”窗口點擊“New fit”按鈕,按照步驟(4)~(5)進行一次新的擬合。
不過,需要注意的是,cftool 工具箱只能進行單個變量的曲線擬合,即待擬合的公式中,變量只能有一個。對于混合型的曲線,例如 y = a*x + b/x ,工具箱的擬合效果并不好。、
如果在正式數模比賽中,利用擬合工具箱擬合出來的曲線,可以通過以下步驟將擬合出曲線的代碼導出:Curve Fitting Tool ->文件 ->Generate Code ->再使用保存快捷鍵Ctrl+S即可
總結
以上是生活随笔為你收集整理的MATLAB拟合算法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【腾讯优测干货分享】从压测工具谈并发、压
- 下一篇: 4个强大的Linux服务器监控工具[转]