如何使用scipy least_squares估计未知参数及排查运行报错
报错原因
你对least_squares的接口逻辑理解有误,代码存在两处核心错误:
- 传入的目标函数不符合要求:
least_squares要求第一个入参是残差计算函数,该函数第一个参数必须是待估计的参数数组,返回值是每个样本点的预测值与真实值的残差序列。你写的result函数内部嵌套调用curve_fit,返回值是拟合结果元组,完全不满足接口要求。 - 参数初始值传参错误:
least_squares第二个位置参数是待估参数的初始猜测值x0,你错把自变量数据集x传到了这个位置,直接触发类型校验报错。
正确使用方法
least_squares的核心逻辑是最小化残差平方和,你只需要单独定义残差计算逻辑,给a、b、c三个参数传入合理的初始值即可,完整可运行代码如下:
import numpy as np from scipy.optimize import least_squares np.random.seed(0) x = np.random.randint(0, 100, 100) # 自变量样本 y = np.random.randint(0, 100, 100) # 因变量样本 def func(x, a, b, c): return a*x**2 + b*x + c # 定义符合least_squares要求的残差函数 def calc_residuals(params, x_data, y_data): a, b, c = params # 拆分待估参数 y_pred = func(x_data, a, b, c) return y_pred - y_data # 返回残差序列 # 调用拟合:注意第二个参数是a/b/c的初始猜测值,不是自变量x sol = least_squares( calc_residuals, x0=[1, 1, 1], args=(x, y), method='lm', jac='2-point', max_nfev=2000 ) # 提取拟合得到的参数 a_fit, b_fit, c_fit = sol.x print(f"拟合结果:a={a_fit:.4f}, b={b_fit:.4f}, c={c_fit:.4f}")
补充说明:
curve_fit本身就是对least_squares的上层封装,只要残差定义、参数初始值一致,两种方法得到的拟合结果完全相同。
内容的提问来源于stack exchange,提问作者user032020
相关产品推荐
相关产品推荐

