數(shù)值分析:多元線性擬合和一元非線性擬合

前言

最小二乘線性擬合是常規(guī)操作,本文直接跨過(guò)。由于多元線性擬合和一元非線性擬合關(guān)系密切,故本文將其二放在一起討論。本文重點(diǎn)是實(shí)現(xiàn)單元的非線性擬合。最后補(bǔ)充一句:不論是一元線性、一元非線性、多元線性,其核心思想都是:多項(xiàng)式擬合;核心方法都是:最小二乘原理。

多元非線性擬合原理

定義:變量ym個(gè)自變量x_j(j=1,2,\cdots,m)都存在線性關(guān)系,即構(gòu)成了多元線性關(guān)系:

y = a_0 + a_1x_1 + a_2x_2 + \cdots + a_mx_m

每一個(gè)自變量x_j都有一組(有n個(gè))測(cè)量值,我們可以記做:x_{ij}(i=1,2,\cdots,n)。注意:n>m,因?yàn)榉匠虜?shù)要比未知數(shù)多。變量序號(hào)與其觀測(cè)值序號(hào)如下表:

觀測(cè)值序號(hào)\變量序號(hào) x_1 x_2 \cdots x_{m-1} x_m y
1 x_{11} x_{12} \cdots x_{1(m-1)} x_{1m} y_1
2 x_{21} x_{22} \cdots x_{2(m-1)} x_{2m} y_2
\vdots \vdots \vdots \vdots \vdots \vdots \vdots
n x_{n1} x_{n2} \cdots x_{n(m-1)} x_{nm} y_n

如何衡量擬合效果?還是根據(jù)最小二乘原理,只不過(guò)是未知參數(shù)多了一些而已?,F(xiàn)在的未知數(shù)為a_i,即將最小二乘原理運(yùn)用到包含m+1個(gè)a_i的函數(shù)上即可:

設(shè)\quad F = F(a_0,a_1,\cdots,a_m)

F = \sum_{i=1}^{n}\left[ y_i - (a_0 + a_1x_{i1} + a_2x_{i2} + \cdots + a_mx_{im} )\right]^2

對(duì)于上式,我們一次對(duì)F求各個(gè)a_i的偏導(dǎo)數(shù)并令其值為0,可得如下m+1個(gè)方程:

\frac{\partial F}{\partial a_0} = 0,\frac{\partial F}{\partial a_1} = 0,\frac{\partial F}{\partial a_2} = 0,\cdots,\frac{\partial F}{\partial a_m} = 0

最后用于求解的正規(guī)方程組為:

a_0n \quad + a_1\sum_{i=1}^{n}x_{i1} + \quad a_2\sum_{i=1}^{n}x_{i2}\quad + \cdots + a_m\sum_{i=1}^{n}x_{im} \quad\quad = \sum_{i=1}^{n}y_{i}

a_0\sum_{i=1}^{n}x_{i1} + a_1\sum_{i=1}^{n}x_{i1}x_{i1} + a_2\sum_{i=1}^{n}x_{i1}x_{i2} + \cdots + a_m\sum_{i=1}^{n}x_{i1}x_{im} = \sum_{i=1}^{n}x_{i1}y_{i}

\cdots

a_0\sum_{i=1}^{n}x_{im} + a_1\sum_{i=1}^{n}x_{im}x_{i1} + a_2\sum_{i=1}^{n}x_{im}x_{i2} + \cdots + a_m\sum_{i=1}^{n}x_{im}x_{im} = \sum_{i=1}^{n}x_{im}y_{i}

解上面的線性方程組即可得到一些列系數(shù)。

一元非線性擬合

為什么說(shuō)一元非線性擬合和多元線性擬合關(guān)系密切呢?因?yàn)闉榱擞?jì)算方便,我們會(huì)使用變量替換的方法,將一元非線性各階式子用不同的變量代替,轉(zhuǎn)換成多元非線性,然后用上面的正規(guī)方程組求解。

例如:已知有n組非線性數(shù)據(jù)(x_i,y_i)(i = 1,2,\cdots,n),用m階一元非線性多項(xiàng)式擬合:

y = a_0 + a_1x + a_2x^2 + \cdots + a_mx^m,n>m

我們只需要用t_j = x^j代換(j = 1,2,\cdots,m),就可以將一元非線性轉(zhuǎn)換為多元線性:

y = a_0 + a_1t_1 + a_2t_2 + \cdots + a_mt_m

用上面多元線性的操作,根據(jù)最小二乘原理令關(guān)于每個(gè)未知系數(shù)的偏導(dǎo)數(shù)為0,可得正規(guī)方程的矩陣的通用形式如下:

圖1:一元非線性擬合最終系數(shù)的求解方程

關(guān)于上面最終求解方法有3個(gè)細(xì)節(jié)要注意

  • 觀測(cè)值個(gè)數(shù)n只出現(xiàn)在求和的上限,故不影響矩陣結(jié)構(gòu);
  • 系數(shù)a_i的個(gè)數(shù),要比多項(xiàng)式最高階數(shù)多1個(gè),即多了前面的a_0;
  • 系數(shù)矩陣為對(duì)稱(chēng)方陣,尺寸比多項(xiàng)式最高階次m多1。

舉一個(gè)例子

如何現(xiàn)在有n=10個(gè)觀測(cè)數(shù)據(jù),想要最高階數(shù)m=2的多項(xiàng)式擬合,即:

y = a_0 + a_1x +a_2x^2

最終求解矩陣(尺寸:m+1 = 3)就是:

圖2:例子的最終求解矩陣

用Matlab實(shí)現(xiàn)任意階非線性擬合

數(shù)據(jù)自己給,然后輸入想要的階數(shù)后,自動(dòng)求解擬合公式:

% 任意多項(xiàng)式擬合數(shù)據(jù)點(diǎn), 當(dāng)然最好不要超過(guò)6階

clear; clc;

% 這里修改原始觀測(cè)數(shù)據(jù):
xnum = 1:10;
ynum = [3.8 6.3 7.9 8.6 9.2 9.5 9.7 9.9 10.1 10.2];

m = double(input('擬合階數(shù)m = '));
n = length(xnum);

% 等號(hào)左邊矩陣: 每個(gè)元素的冪 = row + col -2
A = zeros(m+1,m+1);
for row = 1:m+1
    for col = 1:m+1
        A(row,col) = sum(xnum.^(row+col-2));
    end
end

% 等號(hào)右邊矩陣: 一行m+1列
B = zeros(m+1,1);
for num = 1:m+1
    B(num,1) = sum((xnum.^(num-1)).*ynum);
end

% 多項(xiàng)式系數(shù)/方程求解:
a = inv(A)*B;

syms x;
ytmp = sym(zeros(1,m+1));
for num = 1:num
    ytmp(num) = x^(num-1);
end
fprintf('擬合結(jié)果為:\n');
y = vpa(sum(ytmp.*a'),6)   % 擬合的多項(xiàng)式結(jié)果

figure(1);
scatter(xnum,ynum);
hold on;
x = min(xnum):0.1:max(xnum);
y = double(subs(y));
plot(x,y);
grid on;
xlabel('x'); ylabel('y');
title('原點(diǎn)為樣本點(diǎn);實(shí)線為多項(xiàng)式擬合結(jié)果');

例如5階效果:

圖3:5階非線性擬合結(jié)果
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容