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