【问题标题】:Different least square errors with armadillo functions犰狳函数的不同最小二乘误差
【发布时间】: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


【解决方案1】:

感谢您的回复。我想我已经解决了这个问题,并想为遇到同样问题的每个人提供一些反馈。

犰狳求解函数给出了最小化 (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 左右,与没有正则化的公式相比,误差几乎没有变化。

【讨论】:

    猜你喜欢
    • 2012-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多