scipy.optimize.curve_fit 曲线拟合

文章介绍了Scipy的curve_fit函数,它是用于非线性最小二乘法拟合的工具。通过示例展示了如何使用该函数对直线和指数函数进行拟合,解释了函数参数和返回值,并提到了参数的初始猜测、范围设定以及不同优化方法的选择。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

curve_fit是使用非线性最小二乘法将函数f进行拟合,寻找到最优曲线.

Scipy是一个用于数学、科学、工程领域的常用软件包,可以处理插值、积分、优化、图像处理、常微分方程数值解的求解、信号处理等问题。它用于有效计算Numpy矩阵,使Numpy和Scipy协同工作,高效解决问题。

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:函数形式
  • xdata:自变量 x,一般为数组或者向量
  • ydata:因变量 y,一般为一维数组
  • p0:参数的初始猜测(长度为N)。如果没有,那么初始值将全部为1(如果可以用自省法确定函数的参数数,否则将引发ValueError)。
  • bounds:参数的范围设置
  • method:用于优化的方法。更多细节见最小二乘法。对于无约束的问题,默认为’lm’,如果提供了约束,则为’trf’。当观测值的数量少于变量的数量时,‘lm’方法将不起作用,在这种情况下使用’trf’’dogbox’

返回值解析

  • popt:数组,参数的最佳值,以使的平方残差之和最小。拟合后的各项的系数通过 popt[0], popt[1]... 获取
  • pcov:二维阵列,popt的估计协方差。对角线提供参数估计的方差。

例子

例子一:拟合直线

# 引用库函数
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from scipy import optimize as op
 
# 需要拟合的数据组
x_group = np.array([3, 6.1, 9.1, 11.9, 14.9])
y_group = np.array([0.0221, 0.0491, 0.0711, 0.0971, 0.1238])
 
 
# 需要拟合的函数
def f_1(x, A, B):
    return A * x + B
 
 
# 得到返回的A,B值
A, B = op.curve_fit(f_1, x_group, y_group)[0]
# 数据点与原先的进行画图比较
plt.scatter(x_group, y_group, marker='o',label='real')
x = np.arange(0, 15, 0.01)
y = A * x + B
plt.plot(x, y,color='red',label='curve_fit')
plt.legend()
plt.title('%.5fx%.5f=y' % (A, B))
plt.show()

例子2:官方例子

# 自定义函数,curve_fit支持自定义函数的形式进行拟合,这里定义的是指数函数的形式
# 包括自变量x和a,b,c三个参数
def func(x, a, b, c):
    return a * np.exp(-b * x) + c
 
# 产生数据
xdata = np.linspace(0, 4, 50) # x从0到4取50个点
y = func(xdata, 2.5, 1.3, 0.5) # 在x取xdata,a,b,c分别取2.5, 1.3, 0.5条件下,运用自定义函数计算y的值
 
# 在y上产生一些扰动模拟真实数据
np.random.seed(1729)
# 产生均值为0,标准差为1,维度为xdata大小的正态分布随机抽样0.2倍的扰动
y_noise = 0.2 * np.random.normal(size=xdata.size) 
ydata = y + y_noise
plt.plot(xdata, ydata, 'b-', label='data')
 
# 利用“真实”数据进行曲线拟合
popt, pcov = curve_fit(func, xdata, ydata) # 拟合方程,参数包括func,xdata,ydata,
# 有popt和pcov两个个参数,其中popt参数为a,b,c,pcov为拟合参数的协方差
 
# plot出拟合曲线,其中的y使用拟合方程和xdata求出
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 and 0 <= c <= 0.5:
popt, pcov = curve_fit(func, xdata, ydata, bounds=(0, [3., 1., 0.5])) # bounds为限定a,b,c参数的范围
 
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()

References

[1] scipy.optimize.curve_fit函数用法解析

[2] scipy.optimize.curve_fit-曲线拟合

[3] 官方文档

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值