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实现从脚本里运行scrapy的方法
Apr 07 Python
python正则表达式及使用正则表达式的例子
Jan 22 Python
python 利用pandas将arff文件转csv文件的方法
Feb 12 Python
24式加速你的Python(小结)
Jun 13 Python
Django框架视图介绍与使用详解
Jul 18 Python
Django命名URL和反向解析URL实现解析
Aug 09 Python
python 进程 进程池 进程间通信实现解析
Aug 23 Python
浅谈Python程序的错误:变量未定义
Jun 02 Python
python自定义函数def的应用详解
Jun 03 Python
基于Tensorflow的MNIST手写数字识别分类
Jun 17 Python
pandas将list数据拆分成行或列的实现
Dec 13 Python
pip install命令安装扩展库整理
Mar 02 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
dedecms模版制作使用方法
2007/04/03 PHP
PHP 高级课程笔记 面向对象
2009/06/21 PHP
PHP导出MySQL数据到Excel文件(fputcsv)
2011/07/03 PHP
推荐十款免费 WordPress 插件
2015/03/24 PHP
PHP使用strstr()函数获取指定字符串后所有字符的方法
2016/01/07 PHP
在WordPress的后台中添加顶级菜单和子菜单的函数详解
2016/01/11 PHP
PHP使用mysql与mysqli连接Mysql数据库用法示例
2016/07/07 PHP
jqeury-easyui-layout问题解决方法
2014/03/24 Javascript
微信js-sdk上传与下载图片接口用法示例
2016/10/12 Javascript
用 Vue.js 递归组件实现可折叠的树形菜单(demo)
2017/12/25 Javascript
如何利用 JS 脚本实现网页全自动秒杀抢购功能
2020/10/12 Javascript
JS中锚点链接点击平滑滚动并自由调整到顶部位置
2021/02/06 Javascript
Python对两个有序列表进行合并和排序的例子
2014/06/13 Python
使用graphics.py实现2048小游戏
2015/03/10 Python
11月编程语言排行榜 Python逆袭C#上升到第4
2017/11/15 Python
PyQt5实现拖放功能
2018/04/25 Python
Python测试网络连通性示例【基于ping】
2018/08/03 Python
Python 获取div标签中的文字实例
2018/12/20 Python
Python实现求两个数组交集的方法示例
2019/02/23 Python
selenium python 实现基本自动化测试的示例代码
2019/02/25 Python
PyQt 图解Qt Designer工具的使用方法
2019/08/06 Python
Python API len函数操作过程解析
2020/03/05 Python
Python Flask上下文管理机制实例解析
2020/03/16 Python
Python GUI编程学习笔记之tkinter界面布局显示详解
2020/03/30 Python
如何在django中运行scrapy框架
2020/04/22 Python
Python如何进行时间处理
2020/08/06 Python
解决PyCharm IDE环境下,执行unittest不生成测试报告的问题
2020/09/03 Python
Alpine安装Python3依赖出现的问题及解决方法
2020/12/25 Python
使用javascript和HTML5 Canvas画的四渐变色播放按钮效果
2014/04/10 HTML / CSS
Oracle中delete,truncate和drop的区别
2016/05/05 面试题
下列程序在32位linux或unix中的结果是什么
2014/03/25 面试题
学校安全教育制度
2014/01/31 职场文书
小学教育见习总结
2015/06/23 职场文书
2016年小学优秀班主任事迹材料
2016/02/29 职场文书
html+css合并表格边框的示例代码
2021/03/31 HTML / CSS
golang定时器
2022/04/14 Golang