【发布时间】:2019-08-05 15:07:53
【问题描述】:
你好 stackoverflow 社区,
我很难理解 c++ armadillo 包中的最小二乘误差问题。
我有一个矩阵 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 也很大。如果需要,我可以提供发生这种情况的值。
所以作为一个简短的背景。 我从程序中得到的矩阵是非线性振荡器的数值求解反应,我通过摆动该系统的参数将信息放入其中。 因为这个参数对系统的影响很小,所以我的不同行的值非常相似但绝不相同,否则犰狳应该会报错。 我仍然认为这是问题所在,但求解函数从未抛出任何错误。
让我感到困惑的另一件事是,在一个带有随机矩阵的简短示例程序中,解析形式比求解函数慢得多。 但在我的程序中,两者的速度几乎相同。 我想这与伪逆的数值收敛和我的矩阵的特殊情况有关,但我对犰狳的工作原理知之甚少。
我希望有人可以帮助我解决这个问题,并提前非常感谢。
【问题讨论】:
-
我不知道 Armadillo 的求解对非方阵有什么作用。但是,x = (A^T * A)^-1 *A^T * b 通过执行最小化平方差的线性回归来求解 x。你如何计算“(x-b)^2 的误差”?或者 (x-b)^2 是您衡量错误的标准吗?
-
是的,我想找到 x 以便 (A*x - b)^2 最小化。啊,对不起。我看到我忘记了那里的A。我还编辑了帖子。
-
关于随机矩阵的速度,你应该提供一些代码来看看发生了什么。否则,无法弄清楚发生了什么。
-
你有任何关于犰狳如何解决线性回归的文档吗?例如,如果您有一个超定系统(A 的行数多于列数),Matlab 的 \ 运算符执行最小二乘线性回归。
-
我认为你应该在这里发布你的问题:scicomp.stackexchange.com
标签: c++ linear-algebra armadillo