使用Python进行贝叶斯建模



我使用pymc3包在Python中进行贝叶斯建模。下面是我的代码

import pymc3 as pm
with pm.Model() as model :
mu = pm.Normal("mu", mu = 0, sigma = 1)
obs = pm.Normal("obs", mu = mu, sigma = 1, observed = np.random.randn(100))
model.logp({"mu": 0})

上述logp方法给出的结果为array(-149.24174903)

你能帮我理解一下这个号码是指什么吗?它是对数似然函数吗?我也检查了下面的,但无法匹配这个数字

import scipy.stats
import numpy as np
np.log(scipy.stats.norm(0, 1).pdf(0)) ### -0.9189385332046727

logp方法应该为您提供未规范化的对数后验,即贝叶斯规则的(log(分子。回想一下,后验与先验和似然的乘积成比例,对数后验与对数先验和对数似然的和成比例。也就是说,如果你想重现logp的输出,你还必须考虑可能性,而不仅仅是先验。你可以这样检查:

import pymc3 as pm
import scipy.stats
import numpy as np
# declare observed data above to check later
data = np.random.randn(100)
# that's the parameter value for which you want the unnormalized log posterior density
fixed_mu = 0 
with pm.Model() as model :
mu = pm.Normal("mu", mu=0, sigma=1)
obs = pm.Normal("obs", mu=mu, sigma=1, observed=data)
# unnormalized log posterior as given by pymc3
pm_log_posterior = model.logp({"mu": 0})
# log prior as given by scipy
np_log_prior = scipy.stats.norm(0, 1).logpdf(fixed_mu)
# log likelihood as given by scipy
np_log_likelihood = scipy.stats.norm(fixed_mu, 1).logpdf(data).sum()
# unnormalized posterior is the sum
np_log_posterior = np_log_likelihood + np_log_prior

现在np_log_posteriorpm_log_posterior应该是相同的。

最新更新