【问题标题】:Passing arguments to emcce sample when using lmfit使用 lmfit 时将参数传递给 emcce 示例
【发布时间】:2021-06-17 11:01:39
【问题描述】:

我正在尝试使用 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:初始状态的条件数很大。确保你的 walkers 是线性独立的以获得最佳性能”

从我的谷歌搜索看来,跳过此错误的解决方案似乎是在 emcce sample 中将 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。有人会这么好心地提出解决方案吗?不幸的是,我不能使用最小二乘拟合,因为它往往会经常卡在局部最小值上。

【问题讨论】:

    标签: python python-3.x lmfit emcee


    【解决方案1】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2017-01-30
      • 1970-01-01
      • 1970-01-01
      • 2017-02-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-27
      • 2014-05-24
      相关资源
      最近更新 更多