最小二乘法曲線擬合以及Matlab實現

最小二乘法曲線擬合以及Matlab實現

在實際工程中,我們常會遇到這種問題:已知一組點的橫縱座標,需要繪製出一條儘可能逼近這些點的曲線(或直線),以進行進一步進行加工或者分析兩個變量之間的相互關係。而獲取這個曲線方程的過程就是曲線擬合。

目錄

  • 最小二乘法直線擬合原理
  • 曲線擬合
  • Matlab實現代碼

最小二乘法直線線擬合原理

首先,我們從曲線擬合的最簡單情況——直線擬合來引入問題。如果待擬合點集近似排列在一條直線上時,我們可以設直線 y=ax+b 爲其擬合方程,係數 A=[a,b] 爲待求解項,已知:
這裏寫圖片描述

用矩陣形式表達爲: Y=X0A ,其中:
這裏寫圖片描述
要求解A,可在方程兩邊同時左乘 X0 的逆矩陣,如果它是一個方陣且非奇異的話。

但是,一般情況下 X0 連方陣都不是,所以我們在此需要用 X0 構造一個方陣,即方程兩邊同時左乘 X0 的轉置矩陣,得到方程: X0TY=X0TX0A

此時,方程的係數矩陣 X0TX0 爲方陣,所以兩邊同時左乘新系數矩陣 X0TX0 的逆矩陣,便可求得係數向量A ,即:(X0TX0)1X0TY=A

方程A=(X0TX0)1X0TY 右邊各部分均已知,所以可直接求解得到擬合直線的方程係數向量A。

曲線線擬合

當樣本點的分佈不爲直線時,我們可用多項式曲線擬合,即擬合曲線方程爲n階多項式

y=i=0naixi=anxn+an1xn1+...+a1x+a0

用矩陣形式表示爲: Y=X0A ,其中:

X0

待求解項爲係數向量A=[an,an1,...,a2,a1,a0]T

曲線擬合方程Y=X0A 的求解方法與上面直線的求解方法一樣,也是在方程Y=X0A 兩邊同左乘X0 的轉置矩陣得到: X0TY=X0TX0A

再同時在新方程兩邊同時左乘X0TX0 的逆矩陣,得到:(X0TX0)1X0TY=A

上式左邊各部分均已知,所以可直接求解得擬合曲線方程的係數向量A。

Matlab實現代碼

%by [email protected]
clear
clc
x=[2,4,5,6,6.8,7.5,9,12,13.3,15];
y=[-10,-6.9,-4.2,-2,0,2.1,3,5.2,6.4,4.5];
[~,k]=size(x);
for n=1:9
    X0=zeros(n+1,k);
    for k0=1:k           %構造矩陣X0
        for n0=1:n+1
            X0(n0,k0)=x(k0)^(n+1-n0);
        end
    end
    X=X0';
    ANSS=(X'*X)\X'*y';
    for i=1:n+1          %answer矩陣存儲每次求得的方程係數,按列存儲
       answer(i,n)=ANSS(i);
   end
    x0=0:0.01:17;
    y0=ANSS(1)*x0.^n    ;%根據求得的係數初始化並構造多項式方程
    for num=2:1:n+1     
        y0=y0+ANSS(num)*x0.^(n+1-num);
    end
    subplot(3,3,n)
    plot(x,y,'*')
    hold on
    plot(x0,y0)
end
suptitle('不同次數方程曲線擬合結果,從1到9階')

運行結果

擬合曲線結果:

可以看出看來,當多項式的階數過小是,曲線並不能很好地反映出樣本點的分佈情況;但階數過高時,會出現過擬合的情況。
這裏寫圖片描述

係數矩陣answer:

這裏寫圖片描述

Matlab自帶函數——polyfit

在matlab中,也有現成的曲線擬合函數polyfit,其也是基於最小二乘原理實現的,具體用法爲:ans=polyfit(x,y,n). 其中x,y爲待擬合點的座標向量,n爲多項式的階數。

下面代碼是用polyfit函數來做曲線擬合:

clear
clc
x=[2,4,5,6,6.8,7.5,9,12,13.3,15];
[~,k]=size(x);
y=[-10,-6.9,-4.2,-2,0,2.1,3,5.2,6.4,4.5];
for n=1:9
    ANSS=polyfit(x,y,n);  %用polyfit擬合曲線
    for i=1:n+1           %answer矩陣存儲每次求得的方程係數,按列存儲
       answer(i,n)=ANSS(i);
   end
    x0=0:0.01:17;
    y0=ANSS(1)*x0.^n    ; %根據求得的係數初始化並構造多項式方程
    for num=2:1:n+1     
        y0=y0+ANSS(num)*x0.^(n+1-num);
    end
    subplot(3,3,n)
    plot(x,y,'*')
    hold on
    plot(x0,y0)
end
suptitle('不同次數方程曲線擬合結果,從1到9階')

####運行結果:
用polyfit擬合的結果與第一份代碼運行的結果基本一樣
這裏寫圖片描述

申明

本文爲本人原創,轉載請註明出處!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章