犰狳函数的不同最小二乘误差

Different least square errors with armadillo functions

本文关键字:小二 误差 函数      更新时间:2023-10-16

Hello stackoverflow community,

我在理解 c++ 犰狳包中的最小二乘错误问题时遇到了麻烦。

我有一个矩阵 A,其行数比列多得多(例如 5000 到 100 行(,因此它被过度确定。 我想找到 x,以便 A*x=b 给我最小二乘误差。

如果我在我的数据上使用犰狳的求解函数,例如"x = Solve(A,b(","(A*x-b(^2"的误差有时会很高。 另一方面,如果我用"x = (A^T * A(^-1 *A^T * b"的解析形式求解x,则结果总是正确的。 在这两种情况下,x 的结果可能相差 10 个数量级。 我原以为如果系统过度确定,犰狳会在后台使用这种分析形式。 现在我想了解为什么这两种方法会产生如此不同的结果。

我想给出一个简短的示例程序,但我无法用简短的程序重现这种行为。 我想在这里给出矩阵,但 5000 乘以 100 它也非常大。如果需要,我可以提供发生这种情况的值。

所以作为一个简短的背景。 我从程序中得到的矩阵是非线性振荡器的数值求解反应,我通过摆动该系统的参数将信息放入其中。 因为这个参数对系统的影响很小,所以我不同行的值非常相似,但永远不会相同,否则犰狳应该会抛出错误。 我仍然认为这就是问题所在,但求解函数从未抛出任何错误。

另一件让我感到困惑的事情是,在一个带有随机矩阵的简短示例程序中,解析形式比求解函数慢。 但在我的程序中,两者都几乎相同。 我想这与伪逆的数值收敛性和我的矩阵的特殊情况有关,但为此我对犰狳的工作原理还不够了解。

我希望有人可以帮助我解决这个问题,并提前非常感谢。

感谢您的回复。我想我想出了问题,并希望为每个遇到同样问题的人提供一些反馈。

犰狳求解函数给了我最小化 (A*x-b(^2 的 x。 我查看了 x 的值,它们有时在 10^13 的幅度。 这是因为我的矩阵的行只是略有变化。(所以几乎线性依赖但不完全(。 正因为如此,我的双打数值精度很高,因此我的错误有时会跳来跳去。

如果我使用重新排列的分析公式 (A^T * A(*x = *A^T * b 和求解函数,这个问题不再发生,因为 x 的拟合值在 10^4 的幅度。最小二乘误差略高,但这没关系,因为我想避免过度拟合。

我现在通过求解 (A^T * A + lambda*Identity_Matrix(*x = *A^T * b 与犰狳的求解函数额外添加了 Tikhonov 正则化。 现在,权重向量约为 1,与没有正则化的公式相比,误差几乎没有变化。