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

Posted

技术标签:

【中文标题】犰狳函数的不同最小二乘误差【英文标题】:Different least square errors with armadillo functions 【发布时间】:2019-08-05 15:07:53 【问题描述】:

你好 *** 社区,

我很难理解 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 【参考方案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 左右,与没有正则化的公式相比,误差几乎没有变化。

【讨论】:

以上是关于犰狳函数的不同最小二乘误差的主要内容,如果未能解决你的问题,请参考以下文章

常用算法知识:最小二乘的几何意义及投影矩阵

线性最小二乘两种方法

PCL最小二乘法进行平面拟合原理

在两组点上找到平移和缩放以获得距离的最小二乘误差?

线性代数之——最小二乘

最小二乘回归,岭回归,Lasso回归,弹性网络