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