最小二乘法曲線擬合原理與實現
阿新 • • 發佈:2019-01-22
最小二乘學習法是對模型的輸出和訓練集輸出的平方誤差為最小時的引數進行學習,式中之所以加上係數1/2,是為了約去對進行微分時得到的2。
“LS”是Least Squares的首字母。平方誤差是殘差的範數,因此最小二乘學習法有時也稱為損失最小化學習法。
如果使用線性模型
的話,訓練樣本的平方差就能夠表示為如下形式。
在這裡,是訓練輸出的n維向量,是下式中定義的n*b階矩陣,也稱為設計矩陣
訓練樣本的平方差的引數向量的偏微分以
這樣的形式給出。如果將其微分設定為0,最小二乘解就滿足關係式
這個方程式的解使用設計矩陣的廣義逆矩陣來進行計算,可以得出。
相對於只有方陣、非奇異矩陣才能定義逆矩陣,如果存在逆矩陣,
廣義逆矩陣則是矩形矩陣或奇異矩陣都可以定義,是對逆矩陣的推廣。有逆矩陣的時候,廣義逆矩陣可以用下式表示
接下來談談這個線性函式,在上式中,是基函式向量的第i個因子,是引數向量的第i個因子。另外,b是基函式的個數。
對與曲線的擬合,我們通常把基函式變為多項式的形式或者變為b=2m+1的三角多項式形式
對於基函式是多項式,設計矩陣是
matlab程式程式碼擬合如下所示
clear ;
%在[-3*pi,3*pi]生成50個數據點 sin(x)/x
n = 50 ;
x = linspace(-3,3,n)' ;
pix = pi * x ;
y = sin(pix) ./ (pix) + 0.1 * x + 0.05 * randn(n,1) ;
%儲存係數矩陣
p(:,1) = ones(n,1) ;
%預設15個引數
for j = 1 : 15
p(:,j+1) = x .^ j ;
end
%求出引數
t = p \ y ;
%曲線擬合,生成100個數據點
N = 100 ;
X = linspace(-3,3,N)' ;
%生成y座標
P(:,1) = ones(N,1) ;
for j = 1 : 15
P(:,j+1) = X .^ j ;
end
F = P * t ;
%生成影象
hold on ;
axis([-2.8 2.8 -0.5 1.2]) ;
plot(X,F,'g-') ;
plot(x,y,'bo') ;
生成的影象如圖所示
對於基函式是三角多項式,設計矩陣是
matlab程式程式碼擬合如下所示
clear ;
n = 50 ;
N = 100 ;
x = linspace(-3,3,n)' ;
X = linspace(-3,3,N)' ;
pix = pi * x ;
y = sin (pix) ./ (pix) + 0.1 * x + 0.05 * randn(n,1) ;
p(:,1) = ones(n,1) ;
P(:,1) = ones(N,1) ;
for j = 1 : 15
p(:,2*j) = sin(j*x) ;
p(:,2*j+1) = cos(j*x) ;
P(:,2*j) = sin(j*X) ;
P(:,2*j+1) = cos(j*X) ;
end
t = p\y ;
F = P * t ;
figure(1) ; clf ; hold on ; axis([-2.8 2.8 -0.5 1.2]) ;
plot(X,F,'g-') ;
plot(x,y,'bo') ;
生成的影象如圖所示