最小二乘法直線擬合及其Matlab實現

 	最小二乘法,通常用在我們已知數學模型,但是不知道模型參數的情況下,通過實測數據,計算數學模型,例如,在題目中,數學模型就是直線方程y=ax+b,但是不知道直線方程的a和b。
    	本來呢,我們只需要兩組(xi,yi),就可以解得a和b,但是由於實測數據都存在誤差,所以,我們很容易想到一個辦法,我們測很多組數據來讓我的a和b更加準確。
   	“我們測很多組數據來讓我的a和b更加準確” ,那麼我從數學角度如何體現這句話呢?
    	比如在此例中,已知數學模型 y=ax+b 
   	我們有很多組數據,那麼我們要找一條直線,使得我們測得的每個數據,到這條直線的偏離量的總和最小。(這句話有點拗口,慢慢理解下)
   	那麼怎麼用數學描述“偏離量總和最小”這個概念呢?
	數學家運用了方差!
    	數學模型 y=ax+b
    	設F=ax+b-y
    	那麼對於模型上的點(注意是模型上的點,也就是理論值),F=ax+b-y=0
    	但是對於實際值來說,F=axi+b-yi 一定不等於0。那麼我們就要找到一對a和b,使得F儘可能接近於0。
    	也就是說,“偏離量總和最小”這個概念,在數學上實際上就是要求F的方差最小。
   	即 Σ F^2→0 (F的平方和趨近於0)
    	即 Σ(axi+b-yi)^2→0
    	那麼我們得到一個方程f(a,b)=Σ(axi+b-yi)^2,我們要找到合適的a,b使得f(a,b)最小!
	也就是說,我們要找到的實際上是f(a,b)的最小值點。(因爲方差不可能小於0)
	因此我們需要求f(a,b)的極值點。我們藉助數學工具偏導。
	如果有一組a,b使得
	 ∂f(a,b)/∂a=0
    	∂f(a,b)/∂b=0
   	那麼f(a,b)就是極值點,如果a,b只有一對,那麼它就是最小值點。
	即  ∂( Σ(axi+b-yi)^2 )/∂a=0
             ∂( Σ(axi+b-yi)^2 )/∂b=0
	化簡得到
             a*Σxi^2 + b*Σxi = Σ(xi*yi)
             a*Σxi + b*N = Σyi
    	其中N是(xi,yi)的個數。即我們測了多少組數據
 
   	 解上面的二元方程,我們就可以得到唯一的一組a,b啦,這就是我們所需要的a和b
 
    	O(∩_∩)O~是不是蠻簡單的?
Matlab最基礎的程序如下:
%原始數據
X=[163     123     150      123     141];
Y=[186     126     172      125     148];
n=5;                %一共5個變量

x2=sum(X.^2);       % 求Σ(xi^2)
x1=sum(X);          % 求Σ(xi)
x1y1=sum(X.*Y);     % 求Σ(xi*yi)
y1=sum(Y);          % 求Σ(yi)

a=(n*x1y1-x1*y1)/(n*x2-x1*x1);      %解出直線斜率b=(y1-a*x1)/n
b=(y1-a*x1)/n;                      %解出直線截距
%作圖
% 先把原始數據點用藍色十字描出來
figure
plot(X,Y,'+');      
hold on
% 用紅色繪製擬合出的直線
px=linspace(120,165,45);%這裏直線區間根據自己實際需求改寫
py=a*px+b;
plot(px,py,'r');
結果 a=1.5555  b=-66.365
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章