求解線性最小二乘系統
阿新 • • 發佈:2018-12-15
一個超定方程組,比如Ax = b,沒有解。 在這種情況下,在差值Ax-b儘可能小的意義上,搜尋最接近解的向量x是有意義的。 這個x被稱為最小二乘解(如果使用歐幾里德範數)。本頁討論的三種方法是SVD分解,QR分解和正規方程。 其中,SVD分解通常是最準確的,但最慢的正規方程是最快但最不準確的,並且QR分解介於兩者之間。
使用SVD分解
BDCSVD類中的solve()方法可以直接用於求解線性方塊系統。 僅計算奇異值(此類的預設值)是不夠的; 你還需要奇異向量,但薄SVD分解足以計算最小二乘解:
#include <iostream> #include <Eigen/Dense> using namespace std; using namespace Eigen; int main() { MatrixXf A = MatrixXf::Random(3, 2); cout << "Here is the matrix A:\n" << A << endl; VectorXf b = VectorXf::Random(3); cout << "Here is the right hand side b:\n" << b << endl; cout << "The least-squares solution is:\n" << A.bdcSvd(ComputeThinU | ComputeThinV).solve(b) << endl; }
使用QR分解
QR分解類中的solve()方法也計算最小二乘解。 有三種QR分解類:HouseholderQR(沒有旋轉,如此快但不穩定),ColPivHouseholderQR(列旋轉,因此有點慢但更準確)和FullPivHouseholderQR(完全旋轉,如此最慢和最穩定)。 以下是列旋轉的示例:
使用正規方程
找到Ax = b的最小二乘解等價求解正規方程ATAx = ATb。具體的例子如下所示: