pymc3中的自定义可能性

时间:2014-12-18 11:23:44

标签: pymc pymc3

如何在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的似然函数?

1 个答案:

答案 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确定性,但对于随机指标来说并不容易。