web-dev-qa-db-ja.com

numpy.linalg.lstsqとscipy.linalg.lstsqの違いは何ですか?

lstsqは解決を試みますAx=b最小化|b - Ax|。 scipyとnumpyはどちらもlinalg.lstsq関数と非常によく似たインターフェース。ドキュメントでは、使用されるアルゴリズムの種類については言及されていません。 scipy.linalg.lstsq でも numpy.linalg.lstsq でも使用されていませんが、ほとんど同じように見えます。

scipy.linalg.lstsqnumpy.linalg.lstsq では、実装が異なるようです。どちらもLAPACKを使用しているようで、どちらのアルゴリズムもSVDを使用しているようです。

違いはどこですか?どちらを使用すればよいですか?

注:混乱しないでくださいlinalg.lstsqscipy.optimize.leastsq非線形最適化問題も解決できます。

28
lumbric

ソースコードを正しく読んだ場合(Numpy 1.8.2、Scipy 0.14.1)、numpy.linalg.lstsq()はLAPACKルーチンを使用しますxGELSDおよびscipy.linalg.lstsq() uses xGELSS

LAPACKマニュアルセクション2.4 状態

サブルーチンxGELSDは、特に大きな問題の場合、以前の対応するxGELSSよりも大幅に高速ですが、行列の次元によっては、より多くのワークスペースが必要になる場合があります。

つまり、Numpyはより高速ですが、より多くのメモリを使用します。

2017年8月更新:

ScipyはデフォルトでxGELSDを使用するようになりました https://docs.scipy.org/doc/scipy/reference/generated/scipy.linalg.lstsq.html

21
Dietrich

Numpy 1.13-2017年6月

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 1.14-2018年1月

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() を呼び出す必要があります。

16
divenex