8

私はC++で多変量ガウス分布の確率密度関数を実装することに取り組んでおり、次元が2より大きい場合を最適に処理する方法に固執しています。

ガウス分布のpdfは次のように書くことができます

多変量ガウスpdf

ここで、(A)'またはA'は、xのすべての要素から平均を減算することによって作成された'行列'の転置を表します。この方程式では、kは次元数であり、シグマはakxk行列である共分散行列を表します。最後に、| X | 行列Xの行列式を意味します。

単変量の場合、pdfの実装は簡単です。二変量(k = 2)の場合でも、それは些細なことです。ただし、2次元を超えると、実装ははるかに困難になります。

二変量の場合、

二変量ガウスpdf

ここで、rhoはxとyの間の相関であり、相関は次のようになります。

2つの確率変数XとYの間の相関

この場合、Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic>Eigenの単純化された線形代数インターフェースの恩恵を受けることなく、最初の方程式を実装するために使用することも、2番目の方程式を使用してすべてを自分で計算することもできます。

多変量の場合の試みについての私の考えは、おそらく上記の方程式を多変量の場合に拡張することから始まります。

多変量pdf

多変量pdf

私の質問は次のとおりです。

  1. n次元配列にを使用するのが適切/推奨されますboost::multi_arrayか、それとも代わりにEigenを活用する必要がありますか?
  2. 単変量/二変量の場合に別々の関数を使用する必要がありますか、それとも、boost :: multi_array(または適切な代替)を使用してすべてを多変量の場合に抽象化する必要がありますか?
4

2 に答える 2

1

私はここで私の要素から少し外れていますが、いくつかの考えがあります:

まず、プログラミングの観点から、ストックの答えは「プロファイル」です。つまり、最初に明確な方法でコーディングします。次に、実行のプロファイルを作成して、最適化に価値があるかどうかを確認します。私見では、元の数学に近づけるために行列ライブラリを使用する方がおそらく明確です。

数学の観点から:私はあなたが多変量の場合に提供する式について少し疑わしいです。それは私には正しく見えません。式Zは二次形式である必要がありますが、 Zはそうではありません。私が何かを逃していない限り。

これはあなたが言及しなかったオプションですが、理にかなっているかもしれません。特に、単一の配布に対してPDFを複数回評価する場合。分布の主成分ベースを計算することから始めます。つまり、Σの固有基底です。主成分の方向は直交しています。主成分ベースでは、相互共分散はすべて0であるため、PDFは単純な形式になります。評価する場合は、入力に基づく基底変換を主成分変換に変更し、その上でより簡単なPDF計算を実行します。

基底変換と主要成分の変化を前もって計算し、評価に必要な2つの行列乗算ではなく、評価ごとに1つの行列乗算(基底変換)を実行するだけでよいという考えです(x-μ)' Σ (x-μ)。標準ベース。

于 2011-08-25T12:59:47.133 に答える
0

私は基本的に、この質問expの3次元の場合の方程式の一部を実装しました。最初はOpenCVというコンピュータビジョンライブラリを使用していました。しかし、C++インターフェイスが非常に遅いことに気づきました。その後、少し高速なCインターフェイスを試しました。最後に、柔軟性と読みやすさを無視することにしたので、ライブラリなしで実装しましたが、はるかに高速でした。

私が言おうとしているのは、これです。パフォーマンスが重要な場合は、オーバーヘッドをできるだけ少なくして、最も使用されるディメンション数に対して特別なケースを実装することを検討する必要があります。それ以外の場合は、速度よりも保守性を選択してください。

Eigen免責事項:またはの速度については何も知りませんboost::multi_array(おそらく、この質問が実際に目指しているのはこれですか?)。

于 2011-08-25T12:58:47.600 に答える