python中fit()函数_python scipy optimize.curve_fit用法及代码示例

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

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

参数:

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

xdata:array_like 或 object测量数据的自变量。对于具有k个预测变量的函数,通常应为M-length序列或(k,M)形数组,但实际上可以是任何对象。

ydata:array_like相关数据,长度为M的数组-名义上f(xdata, ...)。

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

sigma:None 或 M-length sequence 或 MxM array, 可选参数确定ydata中的不确定性。如果我们定义残差为r = ydata - f(xdata, *popt),然后解释西格玛取决于其尺寸数:

A 1-d sigma should contain values of standard deviations of

errors in ydata. In this case, the optimized function is

chisq = sum((r / sigma) ** 2).

A 2-d sigma should contain the covariance matrix of

errors in ydata. In this case, the optimized function is

chisq = r.T @ inv(sigma) @ r.

New in version 0.19.

None(默认)等效于用1填充的1-d sigma。

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

如果为False,则仅sigma值的相对大小重要。返回的参数协方差矩阵pcov基于缩放sigma常数。通过使用缩放的sigma时要求最优参数popt的减小的chisq等于1来设置此常数。换句话说,对sigma进行缩放以匹配拟合后残差的样本方差。数学上pcov(absolute_sigma=False) = pcov(absolute_sigma=True) * chisq(popt)/(M-N)

check_finite:bool, 可选参数如果为True,请检查输入数组是否不包含infs的nan,如果包含,则引发ValueError。如果输入数组确实包含nan,则将此参数设置为False可能会无提示地产生无意义的结果。默认值为True。

bounds:2-tuple of array_like, 可选参数参数的上下限。默认为无界。元组的每个元素必须是一个长度等于参数个数的数组,或者是一个标量(在这种情况下,对所有参数而言,边界都应相同)。np.inf带有适当的符号以禁用所有或某些参数的范围。

版本0.17中的新函数。

method:{‘lm’, ‘trf’, ‘dogbox’}, 可选参数用于优化的方法。参考least_squares更多细节。对于不受约束的问题,默认值为‘lm’;如果提供了界限,则默认值为‘trf’。如果观察数少于变量数,则‘lm’方法将不起作用,在这种情况下,请使用‘trf’或‘dogbox’。

版本0.17中的新函数。

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

版本0.18中的新函数。

kwargs:传递给的关键字参数leastsq对于method='lm'或者least_squares除此以外。

返回值:

popt:数组参数的最佳值,以使残差平方的和f(xdata, *popt) - ydata被最小化

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

如上所述,sigma参数如何影响估计的协方差取决于absolute_sigma参数。

如果解决方案中的雅可比矩阵不具有完整等级,则‘lm’方法将返回一个填充有np.inf另一方面,‘trf’和‘dogbox’方法使用Moore-Penrose伪逆来计算协方差矩阵。

异常:

ValueError如果ydata或xdata包含NaN,或者使用了不兼容的选项。

RuntimeError如果least-squares最小化失败。

优化警告如果无法估计参数的协方差。

注意:

用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)

>>> np.random.seed(1729)

>>> y_noise = 0.2 * np.random.normal(size=xdata.size)

>>> ydata = y + y_noise

>>> plt.plot(xdata, ydata, 'b-', label='data')

适合函数func的参数a,b,c:

>>> popt, pcov = curve_fit(func, xdata, ydata)

>>> popt

array([ 2.55423706, 1.35190947, 0.47450618])

>>> plt.plot(xdata, func(xdata, *popt), 'r-',

... label='fit:a=%5.3f, b=%5.3f, c=%5.3f' % tuple(popt))

将优化限制在以下区域0 <= a <= 3,0 <= b <= 1和0 <= c <= 0.5:

>>> popt, pcov = curve_fit(func, xdata, ydata, bounds=(0, [3., 1., 0.5]))

>>> popt

array([ 2.43708906, 1. , 0.35015434])

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

你可能感兴趣的:(python中fit()函数)