曲线拟合

1. 多项式拟合

首先通过numpy.arange定义x、y坐标,然后调用polyfit()函数进行3次多项式拟合,最后调用Matplotlib函数进行散点图绘制(x,y)坐标,并绘制预测的曲线。

#encoding=utf-8
import numpy as np
import matplotlib.pyplot as plt#定义x、y散点坐标
x = np.arange(1, 16, 1)
num = [4.00, 5.20, 5.900, 6.80, 7.34,8.57, 9.86, 10.12, 12.56, 14.32,15.42, 16.50, 18.92, 19.58, 20.00]
y = np.array(num)#用3次多项式拟合
f1 = np.polyfit(x, y, 3)
p1 = np.poly1d(f1)
print(p1)#也可使用yvals=np.polyval(f1, x)
yvals = p1(x)  #拟合y值#绘图
plot1 = plt.plot(x, y, 's',label='original values')
plot2 = plt.plot(x, yvals, 'r',label='polyfit values')
plt.xlabel('x')
plt.ylabel('y')
plt.legend(loc=4) #指定legend的位置右下角
plt.title('polyfitting')
plt.show()
plt.savefig('test.png')

输出结果如下图所示,包括蓝色的正方形散点和红色的拟合曲线。
多项式函数为: y=-0.004669 x3 + 0.1392 x2 + 0.04214 x + 4.313

def curve_fit(f, xdata, ydata, p0=None, sigma=None, absolute_sigma=False,check_finite=True, bounds=(-np.inf, np.inf), method=None,jac=None, **kwargs):Returns-------popt : arrayOptimal values for the parameters so that the sum of the squaredresiduals of ``f(xdata, *popt) - ydata`` is minimizedpcov : 2d arrayThe estimated covariance of popt. The diagonals provide the varianceof the parameter estimate. To compute one standard deviation errorson the parameters use ``perr = np.sqrt(np.diag(pcov))``.

popt返回的是给定模型的最优参数。我们可以使用pcov的值检测拟合的质量,其对角线元素值代表着每个参数的方差。
curve_fit()函数,它利用的是最小二乘算法。

e的b/x次方拟合

  下面采用`Scipy`的`curve_fit()`对上面的数据进行e的b/x次方拟合。数据集如下:
x = np.arange(1, 16, 1)
num = [4.00, 5.20, 5.900, 6.80, 7.34,8.57, 9.86, 10.12, 12.56, 14.32,15.42, 16.50, 18.92, 19.58, 20.00]
y = np.array(num)

其中,x坐标从1到15,y对应Num数组,比如第一个点(1, 4.00)、最后一个点(15, 20.00)。

然后调用curve_fit()函数,核心步骤:

        (1) 定义需要拟合的函数类型,如:def func(x, a, b):return a*np.exp(b/x)(2) 调用 popt, pcov = curve_fit(func, x, y) 函数进行拟合,并将拟合系数存储在popt中,a=popt[0]、b=popt[1]进行调用;(3) 调用func(x, a, b)函数,其中x表示横轴表,a、b表示对应的参数。
import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit# 自定义函数 e指数形式
def func(x, a, b):return a * np.exp(b / x)# 定义x、y散点坐标
x = np.arange(1, 16, 1)
num = [4.00, 5.20, 5.900, 6.80, 7.34,8.57, 9.86, 10.12, 12.56, 14.32,15.42, 16.50, 18.92, 19.58, 20.00]
y = np.array(num)# 非线性最小二乘法拟合
popt, pcov = curve_fit(func, x, y)
# 获取popt里面是拟合系数
a = popt[0]
b = popt[1]
yvals = func(x, a, b)  # 拟合y值
print(u'系数a:', a)print(u'系数b:', b)
系数a: 28.733856761930063
系数b: -6.533497000227547# 绘图
plot1 = plt.plot(x, y, 's', label='original values')
plot2 = plt.plot(x, yvals, 'r', label='polyfit values')
plt.xlabel('x')
plt.ylabel('y')
plt.legend(loc=4)  # 指定legend的位置右下角
plt.title('curve_fit')
plt.show()
plt.savefig('test2.png')

aX的b次方拟合

第三种方法是通过Pandas导入数据,因为通常数据都会存储在csv、excel或数据库中,所以这里结合读写数据绘制a*x的b次方形式。
假设本地存在一个data.csv文件,数据集如下图所示:

