gpt4 book ai didi

python - 通过移植到 PyMC3 的蒙特卡洛马尔可夫链的简单贝叶斯网络

转载 作者:太空宇宙 更新时间:2023-11-03 15:57:23 25 4
gpt4 key购买 nike

我正在移植 Simple Bayesian Network via Monte Carlo Markov Chain 的示例从 PyMC2PyMC3 并且它有效。
结果见下gistGitHub 上的文件 pymc3_rain_sprinkler_grass_simple_bayesian_network.py.

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

结果轨迹似乎是“恒定的”,例如它不再有随机性的元素。查看要点中的 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)

关于python - 通过移植到 PyMC3 的蒙特卡洛马尔可夫链的简单贝叶斯网络,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42470592/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com