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各类图像库的图片读写方式总结(推荐)
Feb 23 Python
python matplotlib绘图,修改坐标轴刻度为文字的实例
May 25 Python
Python装饰器的执行过程实例分析
Jun 04 Python
浅谈Tensorflow由于版本问题出现的几种错误及解决方法
Jun 13 Python
numpy数组之存取文件的实现示例
May 24 Python
python3实现从kafka获取数据,并解析为json格式,写入到mysql中
Dec 23 Python
python列表推导和生成器表达式知识点总结
Jan 10 Python
Django之choices选项和富文本编辑器的使用详解
Apr 01 Python
python如何支持并发方法详解
Jul 25 Python
弄清Pytorch显存的分配机制
Dec 10 Python
Python制作运行进度条的实现效果(代码运行不无聊)
Feb 24 Python
python中sys模块的介绍与实例
Apr 17 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
WIN98下Apache1.3.14+PHP4.0.4的安装
2006/10/09 PHP
php self,$this,const,static,-&amp;gt;的使用
2009/10/22 PHP
php模块memcache和memcached区别分析
2011/06/14 PHP
php接口和抽象类使用示例详解
2014/03/02 PHP
常用PHP框架功能对照表
2014/10/23 PHP
php脚本守护进程原理与实现方法详解
2017/07/20 PHP
php 多继承的几种常见实现方法示例
2019/11/18 PHP
Javascript YUI 读码日记之 YAHOO.util.Dom - Part.2 0
2008/03/22 Javascript
javascript实现上传图片并预览的效果实现代码
2011/04/11 Javascript
自己动手制作jquery插件之自动添加删除行功能介绍
2011/10/14 Javascript
JS中的public和private对象,即static修饰符
2012/01/18 Javascript
JS组件中bootstrap multiselect两大组件较量
2016/01/26 Javascript
JS去除空格和换行的正则表达式(推荐)
2016/06/14 Javascript
React实现双向绑定示例代码
2016/09/19 Javascript
详谈js遍历集合(Array,Map,Set)
2017/04/06 Javascript
微信小程序实现漂亮的弹窗效果
2020/05/26 Javascript
JS桶排序的简单理解与实现方法示例
2019/11/25 Javascript
闭包在python中的应用之translate和maketrans用法详解
2014/08/27 Python
再谈Python中的字符串与字符编码(推荐)
2016/12/14 Python
python2和python3应该学哪个(python3.6与python3.7的选择)
2019/10/01 Python
完美解决TensorFlow和Keras大数据量内存溢出的问题
2020/07/03 Python
Python Tkinter实例——模拟掷骰子
2020/10/24 Python
使用html5实现表格实现标题合并的实例代码
2019/05/13 HTML / CSS
卡骆驰英国官网:Crocs英国
2019/08/22 全球购物
JSF面试题:Jsf中的核心类用那些?有什么作用?LiftCycle六大生命周期是什么?
2014/07/17 面试题
.net工程师笔试题
2012/06/09 面试题
string = null 和string = ''的区别
2013/04/28 面试题
电话销售经理岗位职责
2013/12/07 职场文书
爱情保证书范文
2014/02/01 职场文书
春节联欢晚会主持词范文
2014/03/24 职场文书
厉行勤俭节约倡议书
2014/05/16 职场文书
本科生就业推荐信
2014/05/19 职场文书
遵纪守法演讲稿
2014/05/23 职场文书
话题作文之诚信
2019/11/28 职场文书
python中的3种定义类方法
2021/11/27 Python
SQL Server远程连接的设置步骤(图文)
2022/03/23 SQL Server