2017-10-29 10 views
1

私はNataf Transformで相関多変量シミュレーションを行っています。モンテカルロシミュレーションを行うためにPython(中級知識)でコードを開発しましたが、コンピュータで時間がかかります。モンテカルロシミュレーションでForループを最適化する

# Exponential distribution (stats package) 
loc_exp = 15.0 
scale_exp = 139.21617 

# Gamma distribution (l-moments package) 
loc_gam = 0.72698 
scale_gam = 16.18526 

for i in range(len(rho_z)): 

# Generate standarn normal variates 
    n = int(1e6) 
    r = np.random.normal(0, 1, [n,2]) 
    ui = r[:,0] 
    uj = r[:,1] 
    xi = stats.expon.ppf(stats.norm.cdf(ui), loc_exp, scale_exp) 
    xj = lmoments.quagam(stats.norm.cdf(rho_z[i]*ui + np.sqrt(1.0 - rho_z[i]**2)*uj), para = np.array((loc_gam, scale_gam))) 
# evaluate rho_x 
R = np.corrcoef(xi,xj) 
rho_x[i] = R[0,1] 

私はstatsとlmomentsパッケージを使用しています。ありがとう

+0

可能な限り計算をベクトル化できるように、各部分のタイミングを調整して書き直してください。私はLUTからあらかじめ生成されたランダムな値を使うことから始めます。 – StarShine

答えて

0

私はベクトル化がここで問題ではないと思います。 複数のコアを持つマシンを使用している場合は、ループを並列に実行してその機能を使用します。ほとんどのモンテカルロコードは、あなたのような厄介な並行問題として定式化することができます。たとえば、ここで説明するjoblibパッケージを使用できます。https://blog.dominodatalab.com/simple-parallelization/

また、最後の2行のインデントを確認してください。私は彼らがループに所属すべきだと思う。

+0

ありがとうございました。私はあなたが複数のコアを持つマシンを持っているので、あなたが今共有したリンクを読むでしょう。 –

関連する問題