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

5
我正在使用numpy.svd来计算条件较差矩阵的奇异值分解。对于一些特殊情况,SVD无法收敛,并引发Linalg.Error。我进行了一些研究,发现numpy使用来自LAPACK的DGESDD例程。标准实现有一个硬编码的迭代限制,约为35次迭代或其他某些次数。如果我尝试在Matlab中分解相同的矩阵,一切都很顺利,我认为这有两个原因: 1. Matlab使用DGESVD而不是DGESDD,它通常似乎更加稳健。 2. Matlab在该例程中使用了75次的迭代限制。(他们在源代码中做了修改并重新编译了它。)
现在问题是:是否有一种简单的方法可以将numpy使用的后端从DGESDD更改为DGESVD,而无需修改numpy源代码?
提前感谢 Mischa

这种可能性很小,但您可以编写自己的f2py模块来调用DGESVD。 - Vladimir F Героям слава
我本来希望避免这种情况,但看来我还是不得不去做它了... - Mischa Obrecht
2个回答

1

对我有用的方法是只计算矩阵X"经济尺寸" SVD

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

0

我来晚了,但也许这会帮助其他人...

我在julia中遇到了类似的问题。

我在R帮助列表中找到了这种方法,它适用于使用lapack库的任何环境:

基本上,如果svd(M)失败,请尝试svd(M'),并适当交换得到的U、V。

以下是我在julia中的实现方式:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接