lstsq
は解決を試みますAx=b
最小化|b - Ax|
。 scipyとnumpyはどちらもlinalg.lstsq
関数と非常によく似たインターフェース。ドキュメントでは、使用されるアルゴリズムの種類については言及されていません。 scipy.linalg.lstsq でも numpy.linalg.lstsq でも使用されていませんが、ほとんど同じように見えます。
scipy.linalg.lstsq と numpy.linalg.lstsq では、実装が異なるようです。どちらもLAPACKを使用しているようで、どちらのアルゴリズムもSVDを使用しているようです。
違いはどこですか?どちらを使用すればよいですか?
注:混乱しないでくださいlinalg.lstsq
とscipy.optimize.leastsq
非線形最適化問題も解決できます。
ソースコードを正しく読んだ場合(Numpy 1.8.2、Scipy 0.14.1)、numpy.linalg.lstsq()
はLAPACKルーチンを使用しますxGELSD
およびscipy.linalg.lstsq()
uses xGELSS
。
サブルーチンxGELSDは、特に大きな問題の場合、以前の対応するxGELSSよりも大幅に高速ですが、行列の次元によっては、より多くのワークスペースが必要になる場合があります。
つまり、Numpyはより高速ですが、より多くのメモリを使用します。
2017年8月更新:
ScipyはデフォルトでxGELSDを使用するようになりました https://docs.scipy.org/doc/scipy/reference/generated/scipy.linalg.lstsq.html
Numpy 1.13およびScipy 0.19以降、bothscipy.linalg.lstsq() および numpy.linalg。 lstsq() デフォルトで同じLAPACKコードDSGELDを呼び出します( LAPACKのドキュメント を参照)。
ただし、2つの関数の現在の重要な違いは、採用されたデフォルトのRCOND LAPACKパラメーター(Numpyではrcond
、Scipyではcond
と呼ばれる)にあり、特異値のしきい値を定義します。
Scipyは適切で堅牢なデフォルトのしきい値RCOND=eps*max(A.shape)*S[0]
を使用します。ここで、S[0]
はA
の最大の特異値ですが、Numpyはデフォルトのしきい値RCOND=-1
を使用します。 LAPACKで、A
の値に関係なく、マシンの精度に等しいしきい値を設定します。
Numpyのデフォルトのアプローチは基本的に現実的なアプリケーションでは役に立たず、A
がランク不足に近い場合、DSGELDで使用される特異値分解SVDの精度を損なうと、一般に非常に縮退したソリューションになります。これは、Numpyではオプションのパラメーターrcond
を常に使用する必要があることを意味します。
numpy.linalg.lstsq() でrcond
(上記のセクションを参照)の誤ったデフォルトを報告し、関数はNumpy 1.14でFutureWarning
を発生させます(-を参照) 将来の変更 )。
scipy.linalg.lstsq() と numpy.linalg.lstsq() の両方で、将来の動作は同じになります。つまり、ScipyとNumpyは同じLAPACKコードを使用するだけでなく、同じデフォルトも使用します。
Numpy 1.14で適切な(つまり将来の)デフォルトの使用を開始するには、明示的なrcond=None
を付けて numpy.linalg.lstsq() を呼び出す必要があります。