我是第一次实现MCMC模拟,并且我有一个基于前一个变量的结果定义的变量。例如,如果我的bernoulli变量返回0,则会有一个不同的值被送入确定性变量,而不是返回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)
我的问题是,由于x不是整数,因此不会输入这些if语句,它是一个分布。有没有办法获得x的采样值?或者我只想到这个错误?
答案 0 :(得分:0)
你是对的,你应该使用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
计算第一个参数,如果true则返回第二个参数,否则返回第三个参数。
如果您有两个以上的条件,也可以使用多个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)