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之Import 模块
Oct 13 Python
Python3中多线程编程的队列运作示例
Apr 16 Python
用Python进行TCP网络编程的教程
Apr 29 Python
用Python中的字典来处理索引统计的方法
May 05 Python
Python3中exp()函数用法分析
Feb 19 Python
举例讲解Python常用模块
Mar 08 Python
Windows系统Python直接调用C++ DLL的方法
Aug 01 Python
python+selenium 鼠标事件操作方法
Aug 24 Python
python 中的命名空间,你真的了解吗?
Aug 19 Python
如何在Anaconda中打开python自带idle
Sep 21 Python
Python字典实现伪切片功能
Oct 28 Python
Python实现PIL图像处理库绘制国际象棋棋盘
Jul 16 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异步调用socket实现代码
2012/01/12 PHP
PHP实现多维数组转字符串和多维数组转一维数组的方法
2015/08/08 PHP
PHP邮件群发机实现代码
2016/02/16 PHP
文本框根据输入内容自适应高度的代码
2011/10/24 Javascript
深入分析js中的constructor和prototype
2012/04/07 Javascript
jQuery 的全选(全非选)即取得被选中的值使用介绍
2013/11/12 Javascript
js 点击页面其他地方关闭弹出层(示例代码)
2013/12/24 Javascript
jQuery基础语法实例入门
2014/12/23 Javascript
JavaScript 异常处理 详解
2015/02/06 Javascript
php利用curl获取远程图片实现方法
2015/10/26 Javascript
详解JavaScript的AngularJS框架中的表达式与指令
2016/03/05 Javascript
全面接触神奇的Bootstrap导航条实战篇
2016/08/01 Javascript
jQuery使用DataTable实现删除数据后重新加载功能
2017/02/27 Javascript
详解在Angularjs中ui-sref和$state.go如何传递参数
2017/04/24 Javascript
VUE element-ui 写个复用Table组件的示例代码
2017/11/18 Javascript
JS动态添加元素及绑定事件造成程序重复执行解决
2017/12/07 Javascript
webpack优化的深入理解
2018/12/10 Javascript
详解element-ui 表单校验 Rules 配置 常用黑科技
2020/07/11 Javascript
python下paramiko模块实现ssh连接登录Linux服务器
2015/06/03 Python
详谈Numpy中数组重塑、合并与拆分方法
2018/04/17 Python
python调用c++ ctype list传数组或者返回数组的方法
2019/02/13 Python
Pyinstaller打包.py生成.exe的方法和报错总结
2019/04/02 Python
使用Python的datetime库处理时间(RPA流程)
2019/11/24 Python
python使用HTMLTestRunner导出饼图分析报告的方法
2019/12/30 Python
python tkinter之 复选、文本、下拉的实现
2020/03/04 Python
Django使用Profile扩展User模块方式
2020/05/14 Python
Keras自定义IOU方式
2020/06/10 Python
Python 实现键盘鼠标按键模拟
2020/11/18 Python
css3实现的下拉菜单效果示例
2014/01/22 HTML / CSS
HTML5无刷新改变当前url的代码
2017/03/15 HTML / CSS
微信小程序之html5 canvas绘图并保存到系统相册
2019/06/20 HTML / CSS
吉列剃须刀美国官网:Gillette美国
2018/07/13 全球购物
美国领先的眼镜和太阳镜在线零售商:Glasses.com
2019/08/26 全球购物
基层党建工作汇报材料
2014/08/15 职场文书
中学生2014国庆节演讲稿:不屈的民族
2014/09/21 职场文书
CentOS7设置ssh服务以及端口修改方式
2022/12/24 Servers