數學建模常見的一些方法【04擬合算法】


@

數學建模常見的一些方法

1. 擬合算法

  • 與插值問題不同,在擬合問題中不需要曲線一定經過給定的點。擬合問題的目標是尋求一個函數(曲線),使得該曲線在某種准則下與所有的數據點最為接近,即曲線擬合的最好(最小化損失函數)。

1.1 插值和擬合的區別

在這里插入圖片描述
  插值算法中,得到的多項式f(x)要經過所有樣本點。但是如果樣本點太多,那么這個多項式次數過高,會造成龍格現象
  盡管我們可以選擇分段的方法避免這種現象,但是更多時候我們更傾向於得到一個確定的曲線,盡管這條曲線不能經過每一個樣本點,但只要保證誤差足夠小即可,這就是擬合的思想。(擬合的結果是得到一個確定的曲線)

1.2 求解最小二乘法

在這里插入圖片描述


1.3 Matlab求解最小二乘

在這里插入圖片描述
測試數據:

x =
    4.2000
    5.9000
    2.7000
    3.8000
    3.8000
    5.6000
    6.9000
    3.5000
    3.6000
    2.9000
    4.2000
    6.1000
    5.5000
    6.6000
    2.9000
    3.3000
    5.9000
    6.0000
    5.6000
>> y
y =
    8.4000
   11.7000
    4.2000
    6.1000
    7.9000
   10.2000
   13.2000
    6.6000
    6.0000
    4.6000
    8.4000
   12.0000
   10.3000
   13.3000
    4.6000
    6.7000
   10.8000
   11.5000
    9.9000

計算代碼:

>> 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  % 顯示網格線
>> f=@(x) k*x+b; % 函數線
>> fplot(f,[2.5,7]);  % 設置顯示范圍
>> legend('樣本數據','擬合函數','location','SouthEast')

在這里插入圖片描述

計算過程:

>> plot(x,y,'o')
>> % 給x和y軸加上標簽
>> xlabel('x的值')
>> ylabel('y的值')
>> n = size(x,1);

>> n*sum(x.*y)-sum(x)*sum(y)
ans = 1.3710e+03

>> n*sum(x.*x)-sum(x)*sum(x)
ans = 654.4600
 
>> k = (n*sum(x.*y)-sum(x)*sum(y))/(n*sum(x.*x)-sum(x)*sum(x))
k = 2.0948

>> b = (sum(x.*x)*sum(y)-sum(x)*sum(x.*y))/(n*sum(x.*x)-sum(x)*sum(x))
b = -1.0548

>> hold on
>> grid on
>> f=@(x) k*x+b;
>> fplot(f,[2.5,7]);
>> legend('樣本數據','擬合函數','location','SouthEast')

1.4 如何評價擬合的好壞

在這里插入圖片描述

線性函數是指對參數為線性(線性於參數)
在函數中,參數僅以一次方出現,且不能乘以或除以其他任何的參數,並不能出現參數的復合函數形式。

1.5 證明SST = SSE + SSR

在這里插入圖片描述

1.6 計算擬合優度的代碼

在這里插入圖片描述
計算代碼:
mean() 是求均值的函數

>> 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
>> R_2 = SSR / SST

計算過程:

>> y_hat = k*x+b;  % y 的擬合值
>> SSR = sum((y_hat-mean(y)).^2)  %  回歸平方和
SSR = 151.1583

>> SSE = sum((y_hat-y).^2)   %  誤差平方和
SSE = 5.7281

>> SST = sum((y-mean(y)).^2)   %  總體平方和
SST = 156.8863

>> SST-SSE-SSR
ans = 5.6843e-14

>> R_2 = SSR / SST
R_2 = 0.9635

1.7 擬合工具箱

在這里插入圖片描述
低版本的Matlab可以在命令窗口中直接輸入”cftool”
在這里插入圖片描述

1.8 補充的計算函數randi,rand,normrnd,roundn

1.8.1 randi(范圍,行,列): 產生均勻分布的隨機整數(i = int)

%產生一個1至10之間的隨機整數矩陣,大小為2x5;
s1 = randi(10,2,5)
9	4	5	3	2
7	6	1	2	3

%產生一個-5至5之間的隨機整數矩陣,大小為1x10;
s2 = randi([-5,5],1,10)
-1	-5	4	5	0	0	-2	4	-1	-4

1.8.2 rand(行,列): 產生0至1之間均勻分布的隨機數

%產生一個0至1之間的隨機矩陣,大小為1x5;
s3 = rand(1,5)
0.780252068321138	0.389738836961253	0.241691285913833	0.403912145588115	0.0964545251683886

%產生一個a至b之間的隨機矩陣,大小為1x5;  % a + (b-a) * rand(1,5); 如:a,b = 2,5
s4= 2 + (5-2) * rand(1,5)
2.39591987781901	4.82615177232646	4.86840362068941	3.72562578523540	2.17933862884147

1.8.3 normrnd(均值,標准差,行,列):產生正態分布的隨機數

%產生一個均值為0,標准差(方差開根號)為2的正態分布的隨機矩陣,大小為3x4;
s5 = normrnd(0,2,3,4)

-1.73093606110961	-2.66400884263049	0.667021666131612	-0.260569306291441
-0.353068228462902	-4.65973431161015	0.782707208865802	0.367378191723884
1.58283212325727	-2.89819458567748	0.903358837856475	-0.952306033238148

1.8.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

參考鏈接


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM