我使用numpy.svd计算条件不好矩阵的奇异值分解。 对于一些特殊情况下,SVD不会收敛,养Linalg.Error。 我做了一些研究,发现numpy的使用从LAPACK的DGESDD程序。 该标准的实施具有35次或东西迭代硬编码的迭代限制。 如果我试图分解在Matlab同一矩阵,一切工作正常,我认为有两个原因:1,MATLAB的使用DGESVD代替DGESDD这在一般似乎更加稳健。 2. Matlab的使用的75中的程序的迭代极限。 (他们在源改变了它并重新编译它。)
现在的问题是:有没有一种简单的方法从DGESDD在numpy的改变所使用的后端DGESVD,而无需修改numpy的来源?
在此先感谢米沙
什么工作对我来说是只计算“经济规模” SVD是矩阵X
:
U,S,V = np.linalg.svd(X, full_matrices=False)
我有点晚,但也许这将帮助别人...
我有一个类似的问题朱莉娅 。
我发现从R帮助列表这种做法 ,应该使用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