東莞市網(wǎng)站建設(shè)制作設(shè)計平臺溫州seo品牌優(yōu)化軟件
擬合算法
文章目錄
- 擬合算法
- 概念
- 確定擬合曲線
- 最小二乘法的幾何解釋
- 求解最小二乘法
- matlab求解最小二乘法
- 如何評價擬合的好壞
- 計算擬合優(yōu)度的代碼
概念
在前面的篇幅中提到可以使用插值算法,通過給定的樣本點推算出一定的曲線從而推算出一些想要的值。但存在一些問題。一是若樣本點過多,那么多項式的次數(shù)過高會造成龍格現(xiàn)象;二是為了避免龍格現(xiàn)象而通過分段的思想求得擬合曲線,但這樣會導(dǎo)致曲線函數(shù)非常復(fù)雜。
針對以上問題,在擬合問題中,不需要曲線一定經(jīng)過給定的點。擬合問題的目標(biāo)是尋求一個函數(shù)(曲線),而該函數(shù)盡可能設(shè)置得較為簡單,使得該曲線在某種準(zhǔn)則下與所有的數(shù)據(jù)點最為接近,即只要保證誤差足夠小即可,(最小化損失函數(shù)),這就是擬合是思想。
確定擬合曲線
給定一組數(shù)據(jù)[x,y],找出y和x之間的擬合曲線
在matlab上通過畫圖得出這組數(shù)據(jù)對應(yīng)的圖像
plot(x,y,'o');
擬合一個曲線去接近樣本點,這里我用一個簡單的擬合曲線y=kx+b?,F(xiàn)在的問題是,k和b取何值時,樣本點和擬合曲線最接近。
最小二乘法的幾何解釋
- 第一種定義有絕對值,后續(xù)不容易求導(dǎo),因此計算較復(fù)雜。所以我們往往使用第二種定義,這正是最小二乘法的思想
- 我們也不使用三次方,因為三次方計算樣本點到擬合曲線的距離會出現(xiàn)負(fù)數(shù),那么該距離就會正負(fù)抵消
- 我們也不使用四次方,使用4次方時,若出現(xiàn)某個異常值離曲線較遠(yuǎn),那么該擬合曲線受到的影響較大
求解最小二乘法
最終落腳到的兩個公式:k</sup>和b<sup>推導(dǎo)公式
- 該公式通過對k和b一介求導(dǎo),然后分離系數(shù)所得
matlab求解最小二乘法
根據(jù)公式不難得出代碼
plot(x,y,'o');
xlabel("x");
ylabel("y");
n=size(x,1);%% 數(shù)據(jù)的個數(shù)
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ù)可以繼續(xù)在之前的圖形上畫圖形
grid on;%% 圖形顯示網(wǎng)格線
f=@(x) k*x+b; %% f=kx+b是匿名函數(shù),該函數(shù)圖形不需要另外傳參數(shù)也能形成圖形
fplot(f,[2.5,7]);
legend('樣本數(shù)據(jù)','擬合函數(shù)','location','southeast');
- f函數(shù)是匿名函數(shù),該函數(shù)圖形不需要另外傳參數(shù)也能形成圖形。在matlab中畫出圖形需要傳參。比如正常情況下f函數(shù)需要傳參x否則不能畫出圖形,而匿名函數(shù)系統(tǒng)會根據(jù)需求自己給出一定范圍的參數(shù)以得畫出圖形
匿名函數(shù)的基本用法
handle = @(arglist) anonymous_function
-
其中handle為調(diào)用匿名函數(shù)時使用的名字。
-
arglist為匿名函數(shù)的輸入?yún)?shù),可以是一個,也可以是多個,用逗號分隔。
-
anonymous_function為匿名函數(shù)的表達(dá)式。
-
注意輸入?yún)?shù)和表達(dá)式之間要用空格
- fplot可用于畫出匿名一元函數(shù)的圖形
基本用法
fplot(f,xinterval)
- 將匿名函數(shù)f在指定區(qū)間xinterval繪圖。xinterval = [xmin xmax] 表示定義域的范圍
如何評價擬合的好壞
- 根據(jù)SST、SSE、SSR可以證明:
- SST=SSE+SSR
- 擬合優(yōu)度:0<=1-SSE/SST<=1;而SSE誤差平方和越小,擬合優(yōu)度R2越接近1。誤差越小說明擬合的越好
- 注意:擬合優(yōu)度R2只能用于擬合函數(shù)是線性函數(shù),若擬合函數(shù)是其他函數(shù),直接看誤差平方和即可,SSE越小,說明擬合度越好
- 線性函數(shù)是指在函數(shù)中,參數(shù)僅以一次方出現(xiàn),且不能乘以或除以其他任何的參數(shù),并不能出現(xiàn)參數(shù)的復(fù)合函數(shù)形式。該參數(shù)不是指自變量x。比如y=kx+b,該參數(shù)指的是區(qū)別于自變量x和因變量y以外的參數(shù)k和b。
計算擬合優(yōu)度的代碼
plot(x,y,'o');
xlabel("x");
ylabel("y");
n=size(x,1);%% 數(shù)據(jù)的個數(shù)
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ù)可以繼續(xù)在之前的圖形上畫圖形
grid on;%% 圖形顯示網(wǎng)格線
f=@(x) k*x+b; %% f=kx+b是匿名函數(shù),該函數(shù)圖形不需要另外傳參數(shù)也能形成圖形
fplot(f,[2.5,7]);
legend('樣本數(shù)據(jù)','擬合函數(shù)','location','southeast');
y_hat=k*x+b;
SSR=sum((y_hat-mean(y)).^2); % 回歸平方和
SSE=sum((y-y_hat).^2); % 誤差平方和
SST=sum((y-mean(y)).^2); % 總體平方和
disp(SST-SSE-SSR);
R_2=SSR/SST; % 擬合優(yōu)度
disp(R_2);
-
SST-SSE-SSR的結(jié)果不為0的原因是在matlab中浮點數(shù)做運算一定程度上結(jié)果不精準(zhǔn),但結(jié)果是5.6843^-14結(jié)果是非常小的即非常接近0
[外鏈圖片轉(zhuǎn)存中…(img-WkmLP3WM-1692188156893)] -
SST-SSE-SSR的結(jié)果不為0的原因是在matlab中浮點數(shù)做運算一定程度上結(jié)果不精準(zhǔn),但結(jié)果是5.6843^-14結(jié)果是非常小的即非常接近0
-
擬合度為0.9635非常接近1了,說明該擬合函數(shù)的擬合度較好