2011-08-25 8 views
8

私はC++で多変量ガウス関数の確率密度関数を実装しようとしていますが、dimension> 2の場合をどのように扱うのが最善でしょうか。C++で2次元以上の多変量ガウス確率密度関数を実装する

ガウスのPDFは

multivariate gaussian pdf

(A)「またはA」のように書くことができるが、xのすべての要素から平均値を減算することによって作成された 『マトリックス』の転置を表します。この方程式では、kは私たちが持っている次元の数であり、sigmaはk x k行列である共分散行列です。最後に、| X |行列Xの行列式を意味します。

単変量の場合、pdfの実装は簡単です。二変量(k = 2)の症例でさえ、それは自明である。しかし、2次元以上になると、実装ははるかに難しくなります。二変量場合

、我々は、Rhoは、私は、この場合に

correlation between two random variables X and Y

に等しい相関を用いて、xとyとの間の相関である

bivariate gaussian pdf

を有しているだろうEigenの単純化された線形代数インターフェースの恩恵を受けずに、Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic>を使用して最初の式を実装するか、2番目の式を使用してすべてを自分で計算することができます。

:多変量の場合の試みのため

私の考えは、おそらく私の質問があり

multivariate pdf

と多変量の場合

multivariate pdf

に、上記の式を拡張することにより開始します

  1. n次元配列にboost::multi_arrayを使用することをお勧めしますか、代わりにEigenを利用しようとするべきですか?
  2. 単変量/二変量のケースに対して別々の関数( )を使用するか、 boost :: multi_array(または適切な代替)を使用して多変量のケースにすべてを抽象化する必要がありますか?
+0

Oof!さて、これまでに何を試しましたか? :D –

+1

適切な応答はもちろん、行列操作をサポートする数値ライブラリを使用することです。 uBLAS/LaPackはこれを提供していませんか?とにかく、 'multi_array'(または何らかの自作)を使うことは、おそらく*良い考えではないでしょう。 –

答えて

1

私はここに私の要素のうち、少しだけど、いくつかの考え:

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

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

あなたが言及していないオプションがありますが、意味があります。特に、単一のディストリビューションに対してPDFを複数回評価する場合は特にそうです。まず、配布の主成分ベースを計算してください。つまり、Σの固有ベースです。主成分の方向は直交している。主成分ベースでは、相互共分散はすべて0であるため、PDFは単純な形式です。評価したいときは、入力の根拠を主成分ベースに変更してから、より単純なPDF計算を実行します。

基礎行列と主成分の変更を一度計算してから、評価に必要な2つの行列乗算の代わりに、1つの行列乗算(基準の変更)を行うだけでよいという考えがあります。標準ベースで(x-μ)' Σ (x-μ)を評価してください。

+0

私の最愛のTeXマークアップはどこですか? MathOverflowはそれをサポートしています... – Managu

+0

別の言い方をすれば、二次形式の '(x-μ) 'Σ(x-μ)'を対角線形式に変換します(http://ja.wikipedia.org/wiki/Quadratic_form#Real_quadratic_forms )、適切な基準で評価する。 – Managu

0

私は基本的にthis questionの三次元の場合の方程式のexpの部分を実装しました。最初にOpenCVと呼ばれるコンピュータビジョンライブラリを使用しました。しかし、私はC + +のインターフェイスが非常に遅いことに気づいた。その後、私はCインターフェイスを試しましたが、少し速かったです。最後に、柔軟性と可読性を無視することにしたので、ライブラリなしで実装しました。

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

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

関連する問題