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

2021-06-27 13:29:36 字數 1795 閱讀 5269

最小二乘法,通常用在我們已知數學模型,但是不知道模型引數的情況下,通過實測資料,計算數學模型,例如,在題目中,數學模型就是直線方程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

最小二乘法 直線擬合

功能描述 利用最小二乘法求斜率 xytopx 截距 方法1 xytopy 斜率 ncount 點數 void min2method double xytopy,double xytopx,int x,int y,int ncount graphics.drawline pen,point x i y...

最小二乘法擬合直線 c 程式

point.h class point point類的宣告 float getx float gety friend float linefit point l point,int n point 友元函式 int型變數為點數 private 私有資料成員 float x,y end of poin...

最小二乘法 直線擬合 推薦方法

1.最小二乘法 首先舉個例子。針對線性最小二乘法即直線擬合,如下圖 來自維基百科 所示 根據已有的資料 圖中的點 來做出一條最貼近資料發展趨勢的直線。通過這條直線,我們可以對未來的資料進行 因為基本會落在這條直線附近。當然了,最小二乘法不只是直線,還可以是曲線,本文不討論。2.求解直線方程 我們現在...