超定线性代数方程Ax = By的最小二乘解

时间:2014-03-28 16:50:10

标签: c++ linear-algebra eigen

我有一个Ax=By形式的线性代数方程。其中A是6x5的矩阵,x是大小为5的向量,B是大小为6的6x6y向量的矩阵。{{1 },AB是已知变量,它们的值是从传感器实时访问的。 y是未知的,必须找到。一种解决方案是找到x Least Square Estimation。这是线性代数方程的传统解。我使用x = [(A^T*A)^-1]*(A^T)B*y来解决此问题,如下所示

Eigen QR Decomposition

到目前为止,一切都很好。但是当我检查错误matrixA = getMatrixA(); matrixB = getMatrixB(); vectorY = getVectorY(); //LSE Solution Eigen::ColPivHouseholderQR<Eigen::MatrixXd> dec1(matrixA); vectorX = dec1.solve(matrixB*vectorY);// 时,它总是不为零。错误不是很大,但即使不可忽视。还有其他类型的分解更可靠吗?我已浏览了其中一个页面,但无法理解其含义或如何实现此功能。以下是参考线如何解决问题。有谁可以建议我如何实现这个?

通过形成误差向量e = Ax-By并找到最小化加权误差Ax = By的未知向量e = Ax-By来获得此类等式x的解,其中(e^T*W*e) 1}}是加权矩阵。为简单起见,该加权矩阵选择为W形式,其中W = K*S是恒定的对角缩放矩阵,S是标量权重。因此,等式的解决方案变为

K

我不明白如何形成矩阵x = [(A^T*W*A)^-1]*(A^T)*W*B*y

1 个答案:

答案 0 :(得分:2)

你的陈述&#34;但是当我检查错误e = Ax-By时,它总是不为零。 &#34;几乎总是如此,无论你的技术如何,或者你选择什么样的权重。当你有一个过度描述的系统时,你基本上试图将直线拟合到一系列点。除非偶然地将所有点精确地放在一条完美的直线上,否则会出现一些错误。因此,无论您使用何种技术来选择线,(权重等),如果点不是共线的话,您将始终遇到一些错误。替代方案是使用某种样条或更高的尺寸以允许变形。在这些情况下,您可以选择将所有点精确地拟合到更复杂的形状,因此会导致0错误。

enter image description here

因此,权重矩阵的选择只会通过给予每个点稍微不同的权重来改变您将使用的直线。所以它永远不会完全删除错误。但是如果你有一些特别的关注点比其他关键点更重要,那么在选择最小平方误差拟合时,你可以给出那些更高权重的误差。

对于样条拟合,请参阅:

http://en.wikipedia.org/wiki/Spline_interpolation

对于非常好的样条曲线插值,您可以使用Centripital Catmull-Rom,它除了找到适合所有点的曲线外,还可以防止在数据方向突然变化时出现的不必要的循环和自交叉

Catmull-rom curve with no cusps and no self-intersections