【问题标题】:using decorators to define models in PyMC在 PyMC 中使用装饰器定义模型
【发布时间】:2015-02-25 00:04:33
【问题描述】:

下面是定义两个随机伯努利随机变量的一种方法,一个依赖于另一个带有装饰器的变量。该模型旨在:

p(A) = 0.5
p(B=True|A=True) = 0.75
p(B=True|A=False) = 0.05

在 PyMC 中使用装饰器是:

import pymc
from pymc import DiscreteUniform, Exponential, deterministic, Poisson, Uniform
import numpy as np

def make_model():
    @pymc.stochastic(dtype=bool)
    def A(value=False):
        def logp(value):
            return pymc.bernoulli_like(value, 0.5)

        def random():
            return bool(np.random.binomial(1, 10**logp(value)))


    @pymc.stochastic(dtype=bool)
    def B(value=False, A=False):
        def logp(value, A):
            if A:
                logp = pymc.bernoulli_like(value, 0.75)
            else:
                logp = pymc.bernoulli_like(value, 0.05)
            return logp

        def random(A):
            return bool(np.random.binomial(1, 10**logp(True, A)))

    return locals()

test = pymc.Model(make_model())

这是最正确和最紧凑的方法吗?是否可以通过将节点显式定义为pymc.Bernoulli 变量而不是使用stochastic 装饰器来保存一些代码?

上面的代码似乎是多余的,必须始终定义如何从伯努利 RV 中采样,但这也许是不可避免的?

最后是否需要像np.random.binomial 一样从numpy 调用采样函数,或者PyMC 中有采样函数吗?

【问题讨论】:

    标签: python numpy pymc mcmc


    【解决方案1】:

    我不认为这是正确的。例如,如果我使用以下代码从您的模型中采样,我发现A 的样本平均值不是 0.5:

    In [20]: pymc.MCMC(test).sample(10000)
     [-----------------100%-----------------] 10000 of 10000 complete in 0.6 sec
    In [22]: test.A.trace().mean()
    Out[22]:
    0.19670000000000001
    

    这是实现模型的一种简洁方法:

    import pymc as pm
    
    def make_model():
        A = pm.Bernoulli('A', .5)
        B_given_A_true = pm.Bernoulli('B_given_A_true', .75)
        B_given_A_false = pm.Bernoulli('B_given_A_false', .05)
    
        @deterministic
        def B(A=A, B_given_A_true=B_given_A_true,
              B_given_A_false=B_given_A_false):
            if A:
                return B_given_A_true
            else:
                return B_given_A_false
    
        return locals()
    
    test = pymc.Model(make_model())
    

    【讨论】:

    • 如果 B 的值由随机节点 A 确定,为什么 B 不是随机节点?
    • 这种语言令人困惑,B 是确定性的,因为它是随机的确定性函数。见here for more detail
    猜你喜欢
    • 2014-07-23
    • 1970-01-01
    • 2015-11-17
    • 2022-10-20
    • 1970-01-01
    • 2015-10-23
    • 1970-01-01
    • 1970-01-01
    • 2013-02-06
    相关资源
    最近更新 更多