來源:數學建模清風學習內容整理
文章目錄
- 擬合算法
- 擬合優度
- (1)如何評價擬合效果?
- (2)如何判斷擬合函數為線性函數?
- (3)matlab計算擬合優度
- ※ matlab曲線擬合工具箱
擬合算法
- 與插值問題不同,在擬合問題中不需要曲線一定經過給定的點。擬
合問題的目標是尋求一個函數(曲線),使得該曲線在某種準則下與所
有的數據點最為接近,即曲線擬合的最好(最小化損失函數)。
01 插值和擬合的區別
02 最小二乘法
clear;clc
load data1
plot(x,y,'o')
% 給x和y軸加上標簽
xlabel('x的值')
ylabel('y的值')
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 % 顯示網格線% % 畫出y=kx+b的函數圖像 plot(x,y)
% % 傳統的畫法:模擬生成x和y的序列,比如要畫出[0,5]上的圖形
% xx = 2.5: 0.1 :7 % 間隔設置的越小畫出來的圖形越準確
% yy = k * xx + b % k和b都是已知值
% plot(xx,yy,'-')% 匿名函數的基本用法。
% handle = @(arglist) anonymous_function
% 其中handle為調用匿名函數時使用的名字。
% arglist為匿名函數的輸入參數,可以是一個,也可以是多個,用逗號分隔。
% anonymous_function為匿名函數的表達式。
% 舉個小例子
% z=@(x,y) x^2+y^2;
% z(1,2)
% % ans = 5
% fplot函數可用于畫出匿名一元函數的圖形。
% fplot(f,xinterval) 將匿名函數f在指定區間xinterval繪圖。xinterval = [xmin xmax] 表示定義域的范圍f=@(x) k*x+b;
fplot(f,[2.5,7]);
legend('樣本數據','擬合函數','location','SouthEast')
擬合優度
- 要對擬合的函數 f(x)f(x)f(x) 取舍(保證模型簡潔性),擬合 f(x)f(x)f(x) 越簡單,R2R^2R2 越接近于1,結果越好
- 只有擬合函數是線性函數時,才采用擬合優度 R2R^2R2 來對擬合結果評價
- 線性函數與其他函數(如復雜的指數函數)比較時,采用 SSESSESSE 來對擬合好壞評價。
(1)如何評價擬合效果?
(2)如何判斷擬合函數為線性函數?
(3)matlab計算擬合優度
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) % 總體平方和
SST-SSE-SSR % 5.6843e-14 = 5.6843*10^-14 matlab浮點數計算的一個誤差
R_2 = SSR / SST
※ matlab曲線擬合工具箱
(1)使用圖解
進入曲線擬合工具箱界面“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種類型, aexp(bx) 、 aexp(bx) + cexp(dx)
Fourier:傅立葉逼近,有7種類型,基礎型是 a0 + a1cos(xw) + b1sin(xw)
Gaussian:高斯逼近,有8種類型,基礎型是 a1exp(-((x-b1)/c1)^2)
Interpolant:插值逼近,有4種類型,linear、nearest neighbor、cubic spline、shape-preserving
Polynomial:多形式逼近,有9種類型,linear ~、quadratic ~、cubic ~、4-9th degree ~
Power:冪逼近,有2種類型,ax^b 、ax^b + c
Rational:有理數逼近,分子、分母共有的類型是linear ~、quadratic ~、cubic ~、4-5th degree ~;此外,分子還包括constant型
Smoothing Spline:平滑逼近(翻譯的不大恰當,不好意思)
Sum of Sin Functions:正弦曲線逼近,有8種類型,基礎型是 a1sin(b1x + c1)
Weibull:只有一種,ab*x(b-1)*exp(-a*xb)
選擇好所需的擬合曲線類型及其子類型,并進行相關設置:
——如果是非自定義的類型,根據實際需要點擊“Fit options”按鈕,設置擬合算法、修改待估計參數的上下限等參數;
——如果選Custom Equations,點擊“New”按鈕,彈出自定義函數等式窗口,有“Linear Equations線性等式”和“General Equations構造等式”兩種標簽。
在本例中選Custom Equations,點擊“New”按鈕,選擇“General Equations”標簽,輸入函數類型y=axx + b*x,設置參數a、b的上下限,然后點擊OK。
(5)類型設置完成后,點擊“Apply”按鈕,就可以在Results框中得到擬合結果。
注意:cftool 工具箱只能進行單個變量的曲線擬合,即待擬合的公式中,變量只能有一個。對于混合型的曲線,例如 y = a*x + b/x ,工具箱的擬合效果并不好。
(2)示例
clear;clc
year = 1790:10:2000;
population = [3.9,5.3,7.2,9.6,12.9,17.1,23.2,31.4,38.6,50.2,62.9,76.0,92.0,106.5,123.2,131.7,150.7,179.3,204.0,226.5,251.4,281.4];
plot(year,population,'o')
cftool % 擬合工具箱
% (1) X data 選擇 year
% (2) Y data 選擇 population
% (3) 擬合方式選擇:Custom Equation (自定義方程)
% (4) 修改下方的方框為:x = f(t) = xm/(1+(xm/3.9-1)*exp(-r*(t-1790)))
% (5) 左邊的result一欄最上面顯示:Fit computation did not converge:即沒有找到收斂解,右邊的擬合圖形也表明擬合結果不理想
% (6) 點擊Fit Options,修改非線性最小二乘估計法擬合的初始值(StartPoint), r修改為0.02,xm修改為500
% 有很多同學有疑惑,初始值為什么要這樣設置?我們在未來學習微分方程模型和智能算法的課程時再來給大家介紹這里面蘊含的技巧。
% (7) 此時左邊的result一覽得到了擬合結果:r = 0.02735, xm = 342.4
% (8) 依次點擊擬合工具箱的菜單欄最左邊的文件—Generate Code(導出代碼到時候可以放在你的論文附錄),可以得到一個未命名的腳本文件
% (9) 在這個打開的腳本中按快捷鍵Ctrl+S,將這個文件保存到當前文件夾。
% (10) 在現在這個文件中調用這個函數得到參數的擬合值和預測的效果
[fitresult, gof] = createFit(year, population)
t = 2001:2030;
xm = 342.4;
r = 0.02735;
predictions = xm./(1+(xm./3.9-1).*exp(-r.*(t-1790))); % 計算預測值(注意這里要寫成點乘和點除,這樣可以保證按照對應元素進行計算)
figure(2)
plot(year,population,'o',t,predictions,'.') % 繪制預測結果圖
% (1)randi : 產生均勻分布的隨機整數(i = int)
%產生一個1至10之間的隨機整數矩陣,大小為2x5;
s1 = randi(10,2,5)
%產生一個-5至5之間的隨機整數矩陣,大小為1x10;
s2 = randi([-5,5],1,10)% (2) rand: 產生0至1之間均勻分布的隨機數
%產生一個0至1之間的隨機矩陣,大小為1x5;
s3 = rand(1,5)
%產生一個a至b之間的隨機矩陣,大小為1x5; % a + (b-a) * rand(1,5); 如:a,b = 2,5
s4= 2 + (5-2) * rand(1,5)% (3)normrnd:產生正態分布的隨機數
%產生一個均值為0,標準差(方差開根號)為2的正態分布的隨機矩陣,大小為3x4;
s5 = normrnd(0,2,3,4)% (4)roundn—任意位置四舍五入
% 0個位 1十位 2百位 -1小數點后一位
a = 3.1415
roundn(a,-2) % ans = 3.1400
roundn(a,2) % ans = 0
a =31415
roundn(a,2) % ans = 31400
roundn(5.5,0) %6
roundn(5.5,1) %10
clear;clc
x = rand(30,1) * 10; % x是0-10之間均勻分布的隨機向量(30個樣本)
y = 3 * exp(0.5*x) -5 + normrnd(0,1,30,1);
% cftool
(3)優秀論文示范
? ? ? ? % 因為不是線性函數,所以不看 R2R^2R2 ,而是看 誤差平方和 SSESSESSE %
- cftool的額外功能(不推薦使用,因為三維畫圖有其他辦法)
總結
以上是生活随笔為你收集整理的拟合算法模型的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。