使用 lmfit 时将参数传递给 emcce 示例

问题描述

我正在尝试使用 lmfit 和 emcee minner 将一个函数拟合到两个数据集

我的代码如下:

minner = lmfit.Minimizer(function_2min,params,fcn_args=([x1,x2],[y1,y2],[y_err1,y_err2]))
result = minner.minimize(method='emcee')

这对某些数据集很有效,但有时我会收到如下所示的错误:

“ValueError:初始状态有一个很大的条件数。确保你的步行者是线性独立的以获得最佳性能”

从我搜索的内容来看,跳过此错误的解决方案似乎是在 emcce sample

中将 skip_initial_state_check 参数设置为 True

我尝试通过这种方式将此设置传递给最小化器来做到这一点:

result = minner.minimize(method='emcee',**{'skip_initial_state_check':True})

但是我得到一个错误:

"TypeError: emcee() 得到一个意外的关键字参数 'skip_initial_state_check'"

然而,当我试图通过将任何其他参数传递给 emcee 来做到这一点时,它似乎有效。例如,这工作正常:

result = minner.minimize(method='emcee',**{'nwalkers':5000})

所以我的结论是,我没有将参数传递给司仪样本,而是一般传递给司仪。任何人都会这么好心提出解决方案吗?不幸的是,我不能使用最小二乘拟合,因为它经常会卡在局部最小值上。

解决方法

lmfit.emcee 创建一个 emcee.EnsembleSampler,然后运行该采样器 run_mcmc() 方法。您可以将可选参数传递给 lmfit.emcee(....,run_mcmc_kwargs={})

不过,我不知道这是否会满足您的要求。我猜您在尝试跳过检查之前实际上想注意 emcee 给出的错误消息。

更重要的是,您打开的前提是“我正在尝试使用 lmfit 和司仪将一个函数拟合到两个数据集”,这表明您走错了路。 emcee 没有——也不能——实际上适合。它可以探索参数空间,这肯定是有用的,但它从不打算寻找改进的解决方案。

如果进行实际拟合发现错误的最小值,那么您可能需要一个更“全局”的求解器(emcee 也不属于该类别!)或了解为什么您的问题容易出现这种错误的最小值——也许它们毕竟不是那么错误,或者它可能指向一个有缺陷的模型或“拟合优度”指标。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...