我正在使用 numpy.svd 来计算条件不良矩阵的奇异值分解。对于某些特殊情况,svd 不会收敛并引发 Linalg.Error。我做了一些研究,发现 numpy 使用 LAPACK 的 DGESDD 例程。标准实现的硬编码迭代限制为 35 次或某些迭代。如果我尝试在 Matlab 中分解相同的矩阵,一切正常,我认为有两个原因:
1. Matlab 使用 DGESVD 而不是 DGESDD,后者通常看起来更健壮。
2. Matlab 在例程中使用迭代限制为 75。 (他们在源代码中更改了它并重新编译了它。)
现在的问题是:是否有一种简单的方法可以将 numpy 中使用的后端从 DGESDD 更改为 DGESVD 而无需修改 numpy 源?
提前致谢
米沙
最佳答案
对我有用的是只计算该矩阵 X
的 "economy size" SVD :
U,S,V = np.linalg.svd(X, full_matrices=False)
关于exception - 在 numpy 的 svd 方法中使用替代 LAPACK 驱动程序?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10681812/