如何解决使用 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
也不属于该类别!)或了解为什么您的问题容易出现这种错误的最小值——也许它们毕竟不是那么错误,或者它可能指向一个有缺陷的模型或“拟合优度”指标。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。