我正在将一段 matlab 代码转换为 python,但我很难重新创建它为超定稀疏矩阵找到的解决方案。原始代码使用重载的左除法运算符,但我使用 linsolve() 重新创建了结果。我已经将结果与几个 scikit 求解器(OLS、岭回归、套索等)进行了比较,但没有设法匹配它。Lasso 最接近,因为 matlab 系数很稀疏,所以我认为它一定是这样的。
我已经对其进行了调试并使用 type 尝试访问源代码,但没有成功。有谁知道它使用什么求解器或我如何在“引擎盖下”获得一个峰值?
我正在将一段 matlab 代码转换为 python,但我很难重新创建它为超定稀疏矩阵找到的解决方案。原始代码使用重载的左除法运算符,但我使用 linsolve() 重新创建了结果。我已经将结果与几个 scikit 求解器(OLS、岭回归、套索等)进行了比较,但没有设法匹配它。Lasso 最接近,因为 matlab 系数很稀疏,所以我认为它一定是这样的。
我已经对其进行了调试并使用 type 尝试访问源代码,但没有成功。有谁知道它使用什么求解器或我如何在“引擎盖下”获得一个峰值?
MATLAB 的 linsolve() 函数使用 QR 分解和列旋转来为您过度确定的问题找到最小二乘解。
您可以使用
[x,r]=linsolve(A,b)
得到排名的估计. 我相信如果秩不足,则 MATLAB 会将所有自由变量设置为在计算最小二乘解。如果发生这种情况,它可以解释为什么 MATLAB 的最小二乘解是稀疏的。
如果您的矩阵是全列秩,那么最小二乘解应该是唯一的,并且您的 Python 代码应该找到基本相同的解决方案。
如果您的矩阵不是满列秩,那么将有无限多的最小二乘解决方案,您的 python 代码找到一个非常不同的解决方案也就不足为奇了。只要对于您的代码和 MATLAB 获得的解决方案是相同的,您没有真正的理由抱怨。
最复杂的情况发生在您的矩阵条件很差以至于它处于没有完整列秩的边缘时。值非常接近。和的值非常不同。
我建议看三件事:
比较用于 MATLAB 的解决方案和您的 Python 代码生成的解决方案。它们应该基本相等。
在 MATLAB 中使用 [x,r]=linsolve(A,b) 获得最小二乘解以及的秩估计值。是否排名不足 的迹象。
采取一个相当小的测试问题并计算矩阵的条件数(在 MATLAB 中, cond(A) 将执行此操作。)这应该告诉您是否有一个有效的全列秩矩阵。
这些问题的答案可能有助于我们进一步指导您。
答案https://scicomp.stackexchange.com/a/1459/276提供了一些有用的建议。
如果您spparms('spumoni',1);
在稀疏求解之前插入该行,它将输出算法做出的决定。很有可能,它使用了稀疏的 QR 分解。