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 并具有我希望的行为,其中它将列表元素视为单个参数吗?假设答案是肯定的,那么我的函数调用做错了什么?
这里的解决方案是编写一个包装函数,该函数接受您的参数列表并将其转换为适合函数理解的变量。这真的只是必要的,因为我正在使用其他人的代码,在更直接的应用程序中,这将在没有包装层的情况下工作。基本上
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)