2015-12-08 7 views
12

この単純なPyMCモデルをスピードアップする方法はありますか? 20〜40データポイントでは、フィットするには5〜11秒かかります。わずか40データポイントとどのようにPyMCマルコフモデルをスピードアップするには?

import pymc 
import time 
import numpy as np 
from collections import OrderedDict 

# prior probability of rain 
p_rain = 0.5 
variables = OrderedDict() 
# rain observations 
data = [True, True, True, True, True, 
     False, False, False, False, False]*4 
num_steps = len(data) 
p_rain_given_rain = 0.9 
p_rain_given_norain = 0.2 
p_umbrella_given_rain = 0.8 
p_umbrella_given_norain = 0.3 
for n in range(num_steps): 
    if n == 0: 
     # Rain node at time t = 0 
     rain = pymc.Bernoulli("rain_%d" %(n), p_rain) 
    else: 
     rain_trans = \ 
      pymc.Lambda("rain_trans", 
         lambda prev_rain=variables["rain_%d" %(n-1)]: \ 
         prev_rain*p_rain_given_rain + (1-prev_rain)*p_rain_given_norain) 
     rain = pymc.Bernoulli("rain_%d" %(n), p=rain_trans) 
    umbrella_obs = \ 
     pymc.Lambda("umbrella_obs", 
        lambda rain=rain: \ 
        rain*p_umbrella_given_rain + (1-rain)*p_umbrella_given_norain) 
    umbrella = pymc.Bernoulli("umbrella_%d" %(n), p=umbrella_obs, 
           observed=True, 
           value=data[n]) 
    variables["rain_%d" %(n)] = rain 
    variables["umbrella_%d" %(n)] = umbrella 

print "running on %d points" %(len(data)) 
all_vars = variables.values() 
t_start = time.time() 
model = pymc.Model(all_vars) 
m = pymc.MCMC(model) 
m.sample(iter=2000) 
t_end = time.time() 
print "\n%.2f secs to run" %(t_end - t_start) 

、それが実行するために11秒かかる。

running on 40 points 
[-----------------100%-----------------] 2000 of 2000 complete in 11.5 sec 
11.54 secs to run 

(80点と、それは20秒かかります)。これはおもちゃの例です。遷移を決定するLambda()内の式は、実際にはより複雑です。この基本的なコード構造は柔軟性があります(ただし、遷移行列を使用したモデルのエンコーディングは柔軟性がありません)。同様のコード構造を維持する方法はありますか?必要に応じてPyMC3に切り替えることを嬉しく思います。ありがとう。

+0

pymcのバージョンを使用していますか? 2.3.6のpymcのドキュメントでは、Bernoulli関数(Bernoulli_like [Doc](https://pymc-devs.github.io/pymc/)のみ)を見つけることができません。 – CodeMonkey

+0

2.2に存在する – slushy

+0

私は同様の最適化に関する懸念があります(https://stackoverflow.com/questions/42205123/how-to-fit-a-method-belonging-to-an-instance-with-pymc3) –

答えて

3

マルコフ連鎖モンテカルロは、既知の逐次問題です。

これは、フィットネス機能のステップ数と実行時間に比例したランタイムを意味します。

あなたが行うことができますいくつかのトリックは、しかし、があります。

  • 使用PyPy(pymcがサポートされていない、書き換えが必要です)あなたの次のステップ
  • 使用する複数の開始点を改善するための
  • 使用ギブスサンプリング(中並列に平行)
  • 使用する複数のブランチ()鎖以前
  • 使用近似Fを停止する
  • 使用ヒューリスティックまたは接近しているポイントは、すでに

ハーダーアプローチを計算します

  • 使用Numbaは
  • はC(または類似)
  • 使用中のあなたの適性機能を書き換える(マシンコードに適合関数をコンパイル)ネイティブMCMCコード(非Python、上記が必要です)

最後に、多くの研究があります:

http://www.mas.ncl.ac.uk/~ndjw1/docs/pbc.pdf

https://sites.google.com/site/parallelmcmc/

http://pyinsci.blogspot.com/2010/12/efficcient-mcmc-in-python.html(pypy)

+0

存在非常に一般的な質問への答え、私は簡潔にしてみました。詳細についてコメントしてください... –

関連する問題