pymc 中的贝叶斯网络参数学习

机器算法验证 分层贝叶斯 pymc 贝叶斯网络
2022-04-03 00:53:09

我的目标是从经典的雨、洒水器、湿草问题中推断出条件概率表 (CPT) 。通常在这个问题中,我们知道 CPT,并且给定诸如“草是湿的”这样的观察结果,我们会查询贝叶斯网络以获取下雨或洒水的边际概率。

相反,我对图中的每个节点都有一组状态观察:

rain, sprinkler, wet grass
T, F, T
F, F, F
T, F, T
T, T, T

等等。

我想使用 pymc 推断 CPT,但我无法思考如何在模型中表达图形。在我看来,我有以下几点:

import pymc as pm
import numpy as np
p_rain = pm.Beta('p_rain',1,1)
rain = pm.Bernoulli('rain', p_rain)
sprinkler = [pm.Dirichlet('sprinkler%i' % i, np.ones(2)) for i in xrange(2)]
grass_wet = [pm.Dirichlet('grass_wet%i' % i, np.ones(2)) for i in xrange(4)] 

这描述了此处针对此问题看到的 CPT 。

我现在遇到的困难是考虑如何使用我必须训练这个模型的观察结果。pymc 将执行绘制的采样链,p_rain从中提供rain. 然后用于设置 CPT,sprinkler其将返回洒水器打开或关闭的条件概率,而伯努利试验将返回其状态,sprinkler然后与 结合使用rain以选择 的条件概率grass_wet

我的代码中缺少rain从转换为 CPT的步骤sprinkler以及将这两个转换为 CPT for的步骤。grass_wet

如何在两个(我假设的)pymc 随机变量中指定该链,然后将其输入观察结果?

任何适用于我的参数学习之外的示例。或者其他贝叶斯网络包中的任何示例都会有所帮助。我可以努力将我看到的内容翻译成我的特定语法/包。

0个回答
没有发现任何回复~