一维插值

  插值不同于拟合。插值函数经过样本点,拟合函数一般基于最小二乘法尽量靠近所有样本点穿过。常见插值方法有拉格朗日插值法、分段插值法、样条插值法。

  1. 拉格朗日插值多项式:当节点数n较大时,拉格朗日插值多项式的次数较高,可能出现不一致的收敛情况,而且计算复杂。随着样点增加,高次插值会带来误差的震动现象称为龙格现象。
  2. 分段插值:虽然收敛,但光滑性较差。
  3. 样条插值:样条插值是使用一种名为样条的特殊分段多项式进行插值的形式。由于样条插值可以使用低阶多项式样条实现较小的插值误差,这样就避免了使用高阶多项式所出现的龙格现象,所以样条插值得到了流行。
# -*-coding:utf-8 -*-
import numpy as np
from scipy import interpolate
import pylab as plx=np.linspace(0,10,11)
#x=[  0.   1.   2.   3.   4.   5.   6.   7.   8.   9.  10.]
y=np.sin(x)
xnew=np.linspace(0,10,101)
pl.plot(x,y,"ro")for kind in ["nearest","zero","slinear","quadratic","cubic"]:#插值方式#"nearest","zero"为阶梯插值#slinear 线性插值#"quadratic","cubic" 为2阶、3阶B样条曲线插值f=interpolate.interp1d(x,y,kind=kind)# ‘slinear’, ‘quadratic’ and ‘cubic’ refer to a spline interpolation of first, second or third order)ynew=f(xnew)pl.plot(xnew,ynew,label=str(kind))
pl.legend(loc="lower right")
pl.show()

结果:

二维插值

  方法与一维数据插值类似,为二维样条插值。

# -*- coding: utf-8 -*-
"""
演示二维插值。
"""
import numpy as np
from scipy import interpolate
import pylab as pl
import matplotlib as mpldef func(x, y):return (x+y)*np.exp(-5.0*(x**2 + y**2))# X-Y轴分为15*15的网格
y,x= np.mgrid[-1:1:15j, -1:1:15j]fvals = func(x,y) # 计算每个网格点上的函数值  15*15的值
print len(fvals[0])#三次样条二维插值
newfunc = interpolate.interp2d(x, y, fvals, kind='cubic')# 计算100*100的网格上的插值
xnew = np.linspace(-1,1,100)#x
ynew = np.linspace(-1,1,100)#y
fnew = newfunc(xnew, ynew)#仅仅是y值   100*100的值# 绘图
# 为了更明显地比较插值前后的区别,使用关键字参数interpolation='nearest'
# 关闭imshow()内置的插值运算。
pl.subplot(121)
im1=pl.imshow(fvals, extent=[-1,1,-1,1], cmap=mpl.cm.hot, interpolation='nearest', origin="lower")#pl.cm.jet
#extent=[-1,1,-1,1]为x,y范围  favals为
pl.colorbar(im1)pl.subplot(122)
im2=pl.imshow(fnew, extent=[-1,1,-1,1], cmap=mpl.cm.hot, interpolation='nearest', origin="lower")
pl.colorbar(im2)
pl.show()

左图为原始数据,右图为二维插值结果图。

二维插值的三维展示方法

# -*- coding: utf-8 -*-
"""
演示二维插值。
"""
# -*- coding: utf-8 -*-
import numpy as np
from mpl_toolkits.mplot3d import Axes3D
import matplotlib as mpl
from scipy import interpolate
import matplotlib.cm as cm
import matplotlib.pyplot as pltdef func(x, y):return (x+y)*np.exp(-5.0*(x**2 + y**2))# X-Y轴分为20*20的网格
x = np.linspace(-1, 1, 20)
y = np.linspace(-1,1,20)
x, y = np.meshgrid(x, y)#20*20的网格数据fvals = func(x,y) # 计算每个网格点上的函数值  15*15的值fig = plt.figure(figsize=(9, 6))
#Draw sub-graph1
ax=plt.subplot(1, 2, 1,projection = '3d')
surf = ax.plot_surface(x, y, fvals, rstride=2, cstride=2, cmap=cm.coolwarm,linewidth=0.5, antialiased=True)
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_zlabel('f(x, y)')
plt.colorbar(surf, shrink=0.5, aspect=5)#标注#二维插值
newfunc = interpolate.interp2d(x, y, fvals, kind='cubic')#newfunc为一个函数# 计算100*100的网格上的插值
xnew = np.linspace(-1,1,100)#x
ynew = np.linspace(-1,1,100)#y
fnew = newfunc(xnew, ynew)#仅仅是y值   100*100的值  np.shape(fnew) is 100*100
xnew, ynew = np.meshgrid(xnew, ynew)
ax2=plt.subplot(1, 2, 2,projection = '3d')
surf2 = ax2.plot_surface(xnew, ynew, fnew, rstride=2, cstride=2, cmap=cm.coolwarm,linewidth=0.5, antialiased=True)
ax2.set_xlabel('xnew')
ax2.set_ylabel('ynew')
ax2.set_zlabel('fnew(x, y)')
plt.colorbar(surf2, shrink=0.5, aspect=5)#标注plt.show()

