Python求离散序列导数的示例


Posted in Python onJuly 10, 2019

有一组4096长度的数据,需要找到一阶导数从正到负的点,和三阶导数从负到正的点,截取了一小段。

394.0
388.0
389.0
388.0
388.0
392.0
393.0
395.0
395.0
394.0
394.0
390.0
392.0

按照之前所了解的,对离散值求导其实就是求差分,例如第i点的导数(差分)为:

Python求离散序列导数的示例

即在一个宽度为2m+1的窗口内通过计算前后m个值加权后的和得到。但是在实际使用过程中效果不是很好。于是想到了同样在一个宽度为2k+1的窗口内,将这2k+1个点拟合成一个函数,然后求导就可以得到任意阶数的导数值。

首先是函数拟合,使用from scipy.optimize import leastsq即最小二乘拟合

from scipy.optimize import leastsq
class search(object):
  def __init__(self, filename):
    self.filename = filename

  def func(self, x, p):
    f = np.poly1d(p)
    return f(x)

  def residuals(self, p, x, y, reg):
    regularization = 0.1 # 正则化系数lambda
    ret = y - self.func(x, p)
    if reg == 1:
      ret = np.append(ret, np.sqrt(regularization) * p)
    return ret

  def LeastSquare(self, data, k=100, order=4, reg=1, show=1): # k为求导窗口宽度,order为多项式阶数,reg为是否正则化
    l = self.len
    step = 2 * k + 1
    p = [1] * order
    for i in range(0, l, step):
      if i + step < l:
        y = data[i:i + step]
        x = np.arange(i, i + step)
      else:
        y = data[i:]
        x = np.arange(i, l)
      try: 
        r = leastsq(self.residuals, p, args=(x, y, reg))
      except:
        print("Error - curve_fit failed")
      fun = np.poly1d(r[0]) # 返回拟合方程系数
      df_1 = np.poly1d.deriv(fun) # 求得导函数
      df_2 = np.poly1d.deriv(df_1)
      df_3 = np.poly1d.deriv(df_2)
      df_value = df_1(x)
      df3_value = df_3(x)

fun = np.poly1d(r[0]),fun返回的是一个 polynomial class,具体使用可以见官方文档numpy.poly1d
polynomial对象可以使用deriv方法求导数,求得的依然是 polynomial对象。 df_value = df_1(x)所得到的就是x这个几个点求得的导数值。

看似大功告成,但是求导的结果并不是很好,如下图,实际最高点在100左右,但是拟合出来的曲线最高点在120左右,而原因在于使用多项式拟合很难准确拟合曲线。

Python求离散序列导数的示例

于是想用高斯函数来实现对曲线的拟合,在matlab中试了下,三阶高斯拟合可以很好的拟合曲线,

Python求离散序列导数的示例

但是numpy以及sicpy中没有找到类似poly1d这种对象,虽然可以自己定义高斯函数,如下

def gaussian(self, x, *param):
    fun = param[0]*np.exp(-np.power(x - param[2], 2.) / (2 * np.power(param[4],    2.)))+param[1]*np.exp(-np.power(x - param[3], 2.) / (2 * np.power(param[5], 2.)))
    return fun

但是,在通过最小二乘拟合得到函数参数后只能得到拟合后的点,无法直接求导数..所以并不适合。

所以还是只能回到多项式拟合,如果4阶多项式不能表征的话,更高阶的呢

Python求离散序列导数的示例

总体来说,效果还是可以接受的。

如果下阶段找到好的高斯函数拟合方法,会继续更新。

