插值与拟合

原文链接:https://zhuanlan.zhihu.com/p/28149195

1.最小二乘拟合

实例1

# -*- coding: utf-8 -*-

import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import leastsq
## 设置字符集,防止中文乱码
import matplotlib
matplotlib.rcParams['font.sans-serif']=[u'simHei']
matplotlib.rcParams['axes.unicode_minus']=False plt.figure(figsize=(9,9))
x=np.linspace(0,10,1000)
X = np.array([8.19, 2.72, 6.39, 8.71, 4.7, 2.66, 3.78])
Y = np.array([7.01, 2.78, 6.47, 6.71, 4.1, 4.23, 4.05])
#计算以p为参数的直线和原始数据之间的误差
def f(p):
k, b = p
return(Y-(k*X+b))
#leastsq使得f的输出数组的平方和最小,参数初始值为[1,0]
r = leastsq(f, [1,0])
k, b = r[0]
print("k=",k,"b=",b) plt.scatter(X,Y, s=100, alpha=1.0, marker='o',label=u'数据点') y=k*x+b ax = plt.gca() ax.set_xlabel(..., fontsize=20)
ax.set_ylabel(..., fontsize=20)
#设置坐标轴标签字体大小 plt.plot(x, y, color='r',linewidth=5, linestyle=":",markersize=20, label=u'拟合曲线') plt.legend(loc=0, numpoints=1)
leg = plt.gca().get_legend()
ltext = leg.get_texts()
plt.setp(ltext, fontsize='xx-large') plt.xlabel(u'安培/A')
plt.ylabel(u'伏特/V') plt.xlim(0, x.max() * 1.1)
plt.ylim(0, y.max() * 1.1) plt.xticks(fontsize=20)
plt.yticks(fontsize=20)
#刻度字体大小 plt.legend(loc='upper left') plt.show()

k= 0.6134953491930442 b= 1.794092543259387

实例2

# -*- coding: utf-8 -*-

#最小二乘拟合实例
import numpy as np
from scipy.optimize import leastsq
import pylab as pl
## 设置字符集,防止中文乱码
import matplotlib
matplotlib.rcParams['font.sans-serif']=[u'simHei']
matplotlib.rcParams['axes.unicode_minus']=False def func(x, p):
"""
数据拟合所用的函数: A*cos(2*pi*k*x + theta)
"""
A, k, theta = p
return A*np.sin(k*x+theta) def residuals(p, y, x):
"""
实验数据x, y和拟合函数之间的差,p为拟合需要找到的系数
"""
return y - func(x, p) x = np.linspace(0, 20, 100)
A, k, theta = 10, 3, 6 # 真实数据的函数参数
y0 = func(x, [A, k, theta]) # 真实数据
y1 = y0 + 2 * np.random.randn(len(x)) # 加入噪声之后的实验数据 p0 = [10, 0.2, 0] # 第一次猜测的函数拟合参数 # 调用leastsq进行数据拟合
# residuals为计算误差的函数
# p0为拟合参数的初始值
# args为需要拟合的实验数据
plsq = leastsq(residuals, p0, args=(y1, x)) print (u"真实参数:", [A, k, theta] )
print (u"拟合参数", plsq[0]) # 实验数据拟合后的参数 pl.plot(x, y0, color='r',label=u"真实数据")
pl.plot(x, y1, color='b',label=u"带噪声的实验数据")
pl.plot(x, func(x, plsq[0]), color='g', label=u"拟合数据")
pl.legend()
pl.show()

真实参数: [10, 3, 6]
拟合参数 [-1.16428658 0.24215786 -0.794681 ]

2.插值

实例1

# -*- coding: utf-8 -*-

# -*- coding: utf-8 -*-

import numpy as np
import pylab as pl
from scipy import interpolate
import matplotlib.pyplot as plt
## 设置字符集,防止中文乱码
import matplotlib
matplotlib.rcParams['font.sans-serif']=[u'simHei']
matplotlib.rcParams['axes.unicode_minus']=False x = np.linspace(0, 2*np.pi+np.pi/4, 10)
y = np.sin(x) x_new = np.linspace(0, 2*np.pi+np.pi/4, 100)
f_linear = interpolate.interp1d(x, y)
tck = interpolate.splrep(x, y)
y_bspline = interpolate.splev(x_new, tck) plt.xlabel(u'安培/A')
plt.ylabel(u'伏特/V') plt.plot(x, y, "o", label=u"原始数据")
plt.plot(x_new, f_linear(x_new), label=u"线性插值")
plt.plot(x_new, y_bspline, label=u"B-spline插值") pl.legend()
pl.show()

