使用 scipy curve_fit 参数数量可变

Using scipy curve_fit for a variable number of parameters

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

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 并具有我希望的行为,其中它将列表元素视为单独的参数吗?假设答案是肯定的,那么我的函数调用哪里做错了?

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

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]

我能够以不同的方式解决同样的问题。我使用 scip.optimize.least_squares 来求解而不是 curv_fit。我已经在 link-

下讨论了我的解决方案