簡體   English   中英

通過蒙特卡羅馬爾可夫鏈的簡單貝葉斯網絡移植到PyMC3

[英]Simple Bayesian Network via Monte Carlo Markov Chain ported to PyMC3

通過蒙特卡羅馬爾可夫鏈PyMC2移植到簡單貝葉斯網絡的例子到PyMC3並且它可以工作。
結果可以在文件pymc3_rain_sprinkler_grass_simple_bayesian_network.py. GitHub上的以下要點找到 pymc3_rain_sprinkler_grass_simple_bayesian_network.py.

我想通過提供證據來擴展原始示例,例如,草是濕的,然后讓PyMC3給出答案,例如“給定草濕,下雨的概率是多少?”。

似乎得到的跡線是“常數”,例如,它中不再存在隨機元素。 pymc3_rain_sprinkler_grass_simple_bayesian_network_with_evidence.py中查看pymc3_rain_sprinkler_grass_simple_bayesian_network_with_evidence.py並執行df.drop_duplicates()以查看我的意思。

我究竟做錯了什么?

我設法解決了我的問題。 重點是將testval設置為“true”而不是“false”。 它改善了從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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM