我正在使用numpy.svd来计算严格条件矩阵的奇异值分解。对于某些特殊情况,svd将不会收敛并引发Linalg.Error。我做了一些研究,发现numpy使用LAPACK的DGESDD例程。标准实现的硬编码迭代限制为35或某些迭代。如果我尝试在Matlab中分解相同的矩阵,一切正常,我认为有两个原因: 1. Matlab使用DGESVD代替DGESDD,它通常看起来更强大。 2. Matlab在例程中使用了75的迭代限制。 (他们在源代码中对其进行了更改并重新编译。)
现在的问题是:是否有一种简单的方法可以将numpy中使用的后端从DGESDD更改为DGESVD而无需修改numpy源?
提前致谢 米莎
答案 0 :(得分:1)
对我有用的是仅计算该矩阵X
的{{3}}:
U,S,V = np.linalg.svd(X, full_matrices=False)
答案 1 :(得分:0)
我有点晚了,但也许这会帮助别人......
我在julia中遇到了类似的问题。
我找到this approach from the R help list,它应该适用于任何使用lapack库的环境:
基本上,如果svd(M)失败,请尝试svd(M'),并适当地交换生成的U,V。
以下是我在朱莉娅的表现:
try
U,S,V = svd( E_restricted )
failed = false
catch
failed = true
end
if failed
# try it with matrix transposed
try
V,S,U = svd( E_restricted' )
failed = false
catch
failed = true
end
end
if failed
error("ERROR: svd(E) and svd(E') failed!")
end