【发布时间】:2015-09-27 01:25:13
【问题描述】:
出于比较目的,我想在 PyMC3 之外使用后验密度函数。
对于我的研究项目,我想了解 PyMC3 与我自己的自定义代码相比的性能如何。因此,我需要将其与我们自己的内部采样器和似然函数进行比较。
我想我知道如何调用内部PyMC3后验,但是感觉很尴尬,我想知道是否有更好的方法。现在我正在手动转换变量,而我应该能够向 pymc 传递参数字典并获得后验密度。这是否可能以直接的方式进行?
非常感谢!
演示代码:
import numpy as np
import pymc3 as pm
import scipy.stats as st
# Simple data, with sigma = 4. We want to estimate sigma
sigma_inject = 4.0
data = np.random.randn(10) * sigma_inject
# Prior interval for sigma
a, b = 0.0, 20.0
# Build PyMC model
with pm.Model() as model:
sigma = pm.Uniform('sigma', a, b) # Prior uniform between 0.0 and 20.0
likelihood = pm.Normal('data', 0.0, sd=sigma, observed=data)
# Write my own likelihood
def logpost_self(sig, data):
loglik = np.sum(st.norm(loc=0.0, scale=sig).logpdf(data)) # Gaussian
logpr = np.log(1.0 / (b-a)) # Uniform prior
return loglik + logpr
# Utilize PyMC likelihood (Have to hand-transform parameters)
def logpost_pymc(sig, model):
sigma_interval = np.log((sig - a) / (b - sig)) # Parameter transformation
ldrdx = np.log(1.0/(sig-a) + 1.0/(b-sig)) # Jacobian
return model.logp({'sigma_interval':sigma_interval}) + ldrdx
print("Own posterior: {0}".format(logpost_self(1.0, data)))
print("PyMC3 posterior: {0}".format(logpost_pymc(1.0, model)))
【问题讨论】:
-
我刚刚发现可以将transform=None传递给Uniform,这样就解决了参数转换的问题。我仍然想知道是否可以在不更改内部 PyMC 表示的情况下。
标签: python-2.7 numpy bayesian theano pymc3