scipy.optimize.curve_fit

scipy.optimize.curve_fit(f, xdata, ydata, p0=None, sigma=None, absolute_sigma=False, check_finite=True, bounds=(- inf, inf), method=None, jac=None, **kwargs)[源代码]

使用非线性最小二乘拟合函数f来拟合数据。

假设 ydata = f(xdata, *params) + eps

参数
f可调用

模型函数f(x,.)。它必须将自变量作为第一个参数,并将参数作为单独的剩余参数。

xdata类似数组或对象(_LIKE)

测量数据的自变量。对于具有k个预测器的函数,通常应该是M长度序列或(k,M)形数组,但实际上可以是任何对象。

ydataarray_like

相关数据,名义上为长度为M的数组 f(xdata, ...)

p0ARRAY_LIKE,可选

参数(长度N)的初始猜测。如果无,则初始值将全部为1(如果可以使用自检确定函数的参数数量,否则将引发ValueError)。

sigma无或M长度序列或MxM数组,可选

确定了 ydata 。如果我们将残差定义为 r = ydata - f(xdata, *popt) ,然后解释 sigma 取决于其尺寸的数量:

  • 一维图像 sigma 中的误差标准差值 ydata 。在这种情况下,优化后的函数为 chisq = sum((r / sigma) ** 2)

  • A 2-D sigma 中应包含误差协方差矩阵 ydata 。在这种情况下,优化后的函数为 chisq = r.T @ inv(sigma) @ r

    0.19 新版功能.

无(默认)等效于一维 sigma 满满的都是。

absolute_sigma布尔值,可选

如果为True, sigma 在绝对意义上使用,并且估计的参数协方差 pcov 反映这些绝对值。

如果为False(默认值),则仅 sigma 价值观很重要。返回的参数协方差矩阵 pcov 是基于缩放的 sigma 是一个恒定的因素。此常量是通过要求简化的 chisq 要获得最佳参数,请执行以下操作 popt 在使用 已缩放 sigma 等于团结。换句话说, sigma 缩放以匹配拟合后残差的样本方差。默认值为False。从数学上讲, pcov(absolute_sigma=False) = pcov(absolute_sigma=True) * chisq(popt)/(M-N)

check_finite布尔值,可选

如果为True,则检查输入数组是否不包含INF的NAN,如果包含,则引发ValueError。如果输入数组确实包含NAN,则将此参数设置为False可能会自动产生无意义的结果。默认值为True。

boundsARRAY_LIKE的2元组,可选

参数的下界和上界。默认为无边界。元组的每个元素必须是长度等于参数数量的数组,或者是标量(在这种情况下,所有参数的界限都相同)。使用 np.inf 使用适当的符号禁用所有或部分参数的界限。

0.17 新版功能.

method{‘lm’,‘trf’,‘dogbox’},可选

用于优化的方法。看见 least_squares 了解更多详细信息。对于不受约束的问题,默认值为“lm”,如果满足以下条件,则默认值为“trf bounds 都提供了。当观测数目少于变量数目时,方法‘lm’不起作用,在这种情况下使用‘trf’或‘dogbox’。

0.17 新版功能.

jac可调用、字符串或无,可选

带签名的函数 jac(x, ...) 其将模型函数相对于参数的雅可比矩阵计算为密集的类似阵列的结构。它将根据提供的内容进行缩放 sigma 。如果为None(默认值),则将以数值方式估计雅可比。‘trf’和‘dogbox’方法的字符串关键字可用于选择有限差分格式,请参见 least_squares

0.18 新版功能.

kwargs

传递给的关键字参数 leastsqmethod='lm'least_squares 不然的话。

退货
popt阵列

参数的最佳值,以使以下各项的残差平方和 f(xdata, *popt) - ydata 是最小化的。

pcov二维阵列

POPT的估计协方差。对角线提供参数估计的方差。要计算参数的一个标准差,请使用 perr = np.sqrt(np.diag(pcov))

怎么会有 sigma 参数影响估计协方差取决于 absolute_sigma 参数,如上所述。

如果解的雅可比矩阵没有满秩,则“lm”方法返回一个填充有 np.inf 另一方面,“TRF”和“Dogbox”方法使用Moore-Penrose伪逆来计算协方差矩阵。

加薪
ValueError

如果有任何一个 ydataxdata 包含NAN,或者如果使用了不兼容的选项。

RuntimeError

如果最小二乘最小化失败。

OptimizeWarning

如果参数的协方差不能估计。

参见

least_squares

最小化非线性函数的平方和。

scipy.stats.linregress

计算两组测量值的线性最小二乘回归。

注意事项

使用 method='lm' ,该算法使用了Levenberg-MarQuardt算法,通过 leastsq 。请注意,该算法只能处理无约束问题。

箱式约束可以由方法“TRF”和“Dogbox”处理。请参阅的文档字符串 least_squares 了解更多信息。

示例

>>> import matplotlib.pyplot as plt
>>> from scipy.optimize import curve_fit
>>> def func(x, a, b, c):
...     return a * np.exp(-b * x) + c

定义要与某些噪声拟合的数据:

>>> xdata = np.linspace(0, 4, 50)
>>> y = func(xdata, 2.5, 1.3, 0.5)
>>> rng = np.random.default_rng()
>>> y_noise = 0.2 * rng.normal(size=xdata.size)
>>> ydata = y + y_noise
>>> plt.plot(xdata, ydata, 'b-', label='data')

适用于函数的参数a,b,c func

>>> popt, pcov = curve_fit(func, xdata, ydata)
>>> popt
array([2.56274217, 1.37268521, 0.47427475])
>>> plt.plot(xdata, func(xdata, *popt), 'r-',
...          label='fit: a=%5.3f, b=%5.3f, c=%5.3f' % tuple(popt))

将优化限制在 0 <= a <= 30 <= b <= 10 <= c <= 0.5

>>> popt, pcov = curve_fit(func, xdata, ydata, bounds=(0, [3., 1., 0.5]))
>>> popt
array([2.43736712, 1.        , 0.34463856])
>>> plt.plot(xdata, func(xdata, *popt), 'g--',
...          label='fit: a=%5.3f, b=%5.3f, c=%5.3f' % tuple(popt))
>>> plt.xlabel('x')
>>> plt.ylabel('y')
>>> plt.legend()
>>> plt.show()
../../_images/scipy-optimize-curve_fit-1.png