scipy.optimize.

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 ,返回所有可选输出(不仅仅是 xier )。

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 的逆。fjacipvt 用于构造 Hessian 的估计值。值为 None 表示矩阵是奇异的,这意味着参数 x 的曲率在数值上是平坦的。要获得参数 x 的协方差矩阵,cov_x 必须乘以残差的方差——参见 curve_fit。仅当 full_outputTrue 时返回。

infodictdict

一个带有键的可选输出字典:

nfev

函数调用的次数

fvec

在输出处评估的函数

fjac

QR 分解的最终近似雅可比矩阵的 R 矩阵的排列,按列存储。与 ipvt 一起,可以近似估计的协方差。

ipvt

一个长度为 N 的整数数组,定义了一个置换矩阵 p,使得 fjac*p = q*r,其中 r 是上三角矩阵,其对角元素的幅度非递增。p 的第 j 列是单位矩阵的第 ipvt(j) 列。

qtf

向量 (转置(q) * fvec)。

仅当 full_outputTrue 时返回。

mesgstr

一个字符串消息,提供关于失败原因的信息。仅当 full_outputTrue 时返回。

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)