然后调用Pandas扩展包读取数据,并获取x、y值显示,这段代码如下:

#导入数据及x、y散点坐标
data = pd.read_csv("data.csv")
print data
print(data.shape)
print(data.head(5)) #显示前5行数据
x = data['x'] #获取x列
y = data['y'] #获取y列
print x
print y

比如 print y 输出结果:

0      4.00
1      5.20
2      5.90
3      6.80
4      7.34
5      8.57
6      9.86
7     10.12
8     12.56
9     14.32
10    15.42
11    16.50
12    18.92
13    19.58
14    20.00
Name: y, dtype: float64

最后完整的拟合代码如下所示:

#encoding=utf-8
import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit
import pandas as pd  #自定义函数 e指数形式
def func(x, a, b):return a*pow(x,b)#导入数据及x、y散点坐标
data = pd.read_csv("data.csv")
print data
print(data.shape)
print(data.head(5)) #显示前5行数据
x = data['x']
y = data['y']
print x
print y#非线性最小二乘法拟合
popt, pcov = curve_fit(func, x, y)
#获取popt里面是拟合系数
a = popt[0]
b = popt[1]
yvals = func(x,a,b) #拟合y值
print u'系数a:', a
print u'系数b:', b#绘图
plot1 = plt.plot(x, y, 's',label='original values')
plot2 = plt.plot(x, yvals, 'r',label='polyfit values')
plt.xlabel('x')
plt.ylabel('y')
plt.legend(loc=4) #指定legend的位置右下角
plt.title('curve_fit')
plt.savefig('test3.png')
plt.show()

三个参数拟合

最后介绍官方给出的实例,讲述传递三个参数,通常为 a*e(b/x)+c形式。

import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import curve_fitdef func(x, a, b, c):return a * np.exp(-b * x) + c# define the data to be fit with some noise
xdata = np.linspace(0, 4, 50)
y = func(xdata, 2.5, 1.3, 0.5)
y_noise = 0.2 * np.random.normal(size=xdata.size)
ydata = y + y_noise
plt.plot(xdata, ydata, 'b-', label='data')# Fit for the parameters a, b, c of the function `func`
popt, pcov = curve_fit(func, xdata, ydata)
plt.plot(xdata, func(xdata, *popt), 'r-', label='fit')# Constrain the optimization to the region of ``0 < a < 3``, ``0 < b < 2``
# and ``0 < c < 1``:
popt, pcov = curve_fit(func, xdata, ydata, bounds=(0, [3., 2., 1.]))
plt.plot(xdata, func(xdata, *popt), 'g--', label='fit-with-bounds')plt.xlabel('x')
plt.ylabel('y')
plt.legend()
plt.show()

polyfit函数可以使用最小二乘法将一些点拟合成一条曲线.

numpy.polyfit(x, y, deg, rcond=None, full=False, w=None, cov=False)x:要拟合点的横坐标y:要拟合点的纵坐标deg:自由度.例如:自由度为2,那么拟合出来的曲线就是二次函数,自由度是3,拟合出来的曲线就是3次函数numpy.polyfit返回的结果是一个包含系数的数组,这个数组可以被numpy.poly1d,使用
示例如下:
构建一个x2 + 2*x + 3的多项式:
p = np.poly1d([1, 2, 3])
print np.poly1d(p)
输出:2
1 x + 2 x + 3
输入一个未知数的值,可得结果:
p(0.5)
输出:
4.25

首先我们先来构造一下需要被拟合的散点

x = np.arange(-1, 1, 0.02)
y = 2 * np.sin(x * 2.3) + np.random.rand(len(x))

然后打印一下看看

plt.scatter(x, y)
plt.show()


然后用polyfit函数来把这些点拟合成一条3次曲线

parameter = np.polyfit(x, y, 3)

输出的结果为3次方程的参数,我们可以像下面这样把方程拼接出来

y2 = parameter[0] * x ** 3 + parameter[1] * x ** 2 + parameter[2] * x + parameter[3]

将拟合后的结果打印一下

plt.scatter(x, y)
plt.plot(x, y2, color='g')
plt.show()


还可以使用poly1d()函数帮我们拼接方程,结果是一样的

