我想知道是否可以在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中找到
你能发布完整的虫子模型吗?在上面的例子中,它看起来就像是在x和y的prior之后,bug中的一系列确定性转换,而不是一个prior的定义。在
但是,假设上面的
logp
是您想要的,那么您可以在PyMC中实现它,其简单得多:相关问题 更多 >
编程相关推荐