1. 程式人生 > >求解線性最小二乘系統

求解線性最小二乘系統

一個超定方程組,比如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。具體的例子如下所示: