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中的round()方法
May 15 Python
python开发简易版在线音乐播放器
Mar 03 Python
python分割列表(list)的方法示例
May 07 Python
Python实现读取txt文件并转换为excel的方法示例
May 17 Python
python绘制圆柱体的方法
Jul 02 Python
tensorflow saver 保存和恢复指定 tensor的实例讲解
Jul 26 Python
python实现文本界面网络聊天室
Dec 12 Python
Python3.5 Pandas模块缺失值处理和层次索引实例详解
Apr 23 Python
PyQt5+python3+pycharm开发环境配置教程
Mar 24 Python
python爬取音频下载的示例代码
Oct 19 Python
python绘制高斯曲线
Feb 19 Python
利用Python判断整数是否是回文数的3种方法总结
Jul 07 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
php adodb介绍
2009/03/19 PHP
php自定义时间转换函数示例
2016/12/07 PHP
alixixi runcode.asp的代码不错的应用
2007/08/08 Javascript
$(document).ready(function() {})不执行初始化脚本
2014/06/19 Javascript
超棒的响应式布局jQuery插件Freetile.js
2014/11/17 Javascript
详解JavaScript中的事件流和事件处理程序
2016/05/20 Javascript
Jquery中map函数的用法
2016/06/03 Javascript
深入浅析knockout源码分析之订阅
2016/07/12 Javascript
JS实现iframe自适应高度的方法示例
2017/01/07 Javascript
js判断输入框不能为空格或null值的实现方法
2018/03/02 Javascript
vue实现组件之间传值功能示例
2018/07/13 Javascript
微信小程序封装的HTTP请求示例【附升级版】
2019/05/11 Javascript
详解webpack打包vue项目之后生成的dist文件该怎么启动运行
2019/09/06 Javascript
[03:21]辉夜杯主赛事 12月25日TOP5
2015/12/26 DOTA
[51:43]OG vs LGD 2018国际邀请赛淘汰赛BO3 第五场 8.26
2018/08/30 DOTA
在Python中使用异步Socket编程性能测试
2014/06/25 Python
Python 序列化 pickle/cPickle模块使用介绍
2014/11/30 Python
python操作mysql数据库
2017/03/05 Python
对python numpy数组中冒号的使用方法详解
2018/04/17 Python
Flask框架URL管理操作示例【基于@app.route】
2018/07/23 Python
Python3.5内置模块之shelve模块、xml模块、configparser模块、hashlib、hmac模块用法分析
2019/04/27 Python
Django后台管理系统的图文使用教学
2020/01/20 Python
离线状态下在jupyter notebook中使用plotly实例
2020/04/24 Python
Python的Django框架实现数据库查询(不返回QuerySet的方法)
2020/05/19 Python
利用PyQt5+Matplotlib 绘制静态/动态图的实现代码
2020/07/13 Python
CSS3实现div从下往上滑入滑出效果示例
2020/04/28 HTML / CSS
html5 touch事件实现触屏页面上下滑动(一)
2016/03/10 HTML / CSS
米兰网婚纱礼服法国网上商店:Milanoo法国
2016/08/20 全球购物
有机童装:Toby Tiger
2018/05/23 全球购物
什么是跨站脚本攻击
2014/12/11 面试题
请说出以下代码输出什么
2013/08/30 面试题
《识字五》教学反思
2014/03/01 职场文书
宝宝满月酒主持词和仪式流程
2014/03/27 职场文书
党风廉设责任书
2014/04/16 职场文书
jQuery ajax - getScript() 方法和getJSON方法
2021/05/14 jQuery
Feign调用传输文件异常的解决
2021/06/24 Java/Android