1

我正在尝试使用 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示例skip_initial_state_check中设置参数True

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

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

但是我得到一个错误:

“TypeError:emcee() 得到了一个意外的关键字参数‘skip_initial_state_check’”

但是,当我尝试通过将任何其他参数传递给司仪来做到这一点时,它似乎可以工作。例如,这很好用:

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

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

4

1 回答 1

0

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

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

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

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

于 2021-06-19T12:47:57.840 回答