利用python做数据拟合详情


Posted in Python onNovember 17, 2021

1、例子:拟合一种函数Func,此处为一个指数函数。

出处:

SciPy v1.1.0 Reference Guide

#Header
import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit

#Define a function(here a exponential function is used)
def func(x, a, b, c):
 return a * np.exp(-b * x) + c

#Create the data to be fit with some noise
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, 'bo', label='data')

#Fit for the parameters a, b, c of the function func:
popt, pcov = curve_fit(func, xdata, ydata)
popt #output: 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))

#In the case of parameters a,b,c need be constrainted
#Constrain the optimization to the region of 
#0 <= a <= 3, 0 <= b <= 1 and 0 <= c <= 0.5
popt, pcov = curve_fit(func, xdata, ydata, bounds=(0, [3., 1., 0.5]))
popt #output: 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))

#Labels
plt.title("Exponential Function Fitting")
plt.xlabel('x coordinate')
plt.ylabel('y coordinate')
plt.legend()
leg = plt.legend()  # remove the frame of Legend, personal choice
leg.get_frame().set_linewidth(0.0) # remove the frame of Legend, personal choice
#leg.get_frame().set_edgecolor('b') # change the color of Legend frame
#plt.show()

#Export figure
#plt.savefig('fit1.eps', format='eps', dpi=1000)
plt.savefig('fit1.pdf', format='pdf', dpi=1000, figsize=(8, 6), facecolor='w', edgecolor='k')
plt.savefig('fit1.jpg', format='jpg', dpi=1000, figsize=(8, 6), facecolor='w', edgecolor='k')

上面一段代码可以直接在spyder中运行。得到的JPG导出图如下:

利用python做数据拟合详情

2. 例子:拟合一个Gaussian函数

出处:LMFIT: Non-Linear Least-Squares Minimization and Curve-Fitting for Python

#Header
import numpy as np
import matplotlib.pyplot as plt
from numpy import exp, linspace, random
from scipy.optimize import curve_fit

#Define the Gaussian function
def gaussian(x, amp, cen, wid):
 return amp * exp(-(x-cen)**2 / wid)

#Create the data to be fitted
x = linspace(-10, 10, 101)
y = gaussian(x, 2.33, 0.21, 1.51) + random.normal(0, 0.2, len(x))
np.savetxt ('data.dat',[x,y])  #[x,y] is is saved as a matrix of 2 lines

#Set the initial(init) values of parameters need to optimize(best)
init_vals = [1, 0, 1] # for [amp, cen, wid]

#Define the optimized values of parameters
best_vals, covar = curve_fit(gaussian, x, y, p0=init_vals)
print(best_vals) # output: array [2.27317256  0.20682276  1.64512305]

#Plot the curve with initial parameters and optimized parameters
y1 = gaussian(x, *best_vals) #best_vals, '*'is used to read-out the values in the array
y2 = gaussian(x, *init_vals) #init_vals
plt.plot(x, y, 'bo',label='raw data')
plt.plot(x, y1, 'r-',label='best_vals')
plt.plot(x, y2, 'k--',label='init_vals')
#plt.show()

#Labels
plt.title("Gaussian Function Fitting")
plt.xlabel('x coordinate')
plt.ylabel('y coordinate')
plt.legend()
leg = plt.legend()  # remove the frame of Legend, personal choice
leg.get_frame().set_linewidth(0.0) # remove the frame of Legend, personal choice
#leg.get_frame().set_edgecolor('b') # change the color of Legend frame
#plt.show()

#Export figure
#plt.savefig('fit2.eps', format='eps', dpi=1000)
plt.savefig('fit2.pdf', format='pdf', dpi=1000, figsize=(8, 6), facecolor='w', edgecolor='k')
plt.savefig('fit2.jpg', format='jpg', dpi=1000, figsize=(8, 6), facecolor='w', edgecolor='k')

上面一段代码可以直接在spyder中运行。得到的JPG导出图如下:

利用python做数据拟合详情

3. 用一个lmfit的包来实现2中的Gaussian函数拟合

需要下载lmfit这个包,下载地址:

https://pypi.org/project/lmfit/#files

下载下来的文件是.tar.gz格式,在MacOS及Linux命令行中解压,指令:

将其中的lmfit文件夹复制到当前project目录下。

上述例子2中生成了data.dat,用来作为接下来的方法中的原始数据。

 出处:

Modeling Data and Curve Fitting

#Header
import numpy as np
import matplotlib.pyplot as plt
from numpy import exp, loadtxt, pi, sqrt
from lmfit import Model

#Import the data and define x, y and the function
data = loadtxt('data.dat')
x = data[0, :]
y = data[1, :]
def gaussian1(x, amp, cen, wid):
 return (amp / (sqrt(2*pi) * wid)) * exp(-(x-cen)**2 / (2*wid**2))

#Fitting
gmodel = Model(gaussian1)
result = gmodel.fit(y, x=x, amp=5, cen=5, wid=1) #Fit from initial values (5,5,1)
print(result.fit_report())

