将 scipy curve_fit 用于可变数量的参数

KBr*_*ggs 3 curve-fitting scipy python-2.7

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

def fit_func(x_data, a, b, c, N)
Run Code Online (Sandbox Code Playgroud)

其中a、b、c是lenth N的列表,其中的每一项都是scipy.optimize.curve_fit()中要优化的可变参数,N是用于循环索引控制的固定数。

按照这个问题,我想我可以修复 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)
Run Code Online (Sandbox Code Playgroud)

我收到一个错误: lambda() 正好采用 Q 个参数(给定的 P)

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

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

KBr*_*ggs 5

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

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)
Run Code Online (Sandbox Code Playgroud)

并修复 N 你必须像这样在 curve_fit 中调用它:

popt, pcov = curve_fit(lambda x, *params_0: wrapper_fit_func(x, N, params_0), x, y, p0=params_0)
Run Code Online (Sandbox Code Playgroud)

在哪里

params_0 = [a_1, ..., a_N, b_1, ..., b_N, c_1, ..., c_N]
Run Code Online (Sandbox Code Playgroud)