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
参数:
func可调用对象

应该接受至少一个(可能是长度为 N 的向量)参数,并返回 M 个浮点数。它不能返回 NaN,否则拟合可能会失败。M 必须大于或等于 N

x0ndarray

最小化的起始估计值。

argstuple,可选

传递给 func 的任何额外参数都放在此元组中。

Dfun可调用对象,可选

一个函数或方法,用于计算 func 的雅可比矩阵,其中导数沿行排列。如果为 None,则将估计雅可比矩阵。

full_outputbool,可选

如果为 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 小于机器精度,则假定相对误差与机器精度的数量级相同。

factorfloat,可选

一个确定初始步长边界的参数(factor * || diag * x||)。应在区间 (0.1, 100) 中。

diagsequence,可选

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

向量 (transpose(q) * fvec)。

仅当 full_outputTrue 时返回。

mesgstr

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

ierint

一个整数标志。如果它等于 1、2、3 或 4,则找到解。否则,找不到解。在任何一种情况下,可选输出变量 “mesg” 都会提供更多信息。

另请参阅

least_squares

用于解决变量有界限的非线性最小二乘问题的新接口。尤其请参阅 method='lm'

备注

“leastsq” 是对 MINPACK 的 lmdif 和 lmder 算法的封装。

cov_x 是最小二乘目标函数的 Hessian 的雅可比近似。此近似假定目标函数基于某些观测目标数据 (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)