以上这篇Python求离散序列导数的示例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python警察与小偷的实现之一客户端与服务端通信实例
Oct 09 Python
kNN算法python实现和简单数字识别的方法
Nov 18 Python
在Python中处理字符串之ljust()方法的使用简介
May 19 Python
python爬虫实战之爬取京东商城实例教程
Apr 24 Python
Flask web开发处理POST请求实现(登录案例)
Jul 26 Python
提升Python程序性能的7个习惯
Apr 14 Python
Python3+OpenCV2实现图像的几何变换(平移、镜像、缩放、旋转、仿射)
May 13 Python
Python+threading模块对单个接口进行并发测试
Jun 25 Python
python将四元数变换为旋转矩阵的实例
Dec 04 Python
Python学习工具jupyter notebook安装及用法解析
Oct 23 Python
Python通过Schema实现数据验证方式
Nov 12 Python
Python可视化学习之seaborn调色盘
Feb 24 Python
Python Matplotlib 基于networkx画关系网络图
Jul 10 #Python
我们为什么要减少Python中循环的使用
Jul 10 #Python
详解Python中的各种转义符\n\r\t
Jul 10 #Python
使用python画社交网络图实例代码
Jul 10 #Python
python 绘制拟合曲线并加指定点标识的实现
Jul 10 #Python
python 寻找离散序列极值点的方法
Jul 10 #Python
Python中面向对象你应该知道的一下知识
Jul 10 #Python
You might like
数字转英文
2006/12/06 PHP
在PHP中读取和写入WORD文档的代码
2008/04/09 PHP
php cookie 作用范围?不要在当前页面使用你的cookie
2009/03/24 PHP
php自定义函数实现二维数组按指定key排序的方法
2016/09/29 PHP
uploadify在Firefox下丢失session问题的解决方法
2013/08/07 Javascript
基于jquery实现页面滚动时顶部导航显示隐藏
2020/04/20 Javascript
JavaScript中输出信息的方法(信息确认框-提示输入框-文档流输出)
2016/06/12 Javascript
js正则表达式最长匹配(贪婪匹配)和最短匹配(懒惰匹配)用法分析
2016/12/27 Javascript
利用HTML5+Socket.io实现摇一摇控制PC端歌曲切换
2017/01/13 Javascript
ES6学习笔记之map、set与数组、对象的对比
2018/03/01 Javascript
vue的常用组件操作方法应用分析
2018/04/13 Javascript
vuejs中监听窗口关闭和窗口刷新事件的方法
2018/09/21 Javascript
vue+web端仿微信网页版聊天室功能
2019/04/30 Javascript
关于在LayUI中使用AJAX提交巨坑记录
2019/10/25 Javascript
VUE实现Studio管理后台之鼠标拖放改变窗口大小
2020/03/04 Javascript
支付宝小程序实现省市区三级联动
2020/06/21 Javascript
jQuery实现简单评论区功能
2020/10/26 jQuery
天翼开放平台免费短信验证码接口使用实例
2013/12/18 Python
python实现将汉字转换成汉语拼音的库
2015/05/05 Python
Python用sndhdr模块识别音频格式详解
2018/01/11 Python
Python简单爬虫导出CSV文件的实例讲解
2018/07/06 Python
python实现屏保计时器的示例代码
2018/08/08 Python
PyTorch中的Variable变量详解
2020/01/07 Python
python GUI库图形界面开发之PyQt5多行文本框控件QTextEdit详细使用方法实例
2020/02/28 Python
Tensorflow之梯度裁剪的实现示例
2020/03/08 Python
Conforama瑞士:家具、厨房、电器、装饰
2020/09/06 全球购物
澳大利亚网上书店:QBD
2021/01/09 全球购物
J2EE中的容器都包括哪些
2013/08/21 面试题
大学生军训广播稿
2014/01/24 职场文书
村居抓节水倡议书
2014/05/19 职场文书
学雷锋先进个人事迹
2014/05/26 职场文书
文明礼仪倡议书
2015/04/28 职场文书
2016大一新生军训心得体会
2016/01/11 职场文书
Python调用腾讯API实现人脸身份证比对功能
2022/04/04 Python
pandas中pd.groupby()的用法详解
2022/06/16 Python
Windows server 2016服务器基本设置
2022/08/14 Servers