Obsah

Odhad parametrů lineárního modelu metodou nejmenších čtverců (MNČ)

Metoda nejmenších čtverců je základní metodou pro zpracování fyzikálních experimentálních měření. Základní myšlenkou je minimalizace součtu čtverců (vážených) odchylek mezi původními (měřenými) a aproximovanými hodnotami.
Následující text představuje řešení MNČ pro lineární model. Případnou linearizací a iteračním výpočtem se nezabývá.

Ilustrační příklad

Ukažme si pro ilustraci nejprve jednoduchý příklad MNČ. Poté situaci zobecníme a využijeme maticový formalizmus pro zápis a odvození základních vztahů, které se využívají při řešení komplikovanějších situací.
Předpokládejme měřená data vzdálenosti L:
clear variables;
L = [ 100.235, 100.301, 99.987 ];
Naším cílem je najít takovou hodnotu , pro kterou bude platit, že suma čtverců rozdílů mezi jednotlivými měřeními a vypočtenou hodnotou bude minimální. Pro jeden rozdíl můžeme tedy psát
(1) .
Suma čtverců rozdílů poté bude
(2) .
Cheme-li hodnotu takovou, aby byla funkce M daná vztahem (2) minimální, musíme najít extrém této funkce, kdy bude představovat proměnnou (hodnoty známe z měření jako nějaká konkrétní čísla). Derivací M podle dostáváme
(3) .
Pro extrém funkce platí, že derivace funkce v bodě extrému musí být rovna nule. Snadnou úpravou (3) a porovnáním s 0 poté dostáváme vztah
(4) ,
a tedy pro hodnotu dostáváme
(5) ,
což je známý vztah pro aritmetický průměr. Aritmetický průměr je totiž speciálním případem metody nejmenších čtverců.
Pro úplnost uveďme vztahy a postup pro N měření, tedy máme soubor měření , kdy . Poté pro sumu čtverců platí
(6) .
Vztah (3) poté zobecníme jako
(7) .
Položením vztahu (7) rovno 0 a úpravou dostáváme pro parametr očekávaný výraz pro aritmetický průměr
(8) .
N = length( L );
L_mnc = sum( L )/N;
L_prumer = mean( L );
disp( [ 'Měření: ', num2str( L, '%.4f ' ) ] )
Měření: 100.2350 100.3010 99.9870
disp( [ 'MNČ: ', num2str( L_mnc, '%.4f' ) ] )
MNČ: 100.1743
disp( [ 'Průměr: ', num2str( L_prumer, '%.4f' ) ] )
Průměr: 100.1743

Obecné odvození

MNČ pro měření stejné váhy

