PyMC3 变量依赖于另一个结果

PyMC3 variable dependent on result of another

我是第一次实施 MCMC 模拟,我有一个根据前一个变量的结果定义的变量。例如,如果我的伯努利变量 returns 为 0,则输入确定性变量的值将不同于 returns 为 1.

的值
with pm.Model() as model:
    x = pm.Bernoulli('x', .5)
    if x == 1:
        y = 1 
    elif x == 0:
        y = 2
    z = pm.Deterministic('z', y * 1000)

我的问题是这些 if 语句都不会被输入,因为 x 不是整数,它是一个分布。有没有办法得到x的采样值?还是我只是想错了?

你是对的,你应该使用Theano的功能switch

with pm.Model() as model:
    x = pm.Bernoulli('x', .5)
    y = pm.math.switch(x, 1, 0)
    z = pm.Deterministic('z', y * 1000) 

或者更冗长一点

with pm.Model() as model:
    x = pm.Bernoulli('x', .5)
    y = pm.math.switch(pm.math.eq(x, 1), 1, 0)
    z = pm.Deterministic('z', y * 1000) 

switch 计算第一个参数,如果为真 returns 第二个参数,否则第三个。

如果你有两个以上的条件,你也可以使用多个switch

with pm.Model() as model:
    x = pm.DiscreteUniform('x', 0, 2)
    y_ = pm.math.switch(pm.math.eq(x, 1), 1, 0)
    y = pm.math.switch(pm.math.eq(x, 2), 2, y_)
    z = pm.Deterministic('z', y * 1000)