我试图建立一个简单的贝叶斯网络,其中雨和洒水器是湿草的父母,但雨和洒水器每个都有三个(模糊逻辑类型,而不是通常的两个布尔)状态,而湿草有两种状态(真/假)。我无法在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网络库中的输入。这目前可能吗?
答案 0 :(得分:1)
您可以使用两个单独的开关对三向开关进行编码:
tt.switch(sprinker == 0,
10
tt.switch(sprinker == 1, 1, -4))
但总的来说,索引表格可能更好:
table = tt.constant(np.array([[...], [...]]))
value = table[rain, sprinker]