4

まず、私は C++ の初心者です。

私は修士論文のプログラムを書いていますが、その一部は回帰を再帰的に解決することを想定しています。

解決したい:

Ax = y

私の場合、計算速度は無視できません。つまり、Boost::BLAS を使用しているかどうかを知りたいのです。

x = (A^T A)^{-1}A^Ty

Lapackpp よりも計算時間が少なくて済みます (私は gentoo を使用しています)。

PS Lapackppプロジェクトサイトでクラスのドキュメントを見つけることができましたが、例は見つかりませんでした。LapackがBoost::BLASよりも速い場合に備えて、誰かが私にいくつかの例を提供してもらえますか

ありがとう

4

4 に答える 4

4

数値解析の観点からすると、次のようなコードは絶対に書きたくありません。

  • 行列を明示的に反転する、または
  • A^T A回帰の正規方程式 ( ) の行列を形成します

これらはどちらも、同じ問題を直接解決する代替手段よりも手間がかかり、精度が低くなります (そしておそらく安定性も低くなります)。

行列の反転を示す数学を見るときはいつでも、それは「一次方程式系を解く」、または行列を因数分解し、因数分解を使用して系を解くことを意味するものと解釈する必要があります。BLAS と Lapack の両方に、これを行うためのルーチンがあります。

同様に、回帰については、回帰を計算するライブラリ関数を呼び出すか、自分で行う方法を読んでください。正規方程式法は、それを行う教科書の間違った方法です。

于 2011-01-20T22:47:22.063 に答える
2

本当にC++で実装する必要がありますか?たとえば、python / numpyはあなたの代わりになりますか?そして、再帰的回帰(最小二乗)については、線形代数や彼の本に関するMITのStrang教授の講義を探すことをお勧めします。

于 2011-01-20T20:55:45.343 に答える
2

高レベルのインターフェースと低レベルの最適化は、2 つの異なるものです。

LAPACK と uBLAS は、高レベルのインターフェイスと最適化されていない低レベルの実装を提供します。ハードウェアに最適化された低レベルのルーチン (またはバインディング) は、別の場所から取得する必要があります。バインディングが提供されると、LAPACK と uBLAS は、最適化されていない独自の実装ではなく、最適化された低レベル ルーチンを使用できます。

たとえば、ATLAS は最適化された低レベルのルーチンを提供しますが、限られた高レベル (レベル 3 BLAS など) のインターフェイスのみを提供します。ATLAS を LAPACK にバインドできます。次に、LAPACK は低レベルの作業に ATLAS を使用します。LAPACK は、技術的な作業を経験豊富なエンジニア (ATLAS) に委任するシニア マネージャーと考えてください。uBLASも同様です。uBLAS と MKL をバインドできます。その結果、最適化された C++ ライブラリが作成されます。ドキュメントを確認し、Google を使用してその方法を理解してください。

于 2011-01-03T18:48:38.303 に答える
2

Armadilloは BLAS と LAPACK を優れた C++ インターフェイスでラップし、問題に直接関連する次の Matlab のような関数を提供します。

  • solve()、一次方程式系を解く
  • pinv()、疑似逆 (SVD を内部で使用)
于 2012-12-18T09:42:32.427 に答える