实例2

# -*- coding: utf-8 -*-

import numpy as np
from scipy import interpolate
import pylab as pl
## 设置字符集,防止中文乱码
import matplotlib
matplotlib.rcParams['font.sans-serif']=[u'simHei']
matplotlib.rcParams['axes.unicode_minus']=False #创建数据点集并绘制
pl.figure(figsize=(12,9))
x = np.linspace(0, 10, 11)
y = np.sin(x)
ax=pl.plot() pl.plot(x,y,'ro')
#建立插值数据点
xnew = np.linspace(0, 10, 101)
for kind in ['nearest', 'zero','linear','quadratic']:
#根据kind创建插值对象interp1d
f = interpolate.interp1d(x, y, kind = kind)
ynew = f(xnew)#计算插值结果
pl.plot(xnew, ynew, label = str(kind)) pl.xticks(fontsize=20)
pl.yticks(fontsize=20) pl.legend(loc = 'lower right')
pl.show()

B样条曲线插值
一维数据的插值运算可以通过 interp1d()实现。
其调用形式为:
Interp1d可以计算x的取值范围之内任意点的函数值,并返回新的数组。
interp1d(x, y, kind=‘linear’, …)
参数 x和y是一系列已知的数据点
参数kind是插值类型,可以是字符串或整数

B样条曲线插值
Kind给出了B样条曲线的阶数:
 ‘
zero‘ ‘nearest’ :0阶梯插值,相当于0阶B样条曲线
 ‘slinear’‘linear’ :线性插值,相当于1阶B样条曲线
 ‘quadratic’‘cubic’:2阶和3阶B样条曲线,更高阶的曲线可以直接使用整数值来指定

(1)#创建数据点集:

import numpy as np

x = np.linspace(0, 10, 11)

y = np.sin(x)

(2)#绘制数据点集:

import pylab as pl

pl.plot(x,y,'ro')

创建interp1d对象f、计算插值结果:
xnew = np.linspace(0, 10, 11)
from scipy import interpolate
f = interpolate.interp1d(x, y, kind = kind)
ynew = f(xnew)

根据kind类型创建interp1d对象f、计算并绘制插值结果:
xnew = np.linspace(0, 10, 11)
for kind in ['nearest', 'zero','linear','quadratic']:
#根据kind创建插值对象interp1d
f = interpolate.interp1d(x, y, kind = kind)
ynew = f(xnew)#计算插值结果
pl.plot(xnew, ynew, label = str(kind))#绘制插值结果

如果我们将代码稍作修改增加一个5阶插值

import numpy as np
from scipy import interpolate
import pylab as pl
#创建数据点集并绘制
pl.figure(figsize=(12,9))
x = np.linspace(0, 10, 11)
y = np.sin(x)
ax=pl.plot() pl.plot(x,y,'ro')
#建立插值数据点
xnew = np.linspace(0, 10, 101)
for kind in ['nearest', 'zero','linear','quadratic',5]:
#根据kind创建插值对象interp1d
f = interpolate.interp1d(x, y, kind = kind)
ynew = f(xnew)#计算插值结果
pl.plot(xnew, ynew, label = str(kind)) pl.xticks(fontsize=20)
pl.yticks(fontsize=20) pl.legend(loc = 'lower right')
pl.show()
运行得到

发现5阶已经很接近正弦曲线,但是如果x值选取范围较大,则会出现跳跃。

关于拟合与插值的数学基础可参见霍开拓:拟合与插值的区别?

左边插值,右边拟合

