我正在尝试使用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
也不属于这一类;适合度";。