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闭包及其作用域详解
Aug 28 Python
利用python 更新ssh 远程代码 操作远程服务器的实现代码
Feb 08 Python
python用列表生成式写嵌套循环的方法
Nov 08 Python
pyinstaller打包单个exe后无法执行错误的解决方法
Jun 21 Python
PyCharm安装Markdown插件的两种方法
Jun 24 Python
django序列化serializers过程解析
Dec 14 Python
tensorflow入门:tfrecord 和tf.data.TFRecordDataset的使用
Jan 20 Python
scrapy框架携带cookie访问淘宝购物车功能的实现代码
Jul 07 Python
python如何提升爬虫效率
Sep 27 Python
python opencv将多个图放在一个窗口的实例详解
Feb 28 Python
python模拟浏览器 使用selenium进入好友QQ空间并留言
Apr 12 Python
python创建字典及相关管理操作
Apr 13 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
ThinkPHP中关联查询实例
2014/12/02 PHP
jquer之ajaxQueue简单实现代码
2011/09/15 Javascript
《JavaScript高级程序设计》阅读笔记(三) ECMAScript中的引用类型
2012/02/27 Javascript
js使浏览器窗口最大化实现代码(适用于IE)
2013/08/07 Javascript
Jquery中Event对象属性小结
2015/02/27 Javascript
JavaScript中神奇的call()方法
2015/03/12 Javascript
JS获取表格内指定单元格html内容的方法
2015/03/31 Javascript
JavaScript中调用函数的4种方式代码实例
2015/07/08 Javascript
jQuery实现图片左右滚动特效
2020/04/20 Javascript
Webpack 实现 AngularJS 的延迟加载
2016/03/02 Javascript
AngularJS入门之动画
2016/07/27 Javascript
AngularJS 作用域详解及示例代码
2016/08/17 Javascript
JavaScript基于activexobject连接远程数据库SQL Server 2014的方法
2017/07/12 Javascript
原生JavaScript来实现对dom元素class的操作方法(推荐)
2017/08/16 Javascript
使用Vue-Router 2实现路由功能实例详解
2017/11/14 Javascript
JS实现的哈夫曼编码示例【原始版与修改版】
2018/04/22 Javascript
原生JS实现的简单轮播图功能【适合新手】
2018/08/17 Javascript
VUE 直接通过JS 修改html对象的值导致没有更新到数据中解决方法分析
2019/12/02 Javascript
webpack4从0搭建组件库的实现
2020/11/29 Javascript
Python实例一个类背后发生了什么
2016/02/09 Python
解决python写入mysql中datetime类型遇到的问题
2018/06/21 Python
对python中Json与object转化的方法详解
2018/12/31 Python
Python代码使用 Pyftpdlib实现FTP服务器功能
2019/07/22 Python
python pygame实现挡板弹球游戏
2019/11/25 Python
python制作一个简单的gui 数据库查询界面
2020/11/19 Python
python3中确保枚举值代码分析
2020/12/02 Python
会走动的图形html5时钟示例
2014/04/27 HTML / CSS
英语专业学子个人的自我评价
2013/10/02 职场文书
建筑实习自我鉴定
2013/10/18 职场文书
中国梦主题教育活动总结
2014/05/05 职场文书
小学公民道德宣传日活动总结
2015/03/23 职场文书
趣味运动会标语口号
2015/12/26 职场文书
vue组件的路由高亮问题解决方法
2021/05/11 Vue.js
SqlServer数据库远程连接案例教程
2021/07/15 SQL Server
关于python类SortedList详解
2021/09/04 Python
Java死锁的排查
2022/05/11 Java/Android