linsolve() 在做什么?

计算科学 线性求解器
2021-11-29 01:07:53

我正在将一段 matlab 代码转换为 python,但我很难重新创建它为超定稀疏矩阵找到的解决方案。原始代码使用重载的左除法运算符,但我使用 linsolve() 重新创建了结果。我已经将结果与几个 scikit 求解器(OLS、岭回归、套索等)进行了比较,但没有设法匹配它。Lasso 最接近,因为 matlab 系数很稀疏,所以我认为它一定是这样的。

我已经对其进行了调试并使用 type 尝试访问源代码,但没有成功。有谁知道它使用什么求解器或我如何在“引擎盖下”获得一个峰值?

2个回答

MATLAB 的 linsolve() 函数使用 QR 分解和列旋转来为您过度确定的问题找到最小二乘解。

您可以使用

[x,r]=linsolve(A,b)

得到排名的估计A. 我相信如果A秩不足,则 MATLAB 会将所有自由变量设置为0在计算最小二乘解。如果发生这种情况,它可以解释为什么 MATLAB 的最小二乘解是稀疏的。

如果您的矩阵是全列秩,那么最小二乘解应该是唯一的,并且您的 Python 代码应该找到基本相同的解决方案。

如果您的矩阵不是满列秩,那么将有无限多的最小二乘解决方案,您的 python 代码找到一个非常不同的解决方案也就不足为奇了。只要Axb2对于您的代码和 MATLAB 获得的解决方案是相同的,您没有真正的理由抱怨。

最复杂的情​​况发生在您的矩阵条件很差以至于它处于没有完整列秩的边缘时。值非常接近。的值非常不同。 Axb2x

我建议看三件事:

  1. 比较用于 MATLAB 的解决方案和您的 Python 代码生成的解决方案。它们应该基本相等。 Axb2

  2. 在 MATLAB 中使用 [x,r]=linsolve(A,b) 获得最小二乘解以及的秩估计值。是否排名不足 的迹象。AA

  3. 采取一个相当小的测试问题并计算矩阵的条件数(在 MATLAB 中, cond(A) 将执行此操作。)这应该告诉您是否有一个有效的全列秩矩阵。 A

这些问题的答案可能有助于我们进一步指导您。

答案https://scicomp.stackexchange.com/a/1459/276提供了一些有用的建议。

如果您spparms('spumoni',1);在稀疏求解之前插入该行,它将输出算法做出的决定。很有可能,它使用了稀疏的 QR 分解。