左图的二维数据集的函数值由于样本较少,会显得粗糙。而右图对二维样本数据进行三次样条插值,拟合得到更多数据点的样本值,绘图后图像明显光滑多了。

  

转自各种插值法的python实现 - 行走的蓑衣客 - 博客园

各种插值法的python实现相关推荐

  1. 拉格朗日插值法 【python】

    一.插值 设函数y=f(x)在区间[a,b]上连续,给定n+1个点 a≤x0<x1<....<xn≤b 已知,f(xk)=yk(k=0,1....n),在函数类P中寻找一个函数Φ(x ...

  2. python双线性插值函数_双线性插值法原理 python实现

    码字不易,如果此文对你有所帮助,请帮忙点赞,感谢! 一. 双线性插值法原理: ① 何为线性插值? 插值就是在两个数之间插入一个数,线性插值原理图如下: 在位置 x 进行线性插值,插入的值为f(x) ↑ ...

  3. 拉格朗日插值法《python数据分析与挖掘实践》

    数据清洗 数据清洗主要是删除原始数据集中地无关数据.重复数据.平滑噪声数据,筛选掉与挖掘主题无关的数据,处理缺失值.异常值等. 缺失值处理的方法可分为3类:删除记录.数据插补和不处理. 删除含有缺失值 ...

  4. 多项式插值法的Python程序

    多项式插值法 例子 求t=16时,速度v的值 #多项式插值 from numpy import * from numpy.linalg import * x = [0, 10, 15, 20, 22. ...

  5. 缺失值填充6——拉格朗日插值法填充序列缺失值

    拉格朗日插值法的直观表述可以参考:https://www.zhihu.com/question/58333118 拉格朗日插值法 在python中可以直接使用: from scipy.interpol ...

  6. 【Python数据分析】数据预处理1——数据清洗

    在数据挖掘过程中,数据预处理过程是占比很大的一部分工作 数据预处理过程主要有以下几个部分 1.数据清洗--2.数据集成--3.数据变换--4.数据规约 本文介绍数据清洗部分 一.缺失值分析与处理 1. ...

  7. Python基础之Flask快速入门2

    通过上一篇文章的快速入门,实现了Python利用Flask框架搭建web项目的基本内容,本文将进一步介绍如何通过jQuery实现Flask项目的异步刷新,以达到局部更新的目的,仅供学习分享使用,如有不 ...

  8. python3插值法

    目录 插值法简介 python函数 splreph函数参数 splev 一次样条函数插值 小区间仔细观察 三次精确插值 小结 插值法简介 插值法又称"内插法",是利用函数f (x) ...

  9. 分段函数用python表达_python文章分段

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 开发准备cas 的 python sdk 包含了用于访问和操作 cas 的所有 ...

最新文章

  1. Mac MySQL 数据库配置(关系型数据库管理系统)
  2. webservice中cxf框架的HelloWord
  3. 设某一机器由n个部件组成_每日小课堂超级攻略!工业机器人知识点全知道
  4. controller的frame
  5. 微信小程序align_微信小程序四色花瓣
  6. Android 3.0细节曝光:Google程序更耀眼
  7. Java OCR tesseract 图像智能字符识别技术
  8. (C#基本语法)2.类型
  9. Kali Linux 无线渗透测试入门指南 第八章 攻击企业级 WPA 和 RADIUS
  10. Scrivener for Mac如何自定义快捷键
  11. cnblog 闪存刷星星,每一条闪存都是星星
  12. 第五章 机械臂的组装及控制
  13. 无线MODEM使用心得
  14. Linux之线程条件变量cond
  15. 计算机CPU工作(多核/缓存)原理
  16. 如何在云服务器安装操作系统
  17. cml sml区别_CAL.CML.SML的关系
  18. 【LeetCode系列】最长回文子串(双指针中心扩散)与可怜的小猪(老鼠毒药问题)
  19. 场效应管AO3401
  20. 2008车展美女车模

热门文章

  1. 3D游戏开发可视化渲染调试工具-KylinsGraphicsDebugger
  2. 基于Java基础-面向对象实现植物大战僵尸简易版
  3. Amazon Studios预订获奖喜剧《了不起的麦瑟尔夫人》第四季
  4. obj[key],ojb['key']和obj.key
  5. OJB查询(一) (转)
  6. 微信小程序视频点播在线视频学习系统 毕业设计 课程设计(5)视频播放页面
  7. 刚当上leader,我让组员去开会,他非说有更重要的会
  8. proteus教程——读写AT24C02
  9. 本周必看 | 7月MLPython 最佳开源项目Top 10 :从几百个项目中脱颖而出,都在收藏!...
  10. 计算机病毒与恶意代码学习交流