如何在PyMC3中定义自定义prior

2024-06-16 02:26:16 发布

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

我想知道是否可以在PyMC3中定义一个自定义prior(以及如何做到这一点)。从here看来,在PyMC2中做起来相对容易(不需要修改源代码),但在PyMC3中就不那么容易了(或者我不理解某些东西)。 我试图复制《做贝叶斯数据分析》(Doing Bayesian Data Analysis)一书中的内容,该书在BUGS中实现:

model {
# Likelihood. Each flip is Bernoulli.
for ( i in 1 : N1 ) { y1[i]  ̃ dbern( theta1 ) }
for ( i in 1 : N2 ) { y2[i]  ̃ dbern( theta2 ) }
# Prior. Curved scallo not ps!
x  ̃ dunif(0,1)
y  ̃ dunif(0,1)
N <- 4
xt <- sin( 2*3.141593*N * x ) / (2*3.141593*N) + x
yt <- 3 * y + (1/3)
xtt <- pow( xt , yt )
theta1 <- xtt
theta2 <- y
}

prior没有太多的意义,它只是一个例子,说明如何定义一个自定义的prior和bug的多功能性。在

我尝试实现上述定制优先权是:

^{pr2}$

编辑

chris-fonnesbeck的答案之后

我想我需要这样的东西:

with pm.Model() as model:
    theta2 = pm.Uniform('theta2', 0, 1)  # prior
    N = 4
    theta1 = pm.DensityDist('theta1', lambda value: -log((sin(2*3.141593*N * value)
                       / (2*3.141593*N) + value)**(3 * theta2 + (1/3))))
    # define the likelihood
    y1 = pm.Bernoulli('y1', p=theta1, observed=y1)
    y2 = pm.Bernoulli('y2', p=theta2, observed=y2)

    # Generate a MCMC chain
    start = pm.find_MAP()  # Find starting value by optimization
    trace = pm.sample(10000, pm.NUTS(), progressbar=False) # Use NUTS sampling

唯一的问题是θ1和θ2的所有后验样本的值都是一样的,我想我的自定义先验值或者先验值和似然值的组合有问题。自定义优先级的成功定义可以在example中找到


Tags: informodel定义valuebernoullipriorpymc3
1条回答
网友
1楼 · 发布于 2024-06-16 02:26:16

你能发布完整的虫子模型吗?在上面的例子中,它看起来就像是在x和y的prior之后,bug中的一系列确定性转换,而不是一个prior的定义。在

但是,假设上面的logp是您想要的,那么您可以在PyMC中实现它,其简单得多:

def logp(value, y):
    N  = 4
    return -log((sin(2*3.141593*N * value)
                 / (2*3.141593*N) + value)**(3 * y + (1/3)))

theta1 = pm.DensityDist('theta1', logp, value, y=theta2)

相关问题 更多 >