2017-04-21 60 views
0

我试图建立一个简单的贝叶斯网络,其中雨水和喷灌是湿草的父母,但雨水和喷水器每个都有三个(模糊逻辑类型而不是通常的两个布尔)状态,而湿草有两个状态(真假)。我无法在pymc3文档中的任何地方找到用于描述CPT的语法 - 我正在尝试基于2状态示例的以下内容,但它不是按照我认为的方式推广到三个状态。任何人都可以显示正确的方法来做到这一点? (也为地方wetgrass有三种状态也更普遍的情况)pymc3如何编码多状态离散贝叶斯网络CPT?

rain = mc.Categorical('rain', p = np.array([0.5, 0. ,0.5])) 

sprinker = mc.Categorical('sprinkler', p=np.array([0.33,0.33,0.34])) 

wetgrass = mc.Categorical('wetgrass', 
    mc.math.switch(rain, 
     mc.math.switch(sprinker, 10, 1, -4), 
     mc.math.switch(sprinker, -20, 1, 3), 
     mc.math.switch(sprinker, -5, 1, -0.5))) 

[给人以wetgrass定义错误: 为Switch.make_node输入号码错误(GOT 4((,,,))预计3) ]

据我了解 - 开关是一个theano函数类似于(b?a:b)在C程序中;这只是进行双向比较。也许可以使用像这样的二进制开关的整个负载来设置CPT,但我真的只想给出一个3D矩阵CPT作为BNT和其他bayes网络库中的输入。目前这可能吗?

回答

1

您可以使用编码两个独立开关的三路开关:

tt.switch(sprinker == 0, 
    10 
    tt.switch(sprinker == 1, 1, -4)) 

但总的来说它可能是更好的索引表:

table = tt.constant(np.array([[...], [...]])) 
value = table[rain, sprinker] 
+0

感谢 - 这是工作到定义网络,但是我在运行采样和logp计算时遇到了麻烦 - 不过现在我会问这是一个单独的问题。 –

+0

新的问题和运行代码,包括aseyboldt的答案是这里:http://stackoverflow.com/questions/43540977/pymc3-mutli-category-bayesian-network-sampling-and-logp-calculate –