pymc3如何编码多状态离散贝叶斯网络CPT?

时间:2017-04-21 08:40:38

标签: pymc pymc3

我试图建立一个简单的贝叶斯网络,其中雨和洒水器是湿草的父母,但雨和洒水器每个都有三个(模糊逻辑类型,而不是通常的两个布尔)状态,而湿草有两种状态(真/假)。我无法在pymc3文档中的任何地方找到用于描述CPT的语法 - 我尝试基于2状态示例的以下内容,但它没有推广到三个状态方式,我认为它会。任何人都可以显示正确的方法吗? (而且对于更常见的情况,湿草也有三种状态。)

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)))

[给出湿草定义错误:  Switch.make_node的输入数量错误(得到4((,,)),预计3) ]

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

1 个答案:

答案 0 :(得分:1)

您可以使用两个单独的开关对三向开关进行编码:

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

但总的来说,索引表格可能更好:

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