Python曲线拟合详解

作者:微小冷 时间:2023-12-29 05:54:50 

入门

scipy.optimize中,curve_fit函数可调用非线性最小二乘法进行函数拟合,例如,现在有一个高斯函数想要被拟合

Python曲线拟合详解

则调用方法如下

import numpy as np
from scipy.optimize import curve_fit
def gauss(x, a, b, c):
   return a*np.exp(-(x-b)**2/c**2)

x = np.arange(100)/10
y = gauss(x, 2, 5, 3) + np.random.rand(100)/10

# 非线性拟合 abc为参数;para为拟合评价
abc, para = curve_fit(gauss, x, y)
print(abc)
# [2.03042233 5.01182397 3.10994351]

其中,curve_fit在调用时输入了三个参数,分别是拟合函数、自变量、因变量。返回值abcpara分别为拟合参数和拟合的协方差,最终得到abc的值与预设的2,0.5, 3是比较接近的,其拟合效果可以画图查看一下

import matplotlib.pyplot as plt
plt.scatter(x, y, marker='.')

Y = gauss(x, *abc)
plt.plot(x, Y, lw=1)
plt.show()

效果如下

Python曲线拟合详解

参数

curve_fit的装形式如下

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)

除了f, xdata, ydata已经用过之外,其他参数的含义为

  • p0 拟合参数初始值

  • sigma 相对精度要求

  • absolute_sigma绝对精度要求

  • check_finite有限性检测开关

  • bounds拟合范围

  • method拟合方法,可选‘lm’, ‘trf’, ‘dogbox’,与least_squares函数中定义相同

  • jac雅可比矩阵,与least_squares中定义相同

 最小二乘函数:least_squares

多元拟合

尽管curve_fit的参数列表中,只给出了xdata, ydata作为拟合参数,而xdata只有一组,但curve_fit是具备多元拟合潜力的。

唯一需要注意的是,当多元拟合函数的返回值必须为一维数组,示例如下

# 创建一个函数模型用来生成数据
def func1(x, a, b, c, d):
   r = a * np.exp(-((x[0] - b) ** 2 + (x[1] - d) ** 2) / (2 * c ** 2))
   return r.ravel()

# 生成原始数据
xx = np.indices([10, 10])
z = func1(xx, 10, 5, 2, 5) + np.random.normal(size=100)/100
abcd, para = curve_fit(func1, xx, z)
print(abcd)
# [10.00258587  5.00146314  1.99952885  5.00138184]

可以发现拟合结果与预设的abcd还是比较接近的,下面绘制三维图像来更加直观地查看一下

z = z.reshape(10, 10)
Z = func1(xx, *abcd).reshape(10,10)

ax = plt.subplot(projection='3d')
ax.scatter3D(xx[0], xx[1], z, color='red')
ax.plot_surface(xx[0], xx[1], Z, cmap='rainbow')
plt.show()

结果如下

Python曲线拟合详解

来源:https://tinycool.blog.csdn.net/article/details/130109777

标签:Python,曲线拟合
0
投稿

猜你喜欢

  • 服务器Centos部署MySql并连接Navicat过程详解

    2024-01-15 11:53:30
  • Python爬虫实现“盗取”微信好友信息的方法分析

    2023-01-16 09:37:33
  • Python实现的服务器示例小结【单进程、多进程、多线程、非阻塞式】

    2023-02-24 00:19:25
  • 关于设计规范

    2008-06-02 13:10:00
  • js实现一个简易计算器

    2024-04-25 13:13:38
  • go程序员日常开发效率神器汇总

    2024-02-16 23:04:40
  • Numpy中Meshgrid函数基本用法及2种应用场景

    2023-05-11 20:13:21
  • Python全栈之进程和守护进程

    2021-11-25 18:05:44
  • python写入并获取剪切板内容的实例

    2023-08-03 10:44:04
  • ES6深入理解之“let”能替代”var“吗?

    2024-05-28 15:41:33
  • JavaScript性能优化小技巧,创建文档碎片

    2010-03-31 18:27:00
  • python 三种方法提取pdf中的图片

    2023-09-18 08:25:58
  • 简单谈谈mysql左连接内连接

    2024-01-13 06:54:24
  • go-zero源码阅读之布隆过滤器实现代码

    2024-05-08 10:23:06
  • python爬虫 爬取超清壁纸代码实例

    2021-03-19 02:51:54
  • python调用函数、类和文件操作简单实例总结

    2022-04-09 22:28:53
  • PyGame实现初始化导入所有模块方法详解

    2023-05-25 15:14:55
  • 提高ASP性能的最佳选择第二部分

    2007-08-15 12:46:00
  • Python使用matplotlib实现交换式图形显示功能示例

    2023-04-25 06:10:49
  • Javascript的常规数组和关联数组对比小结

    2024-04-28 09:47:29
  • asp之家 网络编程 m.aspxhome.com