我有一个拟合函数,其形式为:
def fit_func(x_data, a, b, c, N)
其中a,b,c是lenth 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并具有我希望的行为,其中它将列表元素视为单个参数吗?假设答案是肯定的,我的函数调用错误了什么?
答案 0 :(得分:3)
这里的解决方案是编写一个包装函数,它接受您的参数列表并将其转换为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]
答案 1 :(得分:1)
我能够以不同的方式解决相同的问题。我使用scip.optimize.least_squares解决而不是使用curv_fit。我已经在链接https://stackoverflow.com/a/60409667/11253983
下讨论了我的解决方案