首页 文章

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

提问于
浏览
3

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

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

1 回答

  • 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]
    

相关问题