我正在尝试建立一个模型,其中分配给分布的先验取决于特定值,并且该值是另一个被采样的变量。例如,根据概率 p 的伯努利试验对正确回答问题的学生进行建模。如果学生有给定的先决条件(他们自己是模型的一部分),p 应该从 Beta(20,5) 中得出。如果不是,p 应该从 Beta(5,20) 中得出。
我用下面的代码让它在 PyMC2 中工作:
# prior for thetas - same for all students
lambda1 = pymc.Beta('lambda1',alpha=20,beta=5)
#top-level node - one for each student
theta1 = []
for i in range(num_students):
theta1.append(pymc.Bernoulli('theta1_%i' % i, p=lambda1, plot=False))
lambda2 = [
pymc.Beta('lambda2_0', alpha=5,beta=20),
pymc.Beta('lambda2_1', alpha=20,beta=5)
]
lambda2_choices = []
theta2 = []
for i in range(num_students):
@pymc.deterministic(name='lambda2_choice_%i'%(i), plot=False)
def lambda2_choice(theta1 = theta1[i],
lambda2 = lambda2):
if theta1 == False:
return lambda2[0]
elif theta1 == True:
return lambda2[1]
lambda2_choices.append(lambda2_choice)
theta2.append(pymc.Bernoulli('theta2_%i' % i,p=lambda2_choice))
换句话说,分配给伯努利随机变量的先验是一个确定性函数,它根据某个其他值的 SAMPLED 值返回一个随机变量,在本例中为 theta1[i]。
我无法弄清楚如何在 PyMC3 中执行此操作,因为 @deterministic 装饰器不再存在,并且确定性函数必须将输入/输出作为 Theano 变量。
我真的很感激任何见解或建议!