2017-02-26 2 views
2

Ich portierte das Beispiel von Simple Bayesian Network via Monte Carlo Markov Chain von zu PyMC3 und es funktioniert.
Das Ergebnis kann in den folgenden gist auf GitHub in der Datei pymc3_rain_sprinkler_grass_simple_bayesian_network.py.Einfache Bayesian Netzwerk über Monte Carlo Markov Chain portiert zu PyMC3

ich finden wollte das ursprüngliche Beispiel erweitern, indem Beweise bereitstellt, z.B. dass das Gras nass ist und dann lassen Sie mich die Antwort auf Fragen wie "gegeben Gras ist nass, was ist die Wahrscheinlichkeit, dass es geregnet hat?".

Es scheint, dass die resultierende Spur "konstant" ist, z. es gibt kein Element der Zufälligkeit mehr. Werfen Sie einen Blick auf pymc3_rain_sprinkler_grass_simple_bayesian_network_with_evidence.py im Wesentlichen und führen Sie die df.drop_duplicates() um zu sehen, was ich meine.

Was mache ich falsch?

+0

Ich habe den gist mit dem gleichen Code in 'PyMC2' aktualisiert. Die 'PyMC2'-Version leidet nicht unter dem gleichen Problem wie die PyMC3-Version. Irgendwelche Ideen? –

+0

In [pymc3-multiple-observed-values] (http://stackoverflow.com/questions/24242660/pymc3-multiple-observed-values) habe ich die folgende Aussage gefunden: "Es ist grundsätzlich nichts falsch mit Ihrem Ansatz, mit Ausnahme der Fallstricke einer Bayes'schen MCMC-Analyse: (1) Nicht-Konvergenz, (2) die Prioren, (3) das Modell. " Ich denke, mein Fall ist ein ähnlicher Fall und ich werde die Lösung weiter abstimmen. Wenn ich als Beweis gebe, dass das Gras nicht nass ist, anstatt dass das Gras nass ist, dann funktioniert auch die "PyMC3" Version. Ich werde weiterhin meine Ergebnisse hier und im Wesentlichen aktualisieren. –

Antwort

1

Ich habe es geschafft, mein Problem zu lösen. Der Hauptpunkt bestand darin, testval auf "wahr" und nicht auf "falsch" zu setzen. Es verbesserte die Situation, um die Schrittmethode von Metropolis zu BinaryGibbsMetropolis zu ändern.

Als Referenz hier ist die komplette Lösung. Ich habe auch das Wesentliche aktualisiert.

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

Ich habe das Wesentliche mit einer Pyjags-Version aktualisiert. Wenn ich die richtigen Startbedingungen für JAGS nicht angeben, gibt es mir eine Fehlermeldung: 'console.JagsError: Fehler im Knoten grass_wet; Der beobachtete Knoten stimmt bei der Initialisierung nicht mit nicht beobachteten Eltern überein. Versuchen Sie, die entsprechenden Anfangswerte einzustellen. Es wäre schön, wenn PyMC3 ähnliche Warnungen ausgeben würde. –

Verwandte Themen