首页 > 解决方案 > 使用具有固定参数的 scipy.otimize.least_squares 时更改函数后的 TypeError (Python)

问题描述

我尝试使用 scipy.optimize 包中的 minimum_squares 来拟合数据。我有一个可行的半解决方案并更改了 fit 函数并突然得到一个

TypeError: <lambda>() takes exactly 4 arguments (5 given)

这是代码的相关部分:

from scipy.optimize import least_squares
def hill_fit(x,kd,start,end,n):
    return start+(end-start)*x**n/(kd**n+x**n)
fitfun_hill_err= lambda p,x,fix,err: hill_fit(x,p[0],p[1],p[2],fix[0])/err
p_init=[0.1,.1,.2] 
fix=np.array([.5] ).ravel()
least_squares(fitfun_hill_err, p_init, args=(x_data, y_data,fix,y_error),bounds=(0,500))

我想拟合 p[..] 中的参数,因此是 lambda 函数。

x_data 是函数的输入数据,y_error 是结果数据 (y_data) 的不确定性,而 fix 是传递给函数的附加参数。

我之前使用过以下功能(相应地调整参数):

def func_fit(conc, Kd2, B, C, Rt, Lst, Kd1):
    Lt = conc
    e_tmp = e(Lt, Rt, Kd1, Lst, Kd2)
    d_tmp = d(Kd1, Kd2, Lst, Lt, Rt)
    f_tmp = f(Kd1, Kd2, Rt)
    theta_tmp = theta(d_tmp, e_tmp, f_tmp)
    FA_tmp = FA(B, C, d_tmp, e_tmp, f_tmp, theta_tmp, Kd1)

    return FA_tmp   

使用 e、d、f、theta 和 FA 调用子函数。

我之前经历过“我需要以包装的方式给最小平方参数”,这就是我引入 lambda 函数的原因,但我不明白为什么它不再起作用了。

请帮助我理解 minimum_square 函数的行为以及我在这里误解的内容!

谢谢!

标签: pythonscipycurve-fitting

解决方案


遵循错误消息:TypeError: () 正好需要 4 个参数(给定 5 个)。

fitfun_hill_err= lambda p,x,fix,err

lambda 接受参数和 3 个其他参数 ( x, fix, err)。一共4个论点。

least_squares使用参数和其他 4 个参数 ( ) 调用此函数args=(x_data, y_data, fix, y_error),总共 5 个参数。

x期望和传递x_data和之间存在不匹配y_data


推荐阅读