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, *, full_output=False, **kwargs)

Use non-linear least squares to fit a function, f, to data.

函数介绍

scipy.optimize.curve_fit 是 Python 的 SciPy 库中的一个函数,用于对数据进行曲线拟合。这个函数非常适合用于数据科学和工程领域中的模型拟合问题。下面是对 curve_fit 函数的一些基本介绍:

功能

  • curve_fit 函数的主要功能是找到最佳的参数值,使得一个模型函数最好地拟合给定的数据。换句话说,它可以用来确定在某个数学模型下,哪些参数值能最好地描述你的数据。

参数

  • f: 需要拟合的模型函数。这个函数应该接受自变量和所有待拟合参数作为输入,并返回模型的预测值。
  • xdata: 数据的自变量。
  • ydata: 数据的因变量,即你想要模型去拟合的数据。
  • p0: (可选) 参数的初始猜测值。这对于开始优化过程很有帮助,特别是当有多个局部最优解时。
  • bounds: (可选) 参数的边界,用于限制参数值的范围。
  • 其他一些参数可以用来控制优化过程的细节,比如最大迭代次数、公差等。

返回值

  • popt: 最佳拟合参数的数组。
  • pcov: 参数的协方差矩阵,可以用来估计参数的不确定性。

使用示例

假设你有一组数据和一个模型函数 func(x, a, b),你想要找到参数 ab 的值,使得 func(x, a, b) 最好地拟合你的数据。你可以这样使用 curve_fit

from scipy.optimize import curve_fit

# 定义模型函数
def func(x, a, b):
    return a * x + b

# 数据
xdata = np.array([1, 2, 3, 4, 5])
ydata = np.array([2, 3.9, 5.9, 8.1, 10.1])

# 执行曲线拟合
popt, pcov = curve_fit(func, xdata, ydata)

# popt 中包含了最佳拟合参数 a 和 b

注意事项

  • 确保你的模型函数和数据是适当的。如果模型函数不能很好地描述数据的关系,拟合结果可能不准确。
  • 在某些情况下,拟合过程可能不会收敛,特别是当初始猜测值离真实值很远或者数据质量不高时。
  • 参数的协方差矩阵(pcov)可以提供关于参数不确定性的重要信息,但需要谨慎解读。

总之,scipy.optimize.curve_fit 是一个强大的工具,用于在科学和工程领域中进行数据分析和模型拟合。它的有效使用需要一定的数学和编程基础知识。

参数介绍

params:

  • f : 方程式

    • 模型函数,f(x, …). 它必须拿一个独立的变量作为第一个参数,并将参数作为单独的剩余参数去拟合。
  • xdata:自变量数据,测量数据的自变量。 对于具有 k 个预测变量的函数,通常应该是 M 长度序列或 (k,M) 形数组,但实际上可以是任何对象。。

  • ydata:因变量,相关数据,一个长度为 M 的数组 - 名义上是 f(xdata, …)。。

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

  • bounds: array_like 的 2 元组,可选。

    • 参数的下限和上限。默认为无边界。元组的每个元素必须是长度等于参数数量的数组,或者是标量(在这种情况下,所有参数的边界都相同)。
  • sigma:None 或者长度为 M 的序列,或者 M × \times ×M 的数组,是可选的

    • 确定 ydata 中的不确定性。如果我们将残差定义为 r = ydata - f(xdata, *popt),那么 sigma 的解释取决于它的维数:
      • 一维 sigma 应包含 ydata 中误差的标准差值。 在这种情况下,优化的函数是 chisq = sum((r / sigma) ** 2)。
      • 二维 sigma 应包含 ydata 中误差的协方差矩阵。 在这种情况下,优化后的函数是 chisq = r.T @ inv(sigma) @ r。
  • absolute_sigma

  • check_finite

  • bounds

  • method

  • jac

  • full_output

  • **kwargs

Returns

  • popt
  • pcov
  • infodict
  • mesg
  • ier

Example

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

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

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

在这里插入图片描述

Example2

from scipy.optimize import curve_fit
import matplotlib.pyplot as plt
import numpy as np
import matplotlib
matplotlib.use('TkAgg')
matplotlib.rc("font", family='KaiTi')  # 解决汉字不显示问题


def fund(x, a, b, c):
    return a*np.sin(2*np.pi/12*x+b)+c


x = np.arange(1, 13)
x2 = np.arange(1, 13, 0.1)
y = [17, 19, 21, 28, 33, 38, 37, 37, 31, 23, 19, 18]
fig, ax = plt.subplots()
popt, pcov = curve_fit(fund, x, y)
# popt数组中,三个值分别是待求参数a,b,c
ax.plot(x, y, 'b-', label='original values')
# ax.legend(r'original values')
y2 = [fund(xx, popt[0], popt[1], popt[2]) for xx in x2]
ax.plot(x2, y2, 'r--', label='polyfit values')
ax.set_title('curve_fit方法拟合')
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.legend()
print(popt)
plt.show()

在这里插入图片描述

  • 1
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Gompertz函数是一种常见的生长模型,在许多领域都有应用,如生物学、经济学等。在Python中,我们可以使用Scipy库中的optimize.curve_fit函数拟合Gompertz函数的参数。 Gompertz函数的形式为: $$f(t) = ae^{-be^{-ct}}$$ 其中,a、b、c是待拟合的参数,t是自变量。 下面是一个示例代码,演示如何使用optimize.curve_fit函数拟合Gompertz函数的参数: ```python import numpy as np import matplotlib.pyplot as plt from scipy.optimize import curve_fit # 定义Gompertz函数 def gompertz(t, a, b, c): return a * np.exp(-b * np.exp(-c * t)) # 生成样本数据 t = np.linspace(0, 10, 100) y = gompertz(t, 1, 0.5, 0.1) + 0.1 * np.random.randn(len(t)) # 使用curve_fit函数拟合参数 popt, pcov = curve_fit(gompertz, t, y) # 输出拟合结果 print("a = %.3f, b = %.3f, c = %.3f" % tuple(popt)) # 绘制拟合曲线和原始数据 plt.plot(t, y, 'bo', label='data') plt.plot(t, gompertz(t, *popt), 'r-', label='fit') plt.legend() plt.show() ``` 在上述代码中,我们首先定义了Gompertz函数,然后生成了一些样本数据。接着,我们使用curve_fit函数拟合Gompertz函数的参数,并输出拟合结果。最后,我们绘制了拟合曲线和原始数据的图像。 运行上述代码,即可得到拟合结果和图像。根据拟合结果,我们可以看出,拟合出的参数a、b、c与原始数据生成时的参数1、0.5、0.1比较接近,说明拟合结果比较准确。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值