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)[source]#

最小化方程组平方和。

x = arg min(sum(func(y)**2,axis=0))
         y
参数:
func可调用的

应采用至少一个(各个长度可能的 N 向量)自变量并返回 M 个浮点数。它不得返回 NaN,否则,拟合可能失败。 M 必须大于或等于 N

x0ndarray

最小化的起始估计。

args元组,可选

对 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) 中。

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

向量 (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)