線性最小二乘問題
m個方程求解n個未知數,有三種情況:
- m=n且A為非奇異,則有唯一解,x=A.inverse()*b
- m>n,約束的個數大于未知數的個數,稱為超定問題(overdetermined)
- m<n,負定/欠定問題(underdetermined)
通常我們遇到的都是超定問題,此時Ax=b的解是不存在的,從而轉向解最小二乘問題:
J(x)為凸函數,一階導數為0,得到:
,稱之為正規方程
一般解:
奇異值分解與線性最小二乘問題
設
列滿秩,A的奇異值分解:(公式1)
其中U和V為半酉陣,分別滿足
其中,這里的幾個符號的大小:U:mm? ?
:n
n? ?V:n
n
注意:為什么這里是n
n,是因為我上面寫的公式1中UGV,G=
,G的尺寸是m
n?
為 U 的?前 n 列矩陣,即
則:
等號當且僅
時成立,所以:
這就是我們千辛萬苦要求的線性最小二乘問題的解!!!
用eigen庫計算的例子:
//Ax=bMatrixXd A= MatrixXd::Zero(15,8);Eigen::JacobiSVD<MatrixXd> svd(A, Eigen::ComputeFullU | Eigen::ComputeFullV);Eigen::Matrix<double, 15, 15> U = svd.matrixU();Eigen::Matrix<double, 8, 8> V = svd.matrixV();Eigen::Matrix<double, 8, 8> Gama = svd.singularValues().asDiagonal();Eigen::Matrix<double, 15, 1> b;Eigen::Matrix<double, 8, 1> x = V * Gama.inverse()*(U.block<15,8>(0,0).transpose())*b;