在numpy的svd方法中使用备用LAPACK驱动程序?

时间:2012-05-21 08:29:43

标签: exception numpy lapack svd

我正在使用numpy.svd来计算严格条件矩阵的奇异值分解。对于某些特殊情况,svd将不会收敛并引发Linalg.Error。我做了一些研究,发现numpy使用LAPACK的DGESDD例程。标准实现的硬编码迭代限制为35或某些迭代。如果我尝试在Matlab中分解相同的矩阵,一切正常,我认为有两个原因: 1. Matlab使用DGESVD代替DGESDD,它通常看起来更强大。 2. Matlab在例程中使用了75的迭代限制。 (他们在源代码中对其进行了更改并重新编译。)

现在的问题是:是否有一种简单的方法可以将numpy中使用的后端从DGESDD更改为DGESVD而无需修改numpy源?

提前致谢 米莎

2 个答案:

答案 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