2012-04-27 69 views
8

私は、特定の確率分布から(1,000,000)^ 2個の数字を生成し、それらを使って何かを行うC++でシミュレーションを書いた。これまでは、指数関数、標準、ガンマ、ユニフォーム、ポアソン分布を使ってきました。Betaディストリビューションの乱数、C++

#include <boost/random.hpp> 

...main... 

    srand(time(NULL)) ; 
    seed = rand(); 
    boost::random::mt19937 igen(seed) ; 
    boost::random::variate_generator<boost::random::mt19937, boost::random::normal_distribution<> > 
    norm_dist(igen, boost::random::normal_distribution<>(mu,sigma)) ; 

ここではベータ版用に実行する必要があります。これまでに私が行った配布はすべて10〜15時間かかりました。 Betaディストリビューションはboost/randomパッケージにはないので、boost/math/distributionパッケージを使用しなければなりませんでした。解決策を提案したthis page on StackOverflowが見つかりました。ここに(コピー貼り付け):

#include <boost/math/distributions.hpp> 
using namespace boost::math; 
double alpha, beta, randFromUnif; 
//parameters and the random value on (0,1) you drew 
beta_distribution<> dist(alpha, beta); 
double randFromDist = quantile(dist, randFromUnif); 

私はそれを複製して動作させました。私のシミュレーションの実行時間見積もりは線形で正確に予測可能です。彼らはこれが25日間実行されると言います。 1.提案された方法は、私が以前使っていたものに劣っている他のディストリビューションのための 2.ベータ分布はちょうど私が以下の最低限の持っている心の中で

ベアから乱数を生成することが非常に困難である:私は2つの可能性を参照してくださいC++のコーディングの理解、私が求めている質問はばかげているかもしれません。私はこのシミュレーションが完了するまで1ヶ月待つことができないので、改善するために何かできることはありますか?おそらく私が使用していた初期の方法を使ってboost/math/distributionsパッケージで動作するように修正するのでしょうか?それが可能かどうかわからない。

役に立つ情報のもう1つの情報は、生成する必要があるすべての(1,000,000)^ 2の数値のすべてが同じであるということです。私はこれを言っています。なぜなら、Betaディストリビューションには厄介なPDFがあり、おそらくパラメータが固定されているという知識が、プロセスを単純化するために何らかの形で使用できるからです。ちょっとランダムな推測。

答えて

5

ベータ分布はガンマ分布に関連しています。 Xをガンマ(α、1)から引いたガンマ(β、1)からの乱数をXとする。ガンマ分布の第1引数は形状パラメータである。そして、Z = X /(X + Y)は分布β(α、β)を持つ。この変換では、ガンマ分布テストの2倍の時間しかかかりません。

注:上記は、ガンマ分布の最も一般的な表現であるガンマ(形状、スケール)を前提としています。ガンマ分布ランダムジェネレータの実装形態の違いは、引数の意味と順序によって異なります。

http://en.wikipedia.org/wiki/Kumaraswamy_distribution

それは、の代替として使用されます:あなたは非常にベータ版のようですが、非常に単純な閉形逆CDFを持って配布したい場合は

+0

ありがとう、私はその財産を知らなかった。また、ガンマ分布は単に指数関数の和であるという事実を使用しました。あなたの提案は、実行時間を600時間から40時間に変更しました。ありがとうございました! – jaff

+0

ガンマ(1、α)とガンマ(1、β)の代わりにガンマ(α、1)とガンマ(β、1)を使用しないでください。つまり、αとβは、スケールパラメータではなく形状パラメータでなければなりません。 – BenRI

+0

@BenRI - ガンマ分布をパラメータ化する方法は複数あります。より広く使用されているものの1つは 'gamma(shape_factor、scale_factor)'です。この使い方では正しいです。そのスケールファクタは、レートまたは平均であってもよい。他のものは、第2引数として形状を指定します(しかしこれは明らかに広く使われていません)。より一般的な表記法を反映させ、形状引数がキーであることを示すために私の答えを更新します。 –

0

最適化してコンパイルしてみてください。フラグ-O3を使用すると、通常は処理が高速化されます。少し詳細についてはpost on optimisation flagsまたはthis overviewを参照してください。

+5

実際にオプティマイゼーションフラグを使用しているかどうかコメントでOPに尋ねる必要があります。 – mfontanini

2

、それはKumaraswamy分布を考慮する価値があります多数のランダムサンプルがすばやく必要とされるときのベータ分布。

関連する問題