使用emcee两次生成样本结果完全相同的技术疑问
emcee重复采样得到完全相同样本的原因及解决方法
问题背景
使用emcee基于同一概率函数两次生成样本时,若使用相同初始状态(包括burn-in后的状态),两次采样得到的样本完全一致;仅当初始状态不同时,样本才会有差异。原本认为随机采样应得到不同结果,对此产生疑惑。
复现代码及结果
初始状态相同时的代码:
import emcee import numpy as np NWALKERS = 32 NDIM = 2 NSAMPLES = 1000 def ln_gaussian(x): # mu = 0, cov = 1 a = (2*np.pi)** -0.5 return np.log(a * np.exp(-0.5 * np.dot(x,x))) p0 = np.random.rand(NWALKERS, NDIM) sampler1 = emcee.EnsembleSampler(NWALKERS, NDIM, ln_gaussian) sampler2 = emcee.EnsembleSampler(NWALKERS, NDIM, ln_gaussian) state1 = sampler1.run_mcmc(p0, 100) # burn in state2 = sampler2.run_mcmc(p0, 100) # burn in sampler1.reset() sampler2.reset() # run sampler 1k times (x32 walkers) sampler1.run_mcmc(state1, NSAMPLES) sampler2.run_mcmc(state2, NSAMPLES) s1 = sampler1.get_chain(flat=True) s2 = sampler2.get_chain(flat=True) s1 - s2
输出结果(所有元素为0):
array([[0., 0.], [0., 0.], [0., 0.], ..., [0., 0.], [0., 0.], [0., 0.]])
当初始状态不同时:
p0 = np.random.rand(NWALKERS, NDIM) p1 = np.random.rand(NWALKERS, NDIM)
输出结果(元素非零):
array([[-0.70474519, -0.09671908], [-0.31555036, -0.33661664], [ 0.75735537, 0.01540277], ..., [ 2.84810783, -2.11736446], [-0.55164227, -0.26478868], [ 0.01301593, -1.76233017]])
原因分析
MCMC采样的“随机性”完全依赖于随机数生成器(RNG)的输出序列,而emcee的EnsembleSampler默认会使用相同的RNG起点:
- 当两个采样器从完全相同的初始状态(包括walker的位置、采样器内部的RNG状态)启动时,每一步的随机提议、接受判断逻辑都会完全一致,最终生成的采样路径和样本自然完全相同。
- 代码中
state1和state2不仅存储了burn-in后的walker位置,还包含了采样器当前的RNG状态。因此后续用这两个状态启动采样时,RNG会从相同的位置开始生成随机数,导致结果完全重合。
解决方法
要让两次采样得到不同结果,只需确保两个采样器使用不同的随机种子,有两种常见方式:
1. 初始化采样器时指定不同seed
sampler1 = emcee.EnsembleSampler(NWALKERS, NDIM, ln_gaussian, seed=42) sampler2 = emcee.EnsembleSampler(NWALKERS, NDIM, ln_gaussian, seed=123)
2. 初始化前重置numpy随机种子
np.random.seed(42) sampler1 = emcee.EnsembleSampler(NWALKERS, NDIM, ln_gaussian) np.random.seed(123) sampler2 = emcee.EnsembleSampler(NWALKERS, NDIM, ln_gaussian)
内容的提问来源于stack exchange,提问作者Glance
相关产品推荐
相关产品推荐

