1. ホーム
  2. python

LinearAlgebraError: SVDが収束しなかった(PYTHON)

2022-02-09 13:30:56
<パス

まず、逆行列を求めるように見える関数ですが、やはり擬似的な逆行列であることに注意しましょう。
ここでは、この関数について説明します。

numpy.linalg.pinv¶

numpy.linalg.pinv(a, rcond=1e-15)[source]
Compute the (Moore-Penrose) pseudo-inverse of a matrix.

Calculate the generalized inverse of a matrix using its singular-value decomposition (SVD) and including all large singular values.

Changed in version 1.14: Can now operate on stacks of matrices

Parameters: 
a : (..., M, N) array_like
Matrix or stack of matrices to be pseudo-inverted.
rcond : (...) array_like of float
Singular values smaller (in modulus) than rcond * largest_singular_value (again, in modulus) are set to zero. Broadcasts against the stack of matrices
Returns:    
B : (..., N, M) ndarray
The pseudo-inverse of a. If a is a matrix instance, then so is B.
Raises: 
LinAlgError
If the SVD computation does not converge.

入力Aについては、行列であることが必須であり、内容は問わない。
さらに掘り下げると、このエラーの原因はSVD関数のエラーであり、その言葉の通り収束しないのです。
続く魔法のようなエラー ここで それはいけないということです。
それから、上のリンクを注意深くたどって下を見ると、最後の方に反復回数を修正するように書いてあります。正確な場所は以下を参照してください。

File: Src/dlapack_lite.c
Subroutine: dlasd4_
Line: 22562

まず、githubでnumpyのソースコードをダウンロードし、下図のディレクトリをたどっていきます。

ここには2つの.Cファイルがあり、前回の解決策ではdlapack_lite.cの22562行目を変更するようにと書かれています。
恥ずかしながら、私がダウンロードしたバージョンでは合計359行しかありません...。
そこで、unmath_linalg.c ファイルを修正してみました。
でも、全部でそんなに行数は多くないんですよね。
そこで、2256行に位置づけました。
彼の上に数行のコードを発見。

最初の緑色の単語のop_countを直前で変更しようとしたら、魔法のようにエラーが爆発した セグメンテーションの不具合 という意味です。 セグメンテーションエラーとは、アクセスしたメモリが、システムからプログラムに与えられたメモリ領域を超えてしまうことです . それで大体終わりで、また変更方法を考える。

修正後、ソースインストールを使って実行。

pip setup.py install

次に、自分のプログラムを再実行します。理論的には、成功するはずです。

ロードが終わったところですが、もう成功しませんでした。

翌日、再実行、通過できた。

途中、ランダムな処理が入ることもありますが、とにかく走り抜けることができる場合があります。さらに数回トライ

また 誰か 自分では試していない。マシンを変更することはできない。