5

numpy.svd を使用して、条件の悪い行列の特異値分解を計算しています。一部の特殊なケースでは、svd が収束せず、Linalg.Error が発生します。いくつかの調査を行ったところ、numpy が LAPACK の DGESDD ルーチンを使用していることがわかりました。標準の実装では、ハードコードされた反復制限が 35 か何かの反復に設定されています。Matlab で同じ行列を分解しようとすると、すべてうまくいきます。これには 2 つの理由があると思います。2. Matlab は、ルーチンで 75 の反復制限を使用します。(彼らはソースでそれを変更し、再コンパイルしました。)

ここでの質問は、numpy ソースを変更せずに、numpy で使用されているバックエンドを DGESDD から DGESVD に変更する簡単な方法はありますか?

よろしくお願いします

4

2 に答える 2

0

私は少し遅れていますが、多分これは他の誰かを助けるでしょう...

Juliaでも同様の問題がありました。

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
于 2013-04-05T21:21:59.720 に答える