【问题标题】:How do I get parameters from a posterior distribution in PyMC?如何从 PyMC 中的后验分布中获取参数?
【发布时间】:2014-10-08 12:14:39
【问题描述】:

我有以下用 PyMC 编写的程序:

import pymc
from pymc.Matplot import plot as mcplot

def testit( passed, test_p = 0.8, alpha = 5, beta = 2):
    Pi = pymc.Beta( 'Pi', alpha=alpha, beta=beta)
    Tj = pymc.Bernoulli( 'Tj', p=test_p)

    @pymc.deterministic
    def flipper( Pi=Pi, Tj=Tj):
            return Pi if Tj else (1-Pi)
            # Pij = Pi if Tj else (1-Pi)
            # return pymc.Bernoulli( 'Rij', Pij)

    Rij = pymc.Bernoulli( 'Rij', p=flipper, value=passed, observed=True)

    model = pymc.MCMC( [ Pi, Tj, flipper, Rij])
    model.sample(iter=10000, burn=1000, thin=10)

    mcplot(model)

testit( 1.)

它似乎工作正常,但我想从后验分布中提取参数。如何从Tjalpha/betaPi 获得后p

【问题讨论】:

    标签: python pymc


    【解决方案1】:

    你很亲密。如果您稍微重构一下,以便在函数之外拥有 Pi 和 Tj 对象,您可以直接从(近似)后验分布访问 MCMC 样本:

    import pymc
    
    def testit(passed, test_p = 0.8, alpha = 5, beta = 2):
        Pi = pymc.Beta( 'Pi', alpha=alpha, beta=beta)
        Tj = pymc.Bernoulli( 'Tj', p=test_p)
    
        @pymc.deterministic
        def flipper( Pi=Pi, Tj=Tj):
                return Pi if Tj else (1-Pi)
                # Pij = Pi if Tj else (1-Pi)
                # return pymc.Bernoulli( 'Rij', Pij)
    
        Rij = pymc.Bernoulli( 'Rij', p=flipper, value=passed, observed=True)
    
        return locals()
    
    vars = testit(1.)
    model = pymc.MCMC(vars)
    model.sample(iter=10000, burn=1000, thin=10)
    

    然后您可以使用.trace().stats() 方法检查TiPj 的边际后验分布:

    In [12]: model.Pi.stats()
    Out[12]:
    {'95% HPD interval': array([ 0.43942434,  0.9910729 ]),
     'mc error': 0.0054870077893956213,
     'mean': 0.7277823553617826,
     'n': 900,
     'quantiles': {2.5: 0.3853555534589701,
      25: 0.62928387568176036,
      50: 0.7453244339604943,
      75: 0.84835518829619661,
      97.5: 0.95826093368693854},
     'standard deviation': 0.15315966296243455}
    In [13]: model.Tj.stats()
    Out[13]:
    {'95% HPD interval': array([ 0.,  1.]),
     'mc error': 0.011249691353790801,
     'mean': 0.89666666666666661,
     'n': 900,
     'quantiles': {2.5: 0.0, 25: 1.0, 50: 1.0, 75: 1.0, 97.5: 1.0},
     'standard deviation': 0.30439375084839554}
    

    【讨论】:

    • 好的,谢谢。然后我可以使用 this 之类的东西获得 alpha 和 beta。
    猜你喜欢
    • 2013-12-02
    • 1970-01-01
    • 2013-05-19
    • 2016-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-05
    • 1970-01-01
    相关资源
    最近更新 更多