【问题标题】:Using scipy curve_fit for a variable number of parameters对可变数量的参数使用 scipy curve_fit
【发布时间】:2016-03-12 05:49:27
【问题描述】:

我有一个拟合函数,其形式为:

def fit_func(x_data, a, b, c, N)

其中 a, b, c 是第 N 个列表,其中每个条目都是要在 scipy.optimize.curve_fit() 中优化的可变参数,N 是用于循环索引控制的固定数字。

按照this question 我想我可以修复N,但我目前正在调用curve_fit,如下所示:

params_0 = [a_init, b_init, c_init]
popt, pcov = curve_fit(lambda x, a, b, c: fit_func(x, a, b, c, N), x_data, y_data, p0=params_0)

我得到一个错误:lambda() 完全接受 Q 参数(P 给定)

Q 和 P 取决于我的设置方式。

那么:对于初学者来说,这甚至可能吗?我可以将列表作为参数传递给 curve_fit 并具有我希望的将列表元素视为单个参数的行为吗?假设答案是肯定的,那么我的函数调用做错了什么?

【问题讨论】:

  • 我认为documentation 可以帮助你,它不可能开箱即用。
  • 我做过 RTFM - 但作为一个新手程序员,我希望我可能会错过一个技巧。
  • 哈哈,kk,这也不是专业人士,但是你的 lambda 参数的可变数量呢,如here
  • 我认为这里的问题是 curve_fit() 不知道如何改变不是简单数值参数的参数。虽然看起来我可以绕过curve_fit并直接使用leastsq,因为它在残差函数中接受任意长度的参数元组。
  • 完成,抱歉耽搁了

标签: python-2.7 scipy curve-fitting


【解决方案1】:

这里的解决方案是编写一个包装函数,该函数接受您的参数列表并将其转换为 fit 函数可以理解的变量。这实际上只是必要的,因为我正在使用其他人的代码,在更直接的应用程序中,这将在没有包装层的情况下工作。基本上

def wrapper_fit_func(x, N, *args):
    a, b, c = list(args[0][:N]), list(args[0][N:2*N]), list(args[0][2*N:3*N])
    return fit_func(x, a, b, c, N)

要修复 N,您必须像这样在 curve_fit 中调用它:

popt, pcov = curve_fit(lambda x, *params_0: wrapper_fit_func(x, N, params_0), x, y, p0=params_0)

在哪里

params_0 = [a_1, ..., a_N, b_1, ..., b_N, c_1, ..., c_N]

【讨论】:

    【解决方案2】:

    我能够以不同的方式解决相同的问题。我使用 scip.optimize.least_squares 来求解,而不是使用 curv_fit。我已经在链接下讨论了我的解决方案-https://stackoverflow.com/a/60409667/11253983

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-10-12
      • 2021-02-16
      • 2014-07-12
      • 1970-01-01
      • 2022-11-22
      • 2017-01-31
      • 2016-09-24
      • 2013-07-30
      相关资源
      最近更新 更多