2017-01-13 17 views
1

C++とPython計算の数値結果を比較しています。 C++では、私はLAPACKのsgels関数を使って、線形回帰問題の係数を計算します。 Pythonでは、同様の作業にNumpyのlinalg.lstsq関数を使用します。C++(LAPACK、sgels)とPython(Numpy、lstsq)の結果の違い

sgelsとlinalg.lstsqで使用される方法の数学的な違いは何ですか?

結果(すなわち、回帰係数)を数値的に比較すると、予想される誤差(6桁など)はどのくらいですか?

FYI:私は決してC++またはPythonのエキスパートではないので、関数内で何が起こっているのかを理解することは困難です。

+1

ちょっと考えてみましょう.Cの場合はsgelsです。どのようにそれを倍増するためにアップキャストし、代わりにdgelsを使用するのですか? –

+0

@ ev-br:私は "多列"のC++コードを自分で書いていないので、アルゴリズムを切り替えるにはかなりの変更が必要です。私はC++には慣れていないので、私はあなたの考えに同意しますが、あまり変更したくありません。 – Thomas

答えて

2

ファイル番号linalg.pyのnumpyのソースを見てみると、lstsqはLAPACKのzgelsd()(複合語)とdgelsd()(実数)を使用しています。ここでsgels()の相違点は次のとおりです。sgels()floatためのものである

  • dgelsd()doubleためです。精度の差があります...
  • dgels()は、行列AのQR分解を使用し、Aがフルランクであると仮定します。重要な結果を得るには、行列の条件数が合理的でなければなりません。メソッドのロジックを取得するには、this courseを参照してください。他方、dgelsd()は、Aの特異値分解を利用する。特に、Aはランクディファレンシャルであり、小さな特異値は追加の引数rcondまたはマシン精度に応じて破棄される。 rcondのnumpyのデフォルト値は-1です。負の値はマシンの精度を表します。ロジックについては、this courseを参照してください。
  • benchmark of LAPACKによると、dgels()は、dgelsd()よりも約5倍速いと予測できる。

行列が病気conditionnedされている場合は、sgels()dgelsd()の結果との間に有意な違いを見ることができます。実際、アルゴリズムに依存する線形回帰の誤差と、使用されるrcond()の値には限界があります。エラーの見積もりについてはthe user guide of LAPACK on, Error Bounds for Linear Least Squares Problems、技術的な詳細についてはFurther Details: Error Bounds for Linear Least Squares Problemsを参照してください。

結論として、bの措置が正確であり、説明変数と容易に関連する場合、sgels()およびdgels()を使用することができます。たとえば、センサが排気管の出口に配置されている場合、どのモータが動作しているかを推測するのは簡単です。しかし、時には、供給源と測定値との間の線形関係は正確には分かっていない(Aの条件に関する不確実性)、あるいは測定基盤の汚染物質を識別することはより困難になる(汚染物質の中にはセンサセットから遠く、条件付き)。このような状況では、dgelsd()rcond引数を調整すると役立ちます。 疑問がある場合は、dgelsd()を使用し、xの誤差をLAPACK's user guideに基づいて見積もってください。

+1

サイドノート:異なるドライバルーチンを記述したテーブルが見つかりました。 http://www.netlib.org/lapack/lug/node27.htmlを参照してください。 – Thomas

関連する問題