leastsq#
- scipy.optimize.leastsq(func, x0, args=(), Dfun=None, full_output=False, col_deriv=False, ftol=1.49012e-08, xtol=1.49012e-08, gtol=0.0, maxfev=0, epsfcn=None, factor=100, diag=None)[源代码][源代码]#
最小化一组方程的平方和。
x = arg min(sum(func(y)**2,axis=0)) y
- 参数:
- 函数可调用
应至少接受一个(可能是长度为
N
的向量)参数,并返回M
个浮点数。它不能返回 NaN,否则拟合可能会失败。M
必须大于或等于N
。- x0ndarray
最小化的初始估计值。
- 参数tuple, 可选
传递给 func 的任何额外参数都放在这个元组中。
- Dfun可调用,可选
一个用于计算函数或方法的雅可比矩阵的函数或方法,其导数沿行排列。如果这是None,雅可比矩阵将被估计。
- 完整输出bool, 可选
如果
True
,返回所有可选输出(不仅仅是 x 和 ier )。- col_derivbool, 可选
如果
True
,指定雅可比函数按列计算导数(更快,因为没有转置操作)。- ftolfloat, 可选
期望的平方和中的相对误差。
- xtolfloat, 可选
近似解中期望的相对误差。
- gtolfloat, 可选
期望函数向量与雅可比矩阵的列之间具有正交性。
- maxfevint, 可选
函数调用的最大次数。如果提供了 Dfun,则默认的 maxfev 是 100*(N+1),其中 N 是 x0 中元素的数量,否则默认的 maxfev 是 200*(N+1)。
- epsfcnfloat, 可选
用于确定雅可比矩阵前向差分近似合适步长的变量(当Dfun=None时)。通常实际步长将为sqrt(epsfcn)*x。如果epsfcn小于机器精度,则假定相对误差为机器精度的数量级。
- 因素float, 可选
确定初始步长界限的参数(
factor * || diag * x||
)。应在区间(0.1, 100)
内。- diag序列,可选
N 个正数条目,作为变量的尺度因子。
- 返回:
- xndarray
解决方案(或对于不成功调用的最后一次迭代的输出结果)。
- cov_xndarray
Hessian 的逆。fjac 和 ipvt 用于构造 Hessian 的估计值。值为 None 表示矩阵是奇异的,这意味着参数 x 的曲率在数值上是平坦的。要获得参数 x 的协方差矩阵,cov_x 必须乘以残差的方差——参见 curve_fit。仅当 full_output 为
True
时返回。- infodictdict
一个带有键的可选输出字典:
nfev
函数调用的次数
fvec
在输出处评估的函数
fjac
QR 分解的最终近似雅可比矩阵的 R 矩阵的排列,按列存储。与 ipvt 一起,可以近似估计的协方差。
ipvt
一个长度为 N 的整数数组,定义了一个置换矩阵 p,使得 fjac*p = q*r,其中 r 是上三角矩阵,其对角元素的幅度非递增。p 的第 j 列是单位矩阵的第 ipvt(j) 列。
qtf
向量 (转置(q) * fvec)。
仅当 full_output 为
True
时返回。- mesgstr
一个字符串消息,提供关于失败原因的信息。仅当 full_output 为
True
时返回。- ier整数
一个整数标志。如果它等于1、2、3或4,则找到了解决方案。否则,未找到解决方案。在任何情况下,可选的输出变量’mesg’都会提供更多信息。
参见
least_squares
用于解决带有变量边界约束的非线性最小二乘问题的新接口。特别参见
method='lm'
。
注释
leastsq
是围绕 MINPACK 的 lmdif 和 lmder 算法的包装器。cov_x 是对最小二乘目标函数的 Hessian 矩阵的 Jacobian 近似。这个近似假设目标函数基于观测目标数据 (ydata) 和参数的 (非线性) 函数 f(xdata, params) 之间的差异
func(params) = ydata - f(xdata, params)
以便目标函数为
min sum((ydata - f(xdata, params))**2, axis=0) params
解决方案 x 总是一个一维数组,无论 x0 的形状如何,或者 x0 是否是一个标量。
示例
>>> from scipy.optimize import leastsq >>> def func(x): ... return 2*(x-3)**2+1 >>> leastsq(func, 0) (array([2.99999999]), 1)