我正在尝试创建一个嘈杂的或门(一个普通效果的贝叶斯网络,请参见下图)的PyMC3模型,如Rehder(1999)所述:
a1,a2和a3中的每一个均同样可能独立地导致a4:对于i!= 4,p(a4 | ai = 1)= c。
如果父节点处于关闭状态,则a4处于打开状态的概率为u。
所得的概率分布应在“共效应因果模型”下的下表中。 q是父母的无条件概率。
当然,我可以轻松地对a4对其他三个随机变量的依赖性进行硬编码,但我想知道PyMC3是否具有更紧凑的方式来表达这种分离相互作用。
参考:Rehder,B.(1999)。因果模型分类理论。在*认知科学学会第21届年会论文集*(第595–600页)中。
最佳答案
假设c
是共享值,我想到的捕捉关系的最紧凑的方法是将a_4
的概率降低到一个概率。也就是说,遵循以下原则:
import pymc3 as pm
import theano.tensor as tt
with pm.Model() as model:
# prior probabilities
q = pm.Beta('q', alpha=1, beta=1)
c = pm.Beta('c', alpha=1, beta=1)
u = pm.Beta('u', alpha=1, beta=1)
# input nodes
a_i = pm.Bernoulli('a_i', p=q, shape=3)
# prob for a_4
p = pm.math.switch(tt.any(a_i), 1.0 - (1.0 - c)**tt.sum(a_i), u)
# output node
a_4 = pm.Bernoulli('a_4', p=p)
prior = pm.sample_prior_predictive(samples=1000)
其中,如果任何
a_i
成功,则我们将在sum(a_i)
尝试(即1-(1-c)^sum(a_i)
)中计算任何成功的概率,否则仅使用u
。显然,先验概率可以是固定的,也可以根据需要独立设置(例如,可能需要独立的
q
值,这可以通过添加shape=3
来实现)。如果这不是您要查找的内容,则可以在问题中添加一些说明。
关于python - PyMC3中的嘈杂或门,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54421539/