V této části Ilustrační příklad z předchozí části zobecníme a ukážeme si maticový formalizmus, který je vhodný zejména pro implementaci při výpočtech na PC.
Předpokládejme, že model popisující naše měření lze zapsat jako lineární kombinaci hledaných parametrů
(9) ,
kde a popisují fyzikální model měřeného problému, x je vektor parametrů, jejichž hodnoty určujeme zprostředkujícím měřením, a jsou námi hledané parametry, .
Lineární kombinaci (9) hledaných parametrů často v praktických situacích můžeme zařídit. Pokud tomu tak není, lze využít například Taylorova rozvoje k linearizaci a poté lze se znalostí přibližných hodnot parametrů sestavit iterativní výpočet MNČ.
Předpokládejme ale přímo situaci (9). Jsme-li schopni pomocí laboratorních měření sestavit N rovnic (9) (např. opakováním měření apod.), poté můžeme model psát jako soustavu rovnic v maticové formě
(10) ,
kde
, , .
Označíme-li jako vektor parametrů, které budou určeny výpočtem MNČ, poté dosazením do rovnice (10) můžeme napsat vektor odchylek levé a pravé strany této rovnice jako
(11) .
Sumu čtverců odchylek (11) poté můžeme snadno maticově zapsat jako
(12) .
Pro maticovou derivaci (12) dle parametrů poté můžeme psát
(13) .
Porovnáním derivace (13) s nulovým vektorem poté dostáváme vztah pro výpočet parametrů metodou nejmenších čtverců
(14) .
Výše uvedený motivační příklad můžeme do modelu (10) přepsat následovně:
A = ones( length(L), 1 );
l = L';
q = (A'*A)\A'*l;
disp( ['q: ', num2str( q, '%.4f' ) ] )
q: 100.1743
MATLAB využívá operátor zpětného lomítka "\" jako inverzi zleva. Pokud je počítána inverze pro nečtvercové matice, použije pro výpočet metodu nejmenších čtverců (vztah (14)). V kódu lze tak zápis zjednodušit následujícím způsobem:
q2 = A\l;
disp( ['q2: ', num2str( q2, '%.4f' ) ] )
q2: 100.1743

Příklad

Ukažme si nyní na vzorovém příkladu, jak aplikovat MNČ pro výpočet parametrů plochy, kterou aproximujeme měřená data. Předpokládejme, že nominální tvar plochy bude dán vztahem
(15) .
V následujícím kódu jsou ukázány hodnoty nominálních koeficientů a tvar nominální plochy.
clear variables;
x = linspace( -2, 2, 10 ); y = x;
[ X, Y ] = meshgrid( x, y );
a_0 = 1;
a_1 = 0.5;
a_2 = 0.3;
a_3 = 0.2;
a_4 = -0.3;
Z_nominal = a_0 + a_1*X + a_2*Y + a_3*X.^2 + a_4*Y.^2;
figure
mesh( X, Y, Z_nominal )
xlabel( 'x' )
ylabel( 'y' )
zlabel( 'z = f(x,y)' )
title( 'Nominalní tvar plochy' )
Zavedeme-li do měření z náhodný šum se směrodatnou odchylkou , poté dostáváme vektor měření Z.
Z_mereni = Z_nominal + 0.2*randn( size(Z_nominal) );
figure
mesh( X, Y, Z_mereni )
xlabel( 'x' )
ylabel( 'y' )
zlabel( 'z = f(x,y)' )
title( 'Simulované měření' )
Pro metodu MNČ můžeme model (15) maticově formulovat jako
, , ,
kde značí i-té měření z-ové souřadnice, , N je počet všech měření.
[ M, N ] = size( X );
x_vec = reshape( X, M*N, 1 );
y_vec = reshape( Y, M*N, 1 );
z_vec = reshape( Z_mereni, M*N, 1 );
A = [ ones( M*N, 1), x_vec, y_vec, x_vec.^2, y_vec.^2 ];
l = z_vec;
qa = A\l;
E = A*qa - l;
RMS = sqrt( sum( E.^2 )/length(E) );
disp( [ 'Nominalní koeficienty: ', num2str( [a_0 a_1 a_2 a_3 a_4], '%.4f ') ] )
Nominalní koeficienty: 1.0000 0.5000 0.3000 0.2000 -0.3000
disp( [ 'Vypočtené koeficienty: ', num2str( qa', '%.4f ') ] )
Vypočtené koeficienty: 0.9926 0.4896 0.2874 0.1970 -0.2857
disp( [ 'RMS aproximace: ', num2str( RMS, '%.4f' ) ] )
RMS aproximace: 0.1947

MNČ pro měření nestejné váhy (zobecněná metoda nejmenších čtverců)

Předpokládejme nyní, že hodnoty vektoru l jsou různých vah , a jsou vzájemně nezávislé. Metoda nejmenších čtverců je pak definována tak, že minimalizuje sumu čtverců vážených odchylek, tj.
(16) ,
což lze maticově elegantně zapsat jako
(17)
kde P je diagonální matice vah
.
Obdebně jako v předchozím případě poté položením derivace rovno nulovému vektoru a řešením jednoduché rovnice dostáváme základní vztah pro výpočet parametrů metodou nejmenších čtverců, platí
(18) .
Vztah (18) platí i v obecnějším případě, kdy matice P není diagonální, ale obecně čtvercová, symetrická a pozitivně definitní.

Zákon přenášení (šíření) variancí (ZPV)

Základní pojmy

Než přistoupíme k odvození zákona přenášení variancí a jeho aplikaci na odhad nejistot vypočtených parametrů, uveďme některé základní pojmy matematické statistiky. Nebudeme uvádět úplný výčet a popis vlastností, ten může student nalézt v snadno dostupné literatuře.

Spojitá jednorozměrná náhodná veličina

Pro následující odvození pouze shrňme základní pojmy pro jednorozměrnou náhodnou veličinu.
Střední hodnota spojité náhodné veličiny X s hustotou pravděpodobnostního rozdělení je definována jako
(19) .
Variance náhodné veličiny X je definována jako
(20) .
Směrodatná odchylka náhodné veličiny X je definována jako
(21) .

Vícerozměrná náhodná veličina

Uveďme nyní definiční vztahy základních pojmů pro vícerozměrnou náhodnou veličinu, které jsou zobecněním vztahů (19)-(21).
Vektor středních hodnot náhodné veličiny X je obdobně jako v případě (19) definován jako
(22) .
Kovarianční matice (variančně-kovarianční matice) náhodné veličiny X je definována jako
(23) , .
Rozepíšeme-li podrobněji vztah (23) do matice, dostáváme
(24)
kde
(25)
značí tzv. kovarianci mezi dvěma náhodnými veličinami a . Kovarianci charakterizuje vzájemnou závislost dvou veličin. Jsou-li tyto veličiny navzájem nezávislé, potom je rovna nule. Jsou-li určitým způsobem závislé, poté nabývá kovariance hodnot od 0 do 1.
Kovarianční matice pro vzájemně nezávislé veličiny poté bude mít tvar diagonální matice, kde na diagonále budou variance jednotlivých náhodných veličin, tedy
(26) .
Je zřejmé, že známe-li kovarianční matici, můžeme směrodatnou odchylku i-té veličiny určit jako odmocninu z i-tého diagonálního prvku, tj.
(27) .

ZPV pro lineární model

Předpokládejme, že máme dva vektory náhodných veličin a , které jsou v následujícím snadném lineárním vztahu
(28) ,
kde A a b jsou konstantní matice a vektor. Jinými slovy každou z veličin můžeme vyjádřit jako lineární kombinaci veličin X. V řadě praktických situacích je toto splněno. Případně můžeme zajistit linearitu např. pomocí Taylorova rozvoje s využitím pouze jeho prvních členů, tzv. linearizaci.
Nechť dále známe kovarianční matici náhodných veličin X. A a b jsou konstanty, tj. nemají kovarianční matici.
Jaká bude v tomto případě kovarianční matice veličin Y? Dosazením do definice kovarianční matice (23) dostáváme
(29) .
Vyjádříme-li střední hodnotu jako
(30) ,
poté dosazením (30) do (29) dostáváme
(31)
Tím dostáváme tzv. zákon přenášení (šíření) variancí, tj.
(32) .
Budou-li veličiny X vzájemně nezávisle, a tedy jejich kovarianční matice bude diagonální, poté pro i-tou veličinu platí
(33) ,
nebo také
(34) .

ZPV pro nelineární model

Zobecněme nyní zákon přenášení variancí na nelineární model. Jak již bylo řečeno, lze nelineární model tzv. linearizovat pomocí Taylorovy řady s uvážením pouze lineárních členů, a poté aplikovat výše uvedené vztahy obdobným způsobem.
Podmínkou pro linearizaci je, že musí existovat Taylorova řada modelu, tj. funkce popisující daný model musí mít parciální derivace dle hledaných proměnných, a uvážení prvního přiblížení (pouze lineárních členů) dává dostatečně přesnou aproximaci (tj. malá změna parametrů způsobí pouze malou změnu funkčních hodnot modelu).
Nechť je zkoumaný nelineární model dán vztahem
(35) ,
kde je vektorová funkce parametrů X, jejichž kovarianční matici známe. Linearizací použítím Taylorova rozvoje a zanedbáním členů vyšších prvního přiblížení (uvážení pouze lineárních členů) dostáváme
(36) ,
kde, značí vektor počátečních parametrů (přibližné hodnoty parametrů, konstanty), dX je vektor přírůstků parametrů, J je tzv. Jakobiho matice prvních derivací. Jestliže jsou počáteční hodnoty konstanty a náhodnou složku budou obsahovat tedy pouze přírůstky dX, poté pro kovarianční matici parametrů bude platit (s uvážením )
(37) .
Vztah (36) je tedy obdobného charakteru jako (28), a tedy pro zákon přenášení variancí můžeme použít obdobu výsledného vztahu (32), tedy
(38) .
Budou-li parametry X vzájemně nezávislé, poté bude kovarianční matice diagonální s variancemi parametrů na diagonále. Zákon přenášení variancí (38) poté můžeme psát jako
(39) .

Odhad nejistoty parametrů vypočtených pomocí MNČ

V případě, že měření l představují náhodné veličiny s normálním pravděpodobnostním rozdělením, poté můžeme pro váhovou matici P psát
(40) ,
kde je kovarianční matice měření. Podíváme-li se na vztah (18), ten je nezávislý na násobení váhové matice konstantou. Můžeme tak obecněji psát
(41) ,
kde je tzv. apriorní jednotková směrodatná variance (variance jednotkové váhy). Lze ukázat, že pro ní platí vztah
(42) ,
kde N značí počet měření l a M počet parametrů q.
Dosazením (41) do (18) bychom dostali stejný výsledek. Konstantu tak můžeme volit, aniž bychom teoreticky ovlivnili výsledek vyrovnání.
Není-li předem apriorně známa, lze ji odhadnout z vyrovnaných měření. Lze ukázat, že tzv. nestranný odhad aposteriorní jednotkové variance je dán vztahem
(43) .
Známe-li směrodatné odchylky jednotlivých měření l (případně odhady těchto odchylek - nejistot), můžeme snadno sestrojit kovarianční matici dle (24), případně v případě nezávislých měření dle (25) získáme matici diagonální, kdy jednotlivé prvky diagonály budou čtverce směrodatných odchylek - variance.
Zabývejme se nyní určením odhadu kovarianční matice vyrovnaných parametrů dle vztahu (18). Vztah (18) můžeme přeformulovat jako
(44) ,
kde a je někdy nazývána tzv. maticí kofaktorů. Užitím zákona přenášení variancí (32) poté dostáváme
(45)
Tedy pro odhad kovarianční matice vyrovnaných parametrů můžeme shrnout
(46)
Aposteriorní odhad kvality měření můžeme opět provést pomocí zákona přenášení variancí, platí
(47) .

Příklad

Určeme nyní aposteriorní odhad nejistot vyrovnaných parametrů z předchozího příkladu.
sig_0_2 = E'*E/( length(l) - length(qa) ); % aposteriorni jednotkova variance
P = eye( length(l) ); % jednotkove vahy
SIG_q = sig_0_2*inv( A'*P*A ); % kovariancni matice vyrovnanych parametru
sig_q = sqrt( diag( SIG_q ) ); % smerodatne odchylky vyrovnanych parametru
for is = 1:length( qa )
disp( ['a_', num2str( is-1 ), ': ', num2str( qa(is), '%.4f' ), ' (', num2str( sig_q(is), '%.4f'), ')' ] );
end
a_0: 0.9926 (0.0378) a_1: 0.4896 (0.0157) a_2: 0.2874 (0.0157) a_3: 0.1970 (0.0139) a_4: -0.2857 (0.0139)

Shrnutí odhadu parametrů metodou nejmenších čtverců a aposteriorního odhadu jejich nejistot

  1. Problém vhodně formulujeme tak, aby šel maticově zapsat jako: .
  2. Sestavíme nebo využijeme znalost kovarianční matice měření l k sestavení matice vah P: , nebo , kde použijeme buď apriorní jednotkovou varianci nebo ji nejprve volíme rovnu jedné, vypočteme její aposteriorní odhad a sestavení vah opakujeme. V případě měření stejné váhy volíme P jako jednotkovou matici.
  3. Vypočteme vyrovnané parametry dle vztahu: .
  4. Vypočteme odhad aposteriorní jednotkové variance: , kde N značí počet měření l a M počet parametrů q.
  5. Vypočteme aposteriorní odhad kovarianční matice vyrovnaných parametrů: .
  6. Směrodatné odchylky jednotlivých parametrů jsou dány odmocninou z diagonálních prvků kovarianční matice.
  7. Případně vypočteme aposteriorní odhad kovarianční matice měření: .

Příklady

Tato část prezentuje vybrané příklady, které slouží k hlubšímu pochopení a praktickému procvičení aplikace MNČ a odhadnu nejistot vypočtených parametrů v různých situacích. Data jsou nejprve simulována na nominálních datech, a poté je vypočtena aproximace MNČ. Je tak možné porovnat výsledky aproximace s nominálními hodnotami.

Aproximace polynomem

clear variables;
% Simulace dat polynomu
x = ( 0:5:50 )';
% Nominalni koeficienty
a_0 = 5; a_1 = 0.2; a_2 = 0.005; a_3 = -0.0001;
% Data y se zavedenim sumu
p = [ a_3, a_2, a_1, a_0 ];
y = polyval( p, x ) + 0.2*randn(size(x));
% Sestaveni matice A pro MNC, A_i = [ x^M, x^(M-1), ..., x^2, x, 1 ]; l je
% totozna s y
N = length(x);
A = ones( N, length(p) );
if length(p) > 1
for iN = 1:length(p)-1
A(:,iN) = x.^( length(p) - iN );
end
end
% Vypocet MNC
q = A\y;
% Residua
E = A*q - y;
% Nejistota vypoctenych parametru
sig_0_2 = E'*E/( length(y) - length(q) );
SIG_q = sig_0_2*inv( A'*A );
sig_q = sqrt( diag( SIG_q ) );
% Aposteriorni odhad nejistoty mereni
SIG_l = A*SIG_q*A';
sig_l = sqrt( diag( SIG_l ) );
% Tisk grafu s jemnejsim delenim aproximovanych dat
x_plot = linspace( min(x), max(x), 100 );
y_plot = polyval( q, x_plot );
figure
errorbar( x, y, sig_l, 'x' ) % Merena data i s aposteriornim odhadem nejistot mereni
hold on
plot( x_plot, y_plot, 'r-' ) % Aproximovana data
hold off
xlabel( 'x' )
ylabel( 'y' )
title_text = cell( length(p), 1 ); % Tvorba titulku formou bunky (vice radku popisku)
for it = 1:length(p)
title_text{it} = [ 'a_', num2str(length(p)-it), ' = ', num2str( q(it), '%.5f' ), ' (', num2str( sig_q( it ), '%.5f' ), ')' ];
end
title( title_text )
grid on
legend( 'měřená data \pm \sigma_{aposteriori}', 'aproximace', 'location', 'southeast' ) % Zobrazeni legendy

Aproximace přímých měření různé přesnosti

Vzdálenost L je měřena různými způsoby s různými nejistotami . Metodou MNČ vypočteme odhad skutečné hodnoty vzdálenosti a její nejistoty. Uvážíme-li nejistoty, poté výpočet MNČ odpovídá váženému průměru. Nebudeme-li uvažovat nejistoty, výpočet je poté roven průměru aritmetickému. Pro přehled jen uveďme použité vztahy pro aritmetický a vážený průměr, které lze snadno získat aplikací MNČ.

Aritmetický průměr

,
.

Vážený průměr

,
.
clear variables;
% Merena data
L = [ 90.123 90.114 90.220 89.905 ]';
% Nejistoty mereni
uL = [ 0.010 0.015 0.100 0.500 ]';
% Vypocet MNC bez vah
A = ones( length(L), 1 );
q = A\L;
E = L - q;
sig_0_2 = E'*E/( length(E) - length(q) );
SIG_q = sig_0_2*inv( A'*A );
sig_q = sqrt( diag( SIG_q ) );
% Aritmeticky prumer
qk = mean( L );
Ek = L - qk;
sig_qk = sqrt( Ek'*Ek/length(L)/( length(L) - 1 ) );
disp( [ 'MNČ bez vah: ', num2str( q, '%.4f' ), ' (' num2str( sig_q, '%.4f' ) '), aritmetický průměr: ', num2str( qk, '%.4f' ), ' (' num2str( sig_qk, '%.4f' ) ')' ] )
MNČ bez vah: 90.0905 (0.0663), aritmetický průměr: 90.0905 (0.0663)
% Vypocet vah
P = diag( uL(1)^2./( uL.^2 ) );
% MNC s vahami
qw = ( A'*P*A )\( A'*P*L );
E = L - qw;
sig_0_2 = E'*P*E/( length(E) - length(qw) );
SIG_qw = sig_0_2*inv( A'*P*A );
sig_qw = sqrt( diag( SIG_qw ) );
% Vazeny prumer
qkw = sum( diag(P).*L )/sum( diag(P) );
Ekw = L - qkw;
sig_qkw = sqrt( Ekw'*P*Ekw/sum( P(:) )/( length(L) - 1 ) );
disp( [ 'MNČ s váhami: ', num2str( qw, '%.4f' ), ' (' num2str( sig_qw, '%.4f' ) '), vážený průměr: ', num2str( qkw, '%.4f' ), ' (' num2str( sig_qkw, '%.4f' ) ')' ] )
MNČ s váhami: 90.1209 (0.0057), vážený průměr: 90.1209 (0.0057)

Aproximace plochy sférou

clear variables;
% Simulace dat na sfere
x = 0:5:50; y = x; % rozsah os
R = 80; % polomer nominalni sfery
x0 = 25; y0 = 25; % stred nominalni sfery
c = -1/R; % vrcholova krivost
[ X, Y ] = meshgrid( x, y ); % grid souradnic
RHO = sqrt( ( X - x0 ).^2 + (Y - y0).^2 ); % decentrace
% simulovana plocha i s sumem
Z = 25 + c*RHO.^2./( 1 + sqrt( 1 - c^2*RHO.^2 ) ) + 0.1*randn( size( X ) );
figure
mesh( X, Y, Z )
axis equal
xlabel( 'x' ); ylabel( 'y' ); zlabel( 'z' ); title( 'Měřená data' );
% Preskupeni matic do sloupcovych vektoru
[ M, N ] = size( X );
X = reshape( X, M*N, 1 );
Y = reshape( Y, M*N, 1 );
Z = reshape( Z, M*N, 1 );
% Sestaveni rovnic pro MNC
NN = length( X );
A = zeros( NN*(NN-1)/2, 3 );
l = zeros( NN*(NN-1)/2, 1 );
% Ak = [];
% lk = [];
idx1 = 0; idx2 = 0;
for iN = 1:NN-1
idx1 = idx2 + 1;
idx2 = idx1 + NN - iN - 1;
A( idx1:idx2, : ) = [ X(iN) - X(iN+1:end), Y(iN) - Y(iN+1:end), Z(iN) - Z(iN+1:end) ];
l( idx1:idx2 ) = 0.5*( ( X(iN)^2 + Y(iN)^2 + Z(iN)^2 ) - ( X(iN+1:end).^2 + Y(iN+1:end).^2 + Z(iN+1:end).^2 ) );
% Ak = [ Ak; X(iN) - X(iN+1:end), Y(iN) - Y(iN+1:end), Z(iN) - Z(iN+1:end) ];
% lk = [ lk; 0.5*( ( X(iN)^2 + Y(iN)^2 + Z(iN)^2 ) - ( X(iN+1:end).^2 + Y(iN+1:end).^2 + Z(iN+1:end).^2 ) ) ];
end
% Poloha stredu vypoctena pomoci MNC
rc = A\l;
% Vektor residui
E = A*rc - l;
% Nejistota polohy stredu
sig_0_2 = E'*E/( length( l ) - length( rc ) );
SIG_rc = sig_0_2*inv( A'*A );
sig_rc = sqrt( diag( SIG_rc ) );
disp( [ 'x_c = ', num2str( rc(1), '%.4f'), ' (', num2str( sig_rc(1), '%.4f') ')' ] );
x_c = 25.0313 (0.0056)
disp( [ 'y_c = ', num2str( rc(2), '%.4f'), ' (', num2str( sig_rc(2), '%.4f') ')' ] );
y_c = 25.1191 (0.0056)
disp( [ 'z_c = ', num2str( rc(3), '%.4f'), ' (', num2str( sig_rc(3), '%.4f') ')' ] );
z_c = -55.0052 (0.0433)
% Odhad polomeru sfery
Ri = sqrt( ( X - rc(1) ).^2 + ( Y - rc(2) ).^2 + ( Z - rc(3) ).^2 );
Rmnc = mean( Ri );
% Odchylky ve smeru polomeru
ER = Ri - Rmnc;
% Stredni kvadraticka odchylka polomeru
RMS = sqrt( ER'*ER/length( ER ));
% Histogram residui s hodnocenim RMS
figure
histogram( ER, 15 )
xlabel('\DeltaR')
ylabel('četnost')
title( { 'Histogram residuí \DeltaR' , [ 'RMS_R = ', num2str( RMS, '%.4f' ) ] } )