2016-05-02 31 views
-2

確率分布から10億のランダムな点を生成し、これらの点を使ってモンテカルロ積分を計算する関数を評価したいと思います。問題は、MATLABを使用していて、他のプログラミング言語に関する知識がほとんどないことです。 MATLABはもちろん非常に遅く、10個の異なるプロセスで1億のポイントの値を計算することによって、統合を並列化する可能性について議論しました。これは可能なアプローチですか?もしそうなら、それを実装する最良の方法は何ですか?私の場合モンテカルロ積分の並列化

:N
が機能 を評価分布
から乱数を生成するNにより一時変数
最後に

分割一時変数を関数の評価を追加し、次のように

現在のアプローチがあります従って積分は近似されている。

次のように評価される関数である:
0発生点は数B未満である場合
発生ポイントが使用してB.

以上である場合に点とBとの間の差@ Arpiのアプローチでは、代わりにparforループが使用されます。

+3

「Matlabはもちろん非常に遅いです。よく、それは主にユーザーによって異なります。とにかく、並列化は可能ですが、['parfor'](http://www.mathworks.com/help/distcomp/parfor.html?refresh=true)を見てください。また、積分を計算するあなたのアプローチを再考するだろう、計算上の負担を減らすための多くのテクニックがあります。重要度サンプリング。しかし、「最良の」アプローチは問題に依存します。 – Arpi

+0

それは本当であり、ユーザーとしては私は間違いなく遅いです;)parforと私のアプローチ@Arpiを再考してくれてありがとう! – rickri

+1

関数の説明/方程式/擬似コード/図を提供することができます。アルゴリズムをパネル化するには多くのアプローチがあり、適切なものを見つけることはアルゴリズムの性質に依存します。例えば、あなたの関数が基本的な算術演算を行うだけであれば、ボトルネックはCPU時間ではなくメモリーアクセスである可能性があります。つまり、複数のコア/ハイパースレッドを使用する点はほとんどありません。 –

答えて

1

これは最初に示唆されたよりもmuch, much simplerと思われます。 wikipediaに相談して、問題を分析的に解決することができます。しかし - と、私はこれが本当に正しいアプローチではないことを強調 - これはプログラミングのサイトであることから、ここでのプログラムは次のとおりです。

b = 0.3; 
N = 1e9; 
batch_size = 1e8; 

total = 0; 
for ii=1:(N/batch_size) 
    total = sum(max(0,rand(batch_size,1)-b)); 
end 
result = total/N; 

これを実行するには15秒程度かかります。バッチサイズがより良く選択されれば、より速く進む可能性があります。

ここでの「分布」は、[0, 1)の間隔で一様であるが、これは望ましいものではない可能性があるが、そのアプローチはどの分布タイプ(多くはMatlabのビルトイン)で機能するように拡張できる。

+0

ありがとう!魅力的な作品! – rickri

+0

@rickri - これは実際の問題を解決するためのひどい方法です。少なくともランダムに選択するのではなく、固定範囲の 'x'値を使うことができます。実際には分析的に統合するべきです - [wkipedia](https://en.wikipedia.org/wiki/Student%27s_t-distribution#Integral_of_Student.27s_probability_density_function_and_p-value)を参照してください。あなたは[XY問題](http://meta.stackexchange.com/a/66378)のために落ちました。 –