使用scipy curve_fit获取可变数量的参数

时间:2015-12-07 15:06:34

标签: python-2.7 scipy curve-fitting

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

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

2 个答案:

答案 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

下讨论了我的解决方案