Python 基于蒙特卡罗马尔可夫链的简单贝叶斯网络移植到PyMC3

Python 基于蒙特卡罗马尔可夫链的简单贝叶斯网络移植到PyMC3,python,pymc3,Python,Pymc3,我正在将一个示例从PyMC2移植到PyMC3,它可以正常工作结果可以在GitHub上的以下文件中找到:文件pymc3\u rain\u sprayer\u grass\u simple\u bayesian\u network.py. 我想通过提供证据来扩展原始示例,例如,草是湿的,然后让PyMC3为诸如“给定的草是湿的,下雨的可能性有多大?”之类的问题提供答案 由此产生的轨迹似乎是“恒定的”,例如,其中不再存在随机性元素。查看要点中的pymc3\u rain\u spreader\u gras

我正在将一个示例从
PyMC2
移植到
PyMC3
,它可以正常工作
结果可以在GitHub上的以下文件中找到:文件
pymc3\u rain\u sprayer\u grass\u simple\u bayesian\u network.py.

我想通过提供证据来扩展原始示例,例如,草是湿的,然后让
PyMC3
为诸如“给定的草是湿的,下雨的可能性有多大?”之类的问题提供答案

由此产生的轨迹似乎是“恒定的”,例如,其中不再存在随机性元素。查看要点中的
pymc3\u rain\u spreader\u grass\u simple\u bayesian\u network\u with\u defect.py
,然后执行
df.drop\u duplicates()
以了解我的意思


我做错了什么?我设法解决了我的问题。要点是将testval设置为“true”而不是“false”。将step法从大都会法改为双城法,改善了这种情况

这里是完整的解决方案供参考。我还更新了要点

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)

我在
PyMC2
中用相同的代码更新了要点。
PyMC2
版本与PyMC3版本没有相同的问题。有什么想法吗?在这篇文章中,我发现了以下陈述:“你的方法没有根本性的错误,除了任何贝叶斯MCMC分析的缺陷:(1)不收敛,(2)先验,(3)模型。”我认为我这里的情况与此类似,我将继续调整解决方案。如果我提供证据证明草不是湿的,而不是湿的,
PyMC3
版本也可以工作。我将继续在这里和要点中更新我的发现。我已经用pyjags版本更新了要点。如果我没有为JAGS指定正确的启动条件,它会给我一条错误消息:
console.JagsError:error in node grass\u wet;观察到的节点与初始化时未观察到的父节点不一致。尝试设置适当的初始值。
如果PyMC3会给出类似的警告就好了。