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会给出类似的警告就好了。