p = np.poly1d(parameter)
plt.scatter(x, y)
plt.plot(x, p(x), color='g')
plt.show()

Scipy、Numpy实现曲线拟合相关推荐

  1. python2.7安装matplotlib_Ubuntu-Python2.7安装 scipy,numpy,matplotlib 和pip

    一. scipy,numpy,matplotlib sudo apt-get install python-scipy sudo apt-get install python-numpy sudo a ...

  2. python应用-scipy,numpy,sympy计算微积分

    python应用-scipy,numpy,sympy计算微积分 今天来讲一下使用python进行微积分运算,python有很多科学计算库都可以进行微积分运算,当然如果知晓微积分计算的原理也可以自己编程 ...

  3. Ubuntu安装scipy,numpy,pylab

    1.安装依赖库: sudo apt-get install python python-dev libatlas-base-dev gcc gfortran g++ 2.安装: sudo apt-ge ...

  4. Ubuntu-Python2.7安装 scipy,numpy,matplotlib

    sudo apt-get install python-scipy sudo apt-get install python-numpy sudo apt-get install python-matp ...

  5. Ubuntu-Python安装 scipy,numpy,matplotlib

    sudo apt-get install python-scipy sudo apt-get install python-numpy sudo apt-get install python-matp ...

  6. python高通滤波,高通滤波器使用scipy / numpy在python中进行图像处理

    I am currently studying image processing. In Scipy, I know there is one median filter in Scipy.signa ...

  7. win7 64位 Python3.5.1 scipy,numpy, Gensim主题模型包安装

    由于Gensim 官网暂时还没有Python3.5 对应的版本,本人安装 Gensim时也是各种纠结,因此专门开通博客,想通过博客来记录一下安装过程,希望也能对部分同道中人有点帮助. 环境: win7 ...

  8. python查看安装包的版本scipy,numpy,matplotlib等

    查看python的版本很简单: python -V or python --version 查看python安装的宏包版本,以scipy为例,其他包一样 先进入python里,即在终端中输入pytho ...

  9. scipy是python下的什么_Python下科学计算包numpy和SciPy的安装

    Python下大多数工具包的安装都很简单,只需要执行 "python setup.py install"命令即可.然而,由于SciPy和numpy这两个科学计算包的依赖关系较多,安 ...

最新文章

  1. 复旦邱锡鹏超全NLP预训练模型综述论文:两张图带你梳理完整脉络
  2. C语言string.h文件函数汇总详解
  3. Tensorflow2.0开启,从此忘记1.*版本
  4. nacos集群的ap cp切换_阿里Nacos-配置-多环境
  5. php全站文章搜索,Discuz X3.1全站文章全文检索的实现方法
  6. Python使用matplotlib设置pandas绘制的饼状图扇形标签
  7. NBIA Data Retriever(NBIA数据下载工具)使用
  8. js中中括号,大括号使用详解
  9. 统信系统UOS桌面版V20 用户手册
  10. 16进制颜色代码转RGB代码
  11. android电视与苹果手机图片,小米电视怎么投屏?图文讲解安卓和苹果手机投屏到小米电视方法...
  12. 五年饮冰,难凉热血”,一名专科生的求学历程
  13. 刚上大一,C 语言压根听不懂怎么办?
  14. 【了解结构体与指针、数组、函数、字符串之间的关系】(学习笔记14--结构体)
  15. validation list嵌套对象校验
  16. 传播问卷调查数据不够?自己生成假数据!
  17. cmd 修改ip地址
  18. Excel数据导入到hbase实战
  19. Vue3 vue-cli、create-react-app、vite 创建vue/react项目(笔记)
  20. Android studio 出现C:\WINDOWS\TEMP\

热门文章

  1. 2.二进制部署K8s集群
  2. [附源码]java毕业设计同城搬家平台
  3. centos7创建python虚拟环境
  4. 自动化测试框架,YYDS
  5. JUC多线程面试典籍30+ | 大别山码将
  6. SQL Server 2008从基础开始学习的历程(1)------创建表与查询
  7. 计算机专业英语第12章在线测试,《计算机专业英语》第12章在线测试.doc
  8. 论文笔记: Hierarchical Chinese Legal event extraction via Pedal Attention Mechanism
  9. Qt保存和恢复页面布局
  10. 从GPS角度来讲,抵押车和质押车有什么不同