#Plot
plt.plot(x, y, 'bo',label='raw data')
plt.plot(x, result.init_fit, 'k--',label='init_fit')
plt.plot(x, result.best_fit, 'r-',label='best_fit')
#plt.show()


#Labels
plt.title("Gaussian Function Fitting")
plt.xlabel('x coordinate')
plt.ylabel('y coordinate')
plt.legend()
leg = plt.legend()  # remove the frame of Legend, personal choice
leg.get_frame().set_linewidth(0.0) # remove the frame of Legend, personal choice
#leg.get_frame().set_edgecolor('b') # change the color of Legend frame
#plt.show()

#Export figure
#plt.savefig('fit3.eps', format='eps', dpi=1000)
plt.savefig('fit3.pdf', format='pdf', dpi=1000, figsize=(8, 6), facecolor='w', edgecolor='k')
plt.savefig('fit3.jpg', format='jpg', dpi=1000, figsize=(8, 6), facecolor='w', edgecolor='k')

上面这一段代码需要按指示下载lmfit包,并且读取例子2中生成的data.dat

得到的JPG导出图如下:

利用python做数据拟合详情

到此这篇关于利用python做数据拟合详情的文章就介绍到这了,更多相关python做数据拟合内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python实例之wxpython中Frame使用方法
Jun 09 Python
python实现跨文件全局变量的方法
Jul 07 Python
玩转python爬虫之爬取糗事百科段子
Feb 17 Python
Python实现批量更换指定目录下文件扩展名的方法
Sep 19 Python
Django实现自定义404,500页面教程
Mar 26 Python
Python的条件表达式和lambda表达式实例
Jan 31 Python
详解Python列表赋值复制深拷贝及5种浅拷贝
May 15 Python
python实现超市管理系统(后台管理)
Oct 25 Python
Python3监控疫情的完整代码
Feb 20 Python
python GUI库图形界面开发之PyQt5窗口控件QWidget详细使用方法
Feb 26 Python
Python random库使用方法及异常处理方案
Mar 02 Python
Pytorch实现将模型的所有参数的梯度清0
Jun 24 Python
Python Matplotlib库实现画局部图
Nov 17 #Python
python实现局部图像放大
Pygame Draw绘图函数的具体使用
Pygame Rect区域位置的使用(图文)
Nov 17 #Python
分析Python list操作为什么会错误
Nov 17 #Python
深入理解Pytorch微调torchvision模型
Nov 11 #Python
Python 中 Shutil 模块详情
Nov 11 #Python
You might like
ThinkPHP入口文件设置及相关注意事项分析
2014/12/05 PHP
php使用变量动态创建类的对象用法示例
2017/02/06 PHP
php安装dblib扩展,连接mssql的具体步骤
2017/03/02 PHP
Laravel Eloquent ORM 实现查询表中指定的字段
2019/10/17 PHP
图片之间的切换
2006/06/26 Javascript
javascript Array对象基础知识小结
2010/11/16 Javascript
基于jquery自定义图片热区效果
2012/07/21 Javascript
jquery.messager.js插件导致页面抖动的解决方法
2013/07/14 Javascript
jquery的相对父元素和相对文档定位示例代码
2013/08/02 Javascript
JavaScript仿淘宝页面图片滚动加载及刷新回顶部的方法解析
2016/05/24 Javascript
Javascript使用uploadify来实现多文件上传
2016/11/16 Javascript
jQuery实现两个select控件的互移操作
2016/12/22 Javascript
解决浏览器会自动填充密码的问题
2017/04/28 Javascript
jQuery实现div跟随鼠标移动
2020/08/20 jQuery
node前端开发模板引擎Jade的入门
2018/05/11 Javascript
jQuery实现的页面详情展开收起功能示例
2018/06/11 jQuery
React中如何引入Angular组件详解
2018/08/09 Javascript
node错误处理与日志记录的实现
2018/12/24 Javascript
小程序开发踩坑:页面窗口定位(相对于浏览器定位)(推荐)
2019/04/25 Javascript
nodejs制作小爬虫功能示例
2020/02/24 NodeJs
[02:42]岂曰无衣,与子同袍!DOTA2致敬每一位守护人
2020/02/17 DOTA
Python实现抓取城市的PM2.5浓度和排名
2015/03/19 Python
python中如何使用正则表达式的集合字符示例
2017/10/09 Python
Pycharm设置界面全黑的方法
2018/05/23 Python
深入理解Python异常处理的哲学
2019/02/01 Python
python已协程方式处理任务实现过程
2019/12/27 Python
使用PyQt5实现图片查看器的示例代码
2020/04/21 Python
CSS中越界问题的经典解决方案【推荐】
2016/04/19 HTML / CSS
html5应用缓存_动力节点Java学院整理
2017/07/13 HTML / CSS
简洁自适应404页面HTML好看的404源码
2020/12/16 HTML / CSS
英国儿童图书网站:Scholastic
2017/03/26 全球购物
护理专科毕业推荐信
2013/11/10 职场文书
初中生期末考试的自我评价
2013/12/17 职场文书
安全承诺书格式
2014/05/21 职场文书
公司领导九九重阳节发言稿2014
2014/09/25 职场文书
国庆阅兵观后感
2015/06/15 职场文书