Skip to content Skip to sidebar Skip to footer

Simple Bayesian Network Via Monte Carlo Markov Chain Ported To Pymc3

I was porting the example of a Simple Bayesian Network via Monte Carlo Markov Chain from PyMC2 to PyMC3 and it works. The result can be found in the following gist on GitHub in the

Solution 1:

I managed to solve my problem. The main point was to set testval to "true" rather than "false". It improved the situation to change the step method from Metropolis to BinaryGibbsMetropolis.

For reference here is the complete solution. I also updated the gist.

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': [1if ii[0] else0for ii in trace['rain'].tolist() ],
              'Sprinkler': [1if ii[0] else0for 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)

Post a Comment for "Simple Bayesian Network Via Monte Carlo Markov Chain Ported To Pymc3"