为了可重复性:
np.random.seed(1) # for repeatability
ndim = 1 # number of dimensions or parameters
# number of clusters: 簇的数量
# cluster number:簇号
原则上变量名要和对应的其现实意义甚至物理意义相关联。
nburn = 1000
# 'burn_in' period to let chains stabilize
samples = sampler.chain[:, nburn:, :].ravel()
# 实现其burn的意义
def lnprob(x, mu, icov):
diff = x-mu
# 提前定义变量的目的是为了避免二次计算
return -np.dot(diff, np.dot(icov, diff))/2
>>> p0 = np.random.rand(nwalkers * ndim).reshape((nwalkers, ndim))
# 这样做的效率会否高于np.random.rand(nwalkers, ndim)?
# 留待以后考证吧
如何进行高维数据的可视化:一维一维的,可能最为老土,但至少是一种勉强可行的方案:
for i in range(ndim):
plt.figure()
plt.hist(sampler.flatchain[:, i], 100, histtype='step')
plt.title('Dimension {0:d}'.format(i))
plt.show()
nwalkers, ndim = 250, 50 nburn, nsteps = 1000, 2000
在一些函数(尤其相关最优化函数)的参数设置中,常有disp这一可选参数,表示是否显示优化过程中的中间呢信息。
from scipy import optimize
optimize.fmin(neg_log_likelihood, x0, args=(), disp=0)
# 也即默认disp=1,
# 也即会显示中间信息
starting_guess, pos0, p0
from emcee import EnsembleSampler
sampler = EnsembleSampler(……)
sampler.run_mcmc(pos0=, )
y~ :y_tilde,y 一弯
y^ :y_hat, y 尖儿