我正在使用 Python 在 Python 中运行 MCMC 进程emcee
。我的 python 代码是一个不同软件的包装器。emcee
walkers 对该软件的输入参数空间进行采样。该软件读取一个文本文件作为其输入。emcee
我的代码使用链的每个步骤生成此文本文件。为了加快采样速度,我希望多个进程并行运行来评估对数似然。但是,这些进程中的每一个都需要写入不同的输入文本文件,以防止进程之间的干扰。出于这个原因,我认为我不能使用司仪网站上的简单标准示例。
理想情况下,我希望每个进程在自己的子目录中运行,生成不同的输入文件,这样不同的进程就不会相互干扰。为此,我使用Pool
frommultiprocessing
手动创建并行进程,而不是使用默认选项 from emcee
。我知道为了让不同的并行进程产生不同的随机数,我需要为每个 PRNG 提供不同的种子。我当前的代码如下:
def log_likelihood(x):
#update input text file and run software
return log_likelihood
def run_mcmc(inp_directory)
os.chdir(inp_directory)
seedint = int(dusty_inpdir.split('_')[-1]) #sets a different seed for each process
np.random.seed(seedint)
sampler = emcee.EnsembleSampler(nwalkers, ndim, log_likelihood)
sampler.run_mcmc(initial_pos,ntrials)
pool = Pool()
inp_dirlist = ['proc_0','proc_1','proc_2','proc_3']
pool.map(run_mcmc,inp_dirlist)
尽管为每个进程提供了不同的种子,但所有 4 个进程都会生成完全相同的一组emcee
步骤。
不是播种PRNGnp.random.seed
的相关参数吗?emcee
有没有更好的方法让不同的进程在不同的目录中工作?