由于您使用的是标准优化例程,因此您可以将要最小化的函数表示为对数似然。如果它表示为对数似然,并且您要做的只是探索参数的后验分布,您可能会发现emcee更易于使用。就我而言,在我开始研究 mcmc 方法之前,我实际上是在最小化对数似然。
from scipy.optimize import minimize
bnds = ((.0001,20),(.0001,20),(.0001,20),(.0001,20))
solution = minimize(my_function_ll, np.array([1.1,1.2,1.3,1.4]),
args=(my_data),
bounds=bnds )
我所要做的就是像这样将 my_function_ll() 插入司仪:
import emcee
# for reproducible results
np.random.seed(0)
ndim = 4 # number of parameters in the model
nwalkers = 10 # number of MCMC walkers
nburn = 1000 # "burn-in" period to let chains stabilize
nsteps = 10000 # number of MCMC steps to take
# we'll start at random locations between 0 and 2
starting_guesses = 2*np.random.rand(nwalkers, ndim)
def log_prior(theta):
x1,x2,x3,x4 = theta
# here you can specify boundary. In my case I was using 0 - 20
if 0.0001 < x1 < 20 and 0.0001 < x2 < 20 and 0.0001 < x3 < 20 and 0.0001 < x4 < 20:
return 0.0
return -np.inf
def log_posterior(theta, observation_array):
lp = log_prior(theta)
if not np.isfinite(lp):
return -np.inf
return log_prior(theta) + my_function_ll(theta, observation_array)
sampler = emcee.EnsembleSampler(nwalkers, ndim, log_posterior,
args=[my_data])
sampler.run_mcmc(starting_guesses, nsteps)
sample = sampler.chain[:, nburn:, :].reshape(-1, 4)
现在您可以比较 MCMC 和 MLE 结果:
print "MLE: ", solution.x
print "MCMC: ", sample.mean(0)