在numpy的的SVD方法使用替代LAPACK驱动程序?(Using alternative LAP

2019-09-17 09:33发布

我使用numpy.svd计算条件不好矩阵的奇异值分解。 对于一些特殊情况下,SVD不会收敛,养Linalg.Error。 我做了一些研究,发现numpy的使用从LAPACK的DGESDD程序。 该标准的实施具有35次或东西迭代硬编码的迭代限制。 如果我试图分解在Matlab同一矩阵,一切工作正常,我认为有两个原因:1,MATLAB的使用DGESVD代替DGESDD这在一般似乎更加稳健。 2. Matlab的使用的75中的程序的迭代极限。 (他们在源改变了它并重新编译它。)

现在的问题是:有没有一种简单的方法从DGESDD在numpy的改变所使用的后端DGESVD,而无需修改numpy的来源?

在此先感谢米沙

Answer 1:

什么工作对我来说是只计算“经济规模” SVD是矩阵X

U,S,V = np.linalg.svd(X, full_matrices=False)


Answer 2:

我有点晚,但也许这将帮助别人...

我有一个类似的问题朱莉娅 。

我发现从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


文章来源: Using alternative LAPACK driver in numpy's svd method?