利用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实现2048小游戏
Mar 30 Python
python 对多个csv文件分别进行处理的方法
Jan 07 Python
Python OpenCV中的resize()函数的使用
Jun 20 Python
python多线程http压力测试脚本
Jun 25 Python
python命名空间(namespace)简单介绍
Aug 10 Python
python实现网站微信登录的示例代码
Sep 18 Python
python实现的Iou与Giou代码
Jan 18 Python
python实现拼接图片
Mar 23 Python
Python unittest如何生成HTMLTestRunner模块
Sep 08 Python
python 实现压缩和解压缩的示例
Sep 22 Python
Django haystack实现全文搜索代码示例
Nov 28 Python
浅析Python中的套接字编程
Jun 22 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
使用php判断网页是否gzip压缩
2013/06/25 PHP
跟我学Laravel之视图 &amp; Response
2014/10/15 PHP
常见的四种POST 提交数据方式(小总结)
2015/10/08 PHP
Laravel框架分页实现方法分析
2018/06/12 PHP
让getElementsByName适应IE和firefox的方法
2007/09/24 Javascript
js的表单操作 简单计算器
2011/12/29 Javascript
jquery中的查找parents与closest方法之间的区别
2013/12/02 Javascript
使用javascript做的一个随机点名程序
2014/02/13 Javascript
js实现可得到不同颜色值的颜色选择器实例
2015/02/28 Javascript
jQuery复制表单元素附源码分享效果演示
2015/09/30 Javascript
JS获取CSS样式(style/getComputedStyle/currentStyle)
2016/01/19 Javascript
Javascript必知必会(四)js类型转换
2016/06/08 Javascript
浅谈javascript基础之客户端事件驱动
2016/06/10 Javascript
Bootstrap table表格简单操作
2017/02/07 Javascript
js禁止浏览器的回退事件
2017/04/20 Javascript
AngularJS的ng-click传参的方法
2017/06/19 Javascript
js+html5实现半透明遮罩层弹框效果
2020/08/24 Javascript
详解VUE前端按钮权限控制
2019/04/26 Javascript
个人小程序接入支付解决方案
2019/05/23 Javascript
vscode 使用Prettier插件格式化配置使用代码详解
2020/08/10 Javascript
Python实现将16进制字符串转化为ascii字符的方法分析
2017/07/21 Python
Python爬虫之正则表达式的使用教程详解
2018/10/25 Python
Django数据库类库MySQLdb使用详解
2019/04/28 Python
Django 拆分model和view的实现方法
2019/08/16 Python
Python加密模块的hashlib,hmac模块使用解析
2020/01/02 Python
Python如何使用字符打印照片
2020/01/03 Python
python 工具 字符串转numpy浮点数组的实现
2020/03/14 Python
pycharm 实现本地写代码,服务器运行的操作
2020/06/08 Python
一款纯css3实现的tab选项卡的实列教程
2014/12/11 HTML / CSS
Clarks鞋澳大利亚官方网站:Clarks Australia
2019/12/25 全球购物
美国在线肉类和海鲜配送:Crowd Cow
2020/10/02 全球购物
Java提供了哪些企业应用编程接口
2015/02/13 面试题
会计出纳员的自我评价
2014/01/15 职场文书
防卫过当辩护词
2015/05/21 职场文书
市直属机关2016年主题党日活动总结
2016/04/05 职场文书
《王国之心》迎来了发售的20周年, 野村哲发布贺图
2022/04/11 其他游戏