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 相关文章推荐
pyqt4教程之实现半透明的天气预报界面示例
Mar 02 Python
python字典排序实例详解
May 20 Python
Python模拟鼠标点击实现方法(将通过实例自动化模拟在360浏览器中自动搜索python)
Aug 23 Python
Python实现EXCEL表格的排序功能示例
Jun 25 Python
Python pip替换为阿里源的方法步骤
Jul 02 Python
对django views中 request, response的常用操作详解
Jul 17 Python
matplotlib实现显示伪彩色图像及色度条
Dec 07 Python
opencv+python实现鼠标点击图像,输出该点的RGB和HSV值
Jun 02 Python
Python-openCV开运算实例
Jul 05 Python
基于python实现监听Rabbitmq系统日志代码示例
Nov 28 Python
Django项目在pycharm新建的步骤方法
Mar 02 Python
pytorch锁死在dataloader(训练时卡死)
May 28 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
WordPress中获取所使用的模板的页面ID的简单方法
2015/12/31 PHP
thinkphp5.0整合phpsocketio完整攻略(绕坑)
2018/10/12 PHP
laravel 解决Eloquent ORM的save方法无法插入数据的问题
2019/10/21 PHP
图片上传即时显示缩略图的js代码
2009/05/27 Javascript
JS 面向对象的5钟写法
2009/07/31 Javascript
Array, Array Constructor, for in loop, typeof, instanceOf
2011/09/13 Javascript
JS实现程序暂停与继续功能代码解读
2013/10/10 Javascript
jquery日历控件实现方法分享
2014/03/07 Javascript
JS实现点击按钮自动增加一个单元格的方法
2015/03/09 Javascript
纯js代码制作的网页时钟特效【附实例】
2016/03/30 Javascript
JavaScript实现简单的拖动效果
2016/07/02 Javascript
Angular路由简单学习
2016/12/26 Javascript
vue-router 学习快速入门
2017/03/01 Javascript
js实现拖拽上传图片功能
2017/08/01 Javascript
JS二分查找算法详解
2017/11/01 Javascript
node.js的Express服务器基本使用教程
2019/01/09 Javascript
react组件从搭建脚手架到在npm发布的步骤实现
2019/01/09 Javascript
Vue.extend 编程式插入组件的实现
2019/11/18 Javascript
浅析python递归函数和河内塔问题
2017/04/18 Python
python基于twisted框架编写简单聊天室
2018/01/02 Python
PyCharm安装第三方库如Requests的图文教程
2018/05/18 Python
python3实现微型的web服务器
2019/09/03 Python
Python可以实现栈的结构吗
2020/05/27 Python
Python操作Elasticsearch处理timeout超时
2020/07/17 Python
导出HTML5 Canvas图片并上传服务器功能
2019/08/16 HTML / CSS
Perry Ellis官网:美国男士品味服装
2016/12/09 全球购物
PHP经典面试题
2016/09/03 面试题
办公室副主任岗位职责
2013/11/25 职场文书
中学生运动会入场词
2014/02/12 职场文书
驻村工作先进事迹
2014/08/14 职场文书
贫困证明模板(3篇)
2014/09/16 职场文书
2014年个人售房协议书
2014/10/30 职场文书
2014年小学工作总结
2014/11/26 职场文书
雨雪天气温馨提示
2015/07/15 职场文书
如何将numpy二维数组中的np.nan值替换为指定的值
2021/05/14 Python
Android使用EventBus发送消息,Fragment中接收消息的方法会执行多次
2022/04/24 Java/Android