2017-02-26 5 views
2

Simple Bayesian Network via Monte Carlo Markov Chainの例をPyMC2からPyMC3に移植しました。
結果は、私は、例えば証拠を提供することによって、元の例を拡張したいと思ったpymc3_rain_sprinkler_grass_simple_bayesian_network.py.モンテカルロマルコフ連鎖を経由した単純ベイズネットワークPyMC3に移植

ファイルにGitHubので次gistに見出すことができます草が濡れていることを確認してから、PyMC3は「与えられた草が濡れている、雨が降っている確率は何ですか?

結果のトレースは「一定」と思われます。それ以上のランダム性の要素はありません。要点にpymc3_rain_sprinkler_grass_simple_bayesian_network_with_evidence.pyを見て、df.drop_duplicates()を実行して、私の言いたいことを見てください。

私は間違っていますか?

+0

「PyMC2」の同じコードで要点を更新しました。 PyMC2バージョンはPyMC3バージョンと同じ問題を抱えません。何か案は? –

+0

[pymc3-multiple-observed-values](http://stackoverflow.com/questions/24242660/pymc3-multiple-observed- valuesues)では、次のような記述があります。「あなたのアプローチに根本的に間違いはありません。ベイジアンMCMC分析の落とし穴を除き、(1)非収束、(2)プリオリ、(3)モデル。 私のケースは同様のケースだと思いますが、私は解決策を引き続き調整します。私が芝生が濡れているのではなく草が濡れていないという証拠として私が提供するならば、 'PyMC3'版も働きます。 私はここで、そして要点を更新し続けます。 –

答えて

1

私は私の問題を解決することができました。主なポイントは、testvalを "false"ではなく "true"に設定することでした。ステップメソッドをMetropolisからBinaryGibbsMetropolisに変更するように状況を改善しました。

ここでは完全な解決策をご紹介します。私は要点も更新しました。

import numpy as np 
import pandas as pd 
import pymc3 as pm 

niter = 10000 # 10000 
tune = 5000 # 5000 

model = pm.Model() 

with model: 
    tv = [1] 
    rain = pm.Bernoulli('rain', 0.2, shape=1, testval=tv) 
    sprinkler_p = pm.Deterministic('sprinkler_p', pm.math.switch(rain, 0.01, 0.40)) 
    sprinkler = pm.Bernoulli('sprinkler', sprinkler_p, shape=1, testval=tv) 
    grass_wet_p = pm.Deterministic('grass_wet_p', pm.math.switch(rain, pm.math.switch(sprinkler, 0.99, 0.80), pm.math.switch(sprinkler, 0.90, 0.0))) 
    grass_wet = pm.Bernoulli('grass_wet', grass_wet_p, observed=np.array([1]), shape=1) 

    trace = pm.sample(20000, step=[pm.BinaryGibbsMetropolis([rain, sprinkler])], tune=tune, random_seed=124) 

# pm.traceplot(trace) 

dictionary = { 
       'Rain': [1 if ii[0] else 0 for ii in trace['rain'].tolist() ], 
       'Sprinkler': [1 if ii[0] else 0 for ii in trace['sprinkler'].tolist() ], 
       'Sprinkler Probability': [ii[0] for ii in trace['sprinkler_p'].tolist()], 
       'Grass Wet Probability': [ii[0] for ii in trace['grass_wet_p'].tolist()], 
       } 
df = pd.DataFrame(dictionary) 

p_rain = df[(df['Rain'] == 1)].shape[0]/df.shape[0] 
print(p_rain) 

p_sprinkler = df[(df['Sprinkler'] == 1)].shape[0]/df.shape[0] 
print(p_sprinkler) 
+0

私はpyjagsのバージョンで要点を更新しました。 JAGSの正しい開始条件を指定しないと、エラーメッセージが表示されます。 'console.JagsError:ノードgrass_wetのエラー。観察されたノードは初期化時に観察されていない親と矛盾する。適切な初期値を設定してみてください。 ' PyMC3でも同様の警告が表示されるといいでしょう。 –

関連する問題