如何从PyMC的后验分布中获取参数?

2024-06-16 14:42:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我用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.)

它似乎工作正常,但我想从后验分布中提取参数。我如何从Tj得到后面的p,从Pi得到{}/beta?在


Tags: testimportalphamodeldefpibetapymc
1条回答
网友
1楼 · 发布于 2024-06-16 14:42:41

你很亲密。如果您稍微重构一下,使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()和{}方法检查Ti和{}的边缘后验分布:

^{pr2}$

相关问题 更多 >