使用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示例中将skip_initial_state_check参数设置为True

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

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

但我得到了一个错误:

"类型错误:emcee((获得了一个意外的关键字参数"skip_initial_state_check">

然而,当我试图通过将任何其他参数传递给emcee来做到这一点时,它似乎起到了作用。例如,这很好:

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

因此,我的结论是,我不是将参数传递给emcee示例,而是传递给一般的emcee。有人愿意提出解决方案吗?不幸的是,我不能使用最小二乘拟合,因为它经常陷入局部极小值。

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

不过,我不知道这是否能达到你想要的效果。我想,在尝试跳过检查之前,您实际上需要注意emcee给出的错误消息。

更重要的是,你打开了";我正试图使用lmfit将一个函数拟合到两个数据集;表明你走错了路。emcee实际上并没有——也不可能——进行拟合。它可以探索参数空间,这肯定是有用的,但它从未打算找到改进的解决方案。

如果做一次实际的拟合发现了错误的最小值,那么你可能想要一个更"完美"的拟合;全局";solver(emcee也不属于这一类;适合度";。

相关内容

  • 没有找到相关文章

最新更新