Python SciPy库——插值与拟合的更多相关文章

  1. 转Python SciPy库——拟合与插值

    1.最小二乘拟合 实例1 import numpy as np import matplotlib.pyplot as plt from scipy.optimize import leastsq p ...

  2. python scipy库

    三.假定正态分布,求解1倍标准差和0.5倍标准差的概率? 二.求解多元线性或非线性方程组解 一.求解3元一次方程 1.学习资料  https://github.com/lijin-THU/notes- ...

  3. [笔记]我的Linux入门之路 - 05.Eclipse的Python开发环境搭建与Numpy、Scipy库安装

    一.Python环境 直接终端查询下python安装没:python --version Python 2.7.12 Ubuntu竟然已经装了Python2.7,那就好说了.不然自己装和装jdk差不多 ...

  4. Python数模笔记-Scipy库(1)线性规划问题

    1.最优化问题建模 最优化问题的三要素是决策变量.目标函数和约束条件. (1)分析影响结果的因素是什么,确定决策变量 (2)决策变量与优化目标的关系是什么,确定目标函数 (3)决策变量所受的限制条件是 ...

  5. 第4天:scipy库

    一.SciPy库概述 1.numpy提供向量和矩阵的相关操作,高级计算器 2.SciPy在统计.优化.插值.数值积分.视频转换等,涵盖基础科学计算相关问题. (额,对统计和概率,数理完全一窍不通) 3 ...

  6. python第三方库,你要的这里都有

    Python的第三方库多的超出我的想象. python 第三方模块 转 https://github.com/masterpy/zwpy_lst   Chardet,字符编码探测器,可以自动检测文本. ...

  7. python常用库(转)

    转自http://www.west999.com/info/html/wangluobiancheng/qita/20180729/4410114.html Python常用的库简单介绍一下 fuzz ...

  8. Python全部库整理

    库名称简介 Chardet字符编码探测器,可以自动检测文本.网页.xml的编码. colorama主要用来给文本添加各种颜色,并且非常简单易用. Prettytable主要用于在终端或浏览器端构建格式 ...

  9. python的库有多少个?python有多少个模块?

    这里列举了大概500个左右的库: !   Chardet字符编码探测器,可以自动检测文本.网页.xml的编码. colorama主要用来给文本添加各种颜色,并且非常简单易用. Prettytable主 ...

随机推荐

  1. Vim使用技巧(5) -- 宏的录制与使用

    想象一个场景,我们怎么快速把下面的所有链接都加上双引号?可能你手速快,可以很快的加完,但是如果链接有上万个呢?你如何在十秒以内加完? 这时候就需要用到“宏”(其实除了宏vim还有其它方法加上双引号,这 ...

  2. MyBatis_动态sql_foreach_mysql下foreach批量插入的两种方式

    方法1: 笔记要点出错分析与总结工程组织数据库组织0.重新修改Bean类    修改1.定义接口 //批量插入 public void addEmps(@Param("emps") ...

  3. 《AlwaysRun!》第五次作业:项目需求分析改进与系统设计

     项目 内容 这个作业属于哪个课程 2016级软件工程(西北师范大学) 这个作业的要求在哪里 实验九 团队作业5—团队项目需求改进与系统设计 团队名称 Always Run! 作业学习目标 (1)掌握 ...

  4. sqlplus、exp、imp不是内部或外部命令,也不是可运行的程序

    oracle 想exp导出数据库,参考网上的作业,进入CMD命令,黑屏后输入命令出现EXP后出现EXP不能内部或外部命令. 网上找到下列解决方法 摘自:http://blog.csdn.net/suz ...

  5. Django REST framework+Vue 打造生鲜电商项目(笔记六)

    (部分代码来自https://www.cnblogs.com/derek1184405959/p/8836205.html) 九.个人中心功能开发 1.drf的api文档自动生成 (1) url #d ...

  6. vue app.xxx.js 较大问题

    线上build之后发现app.XXX.js 文件特别大. 包我都改为cdn了 其他空间就是路由改为懒加载了. { path: '/a/b', name: 'ab', component: () =&g ...

  7. @JsonSerialize @JsonIgnoreProperties @JsonIgnore @JsonFormat

    @JsonIgnoreProperties 此注解是类注解,作用是json序列化时将java bean中的一些属性忽略掉,序列化和反序列化都受影响. @JsonIgnore 此注解用于属性或者方法上( ...

  8. git查看commit提交记录详情

    相关的命令: git log:查看所有的commit提交记录: git show: 查看提交的详情: 首先,需要通过git log打印所有commit记录,例如: 1.查看最新的commit:git ...

  9. 学到了林海峰,武沛齐讲的Day19 迭代细讲

    在家加1个月学了8day的课  出差6天看了8day的课..说明再忙也是可以挤挤多学习的. 广州出差最后两天没学习.一天做车,一天做公司的事...4天就过去了. 老师讲的包子和鸡蛋需求不好...讲的有 ...

  10. postgrepSQL psql基础操作

    1.登录postgrepSQL psql 2.退出postgrepSQL \q 3.查看postgrepSQL里面的数据库 1)psql -l 2)\ l 4.切换DB \c db_name 5.查看 ...