簡體   English   中英

在 Matlab 中使用最小二乘法進行參數估計

[英]Parameters Estimation using Least Square Method in Matlab

我有下一個問題:考慮一組方程y=ax+b ,其中我知道 y 和 x 並想使用最小二乘法估計ab 讓我們假設有Y=[y1 ; y2] Y=[y1 ; y2]
A=[x1 1; x2 1] A=[x1 1; x2 1]使得Y=A*[a;b]

根據最小二乘法: B=[a;b]=( transpose(A)*A )^-1*transpose(A)*Y

  1. (A'*A) \\ A'*YA\\Y是一樣的嗎?

  2. 哪個是計算 B 的最佳方法:

    inv( transpose(A)*A ) *transpose(A)*Y

    (transpose(A)*A) \\ transpose(A)*Y

    (A'*A) \\ A'*Y

    pinv(A)*Y (計算偽逆矩陣)

以上所有給出的結果略有不同

在解決您的疑問之前,必須進行評論。 當您想使用速記運算符轉置矩陣時……您不應該使用' ,而是.' . 第一個是共軛轉置的速記運算符,而第二個是用於transpose的正確速記運算符。 雖然它們通常會產生相同的結果,但將前者與包含復數的矩陣一起使用可能會擾亂您的計算。

由於您沒有提供數據樣本,以下是我為測試部署的設置:

Y = [2; 4];
A = [3 1; 7 1];

現在,讓我們一步一步來。 對於您的第一個答案,是的,從數學角度來看,這兩個操作是等效的,並且產生的結果基本相同:

>> B = A \ Y

B =
    0.5
    0.5

-----------------------------

>> B = inv(A.' * A) * A.' * Y

B =
    0.500000000000001
    0.5

您看到的細微差別是由於INV(A) * b不如A \\ b准確,如果您將對inv函數的調用懸停在乘法之后,即使 Matlab 代碼解釋器也清楚地說明了這一點(應標有橙色警告突出顯示):

警告

這也部分回答了您的第二個問題,但讓我們做一個詳盡的基准測試。 我放棄了使用inv(A.' * A) * A.' * Y執行的計算 inv(A.' * A) * A.' * Y因為建議避免它。 開始了:

tic();
for i = 1:100000
    B = A \ Y;
end
toc();

tic();
for i = 1:100000
    B = pinv(A) * Y;
end
toc();

tic();
for i = 1:100000
    B = (A.' * A) \ A.' * Y;
end
toc();

這是基准測試的結果:

Elapsed time is 0.187067 seconds.
Elapsed time is 2.987651 seconds.
Elapsed time is 2.173117 seconds.

鑒於這三種方法具有相同的准確度……第一種方法顯然是迄今為止最快的方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM