【问题标题】:Custom likelihood in pymc3pymc3 中的自定义可能性
【发布时间】:2014-12-18 11:23:43
【问题描述】:

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

【问题讨论】:

    标签: pymc pymc3


    【解决方案1】:

    您需要使用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 确定性,但对于随机指标而言并不那么容易。

    【讨论】:

    • 以及如何定义一个在签名中具有“自我”的确定性函数,因为它属于一个类?请看我的相关帖子
    • 您不应该为确定性函数做任何事情,除非您想将它们的采样值保留在跟踪中,在这种情况下,您可以将其包装在 Determinstic 调用中。请参阅文档。
    • 不幸的是,这并不是那么简单,而且我没有在文档中找到信息......假设它正在“建设中”。
    • 确定性可以是模型中其他随机指标的任何函数。如果您使用自己的类(我认为这是因为它是一个自定义概率函数),那么它应该从 PyMC 类继承。
    • 不,抱歉,它仍然不起作用......我仍然无法使用 pymc3,并且我被 pymc2 卡住了。我一定遗漏了一些明显的东西。你能看看stackoverflow.com/questions/42205123/…吗?我需要定义一个 theano 操作,但我尝试组合 theano/pymc3 是错误的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-27
    • 2021-10-30
    • 1970-01-01
    • 2022-08-05
    • 2012-11-12
    • 2023-04-06
    • 1970-01-01
    相关资源
    最近更新 更多