如何在PyMC3中定义自定义可能性?在PyMC2中,我可以使用@pymc.potential
。我试图在PyMC3中使用pymc.Potential
,但似乎布尔操作不能应用于参数(当我这样做时,我得到像this这样的错误)。例如,以下代码不起作用:
from pymc import *
with Model() as model:
x = Normal('x', 1, 1)
def z(u):
if u > 0: #comparisons like this are not supported
# if theano.tensor.lt(0,u): this is how comparison should be done
return u ** 2
return -u**3
x2 = Potential('x2', z(x))
start = model.test_point
h = find_hessian(start)
step = Metropolis(model.vars, h)
sample(100, step, start)
我无法将可能性中的所有比较更改为Theano语法(即theano.tensor。{lt,le,eq,neq,gt,ge})。无论如何使用定义类似于PyMC2的似然函数?
答案 0 :(得分:13)
您需要使用DensityDist
函数来包装日志可能性。从与源捆绑在一起的示例:
with Model() as model:
lam = Exponential('lam', 1)
failure = np.array([0, 1])
value = np.array([1, 0])
def logp(failure, value):
return sum(failure * log(lam) - lam * value)
x = DensityDist('x', logp, observed=(failure, value))
您可以使用@theano.compile.ops.as_op
装饰器制作任意非Theano确定性,但对于随机指标来说并不容易。