,,基于Numpy.convolve使用Python实现滑动平均滤波的思路详解

,,基于Numpy.convolve使用Python实现滑动平均滤波的思路详解

本文主要介绍了移动平均滤波的Python极简实现(基于Numpy.convolve)的知识,很不错,有一定的参考价值。有需要的朋友可以参考一下。

1.滑动平均概念

滑动平均滤波法(也称递归平均滤波法),当取N个连续的采样值作为一个队列时,队列的长度固定为N,每采样一个新的数据就放在队列的末尾,队列头的原始数据被扔掉。(先进先出原则)通过对队列中的N个数据进行算术平均,可以得到新的滤波结果。n的选择:流量,n=12压力:n=4;液位,n=4 ~ 12温度,N=1~4

优点:对周期性干扰抑制效果好,平滑度高,适用于高频振荡系统。

缺点:灵敏度低,对偶发性脉冲干扰抑制效果差,难以消除脉冲干扰造成的采样值偏差。不适合脉冲干扰严重的场合,浪费RAM。

2.解决思路

可以发现,滑动平均滤波法的计算与一维卷积的工作原理非常相似,滑动平均n对应的是一维卷积核的大小(长度)。

步长会有一些差异。滑动平均滤波方法的滑动步长为1,而一维卷积步长可以自定义。另一个区别是一维卷积的核参数需要更新迭代,而滑动平均滤波方法的核参数都是一个。

我们应该如何利用这种相似性呢?其实也很简单。只要让一维卷积核的大小(长度)等于N,设置步长为1,所有的核参数初始都是1。因为一维卷积速度快,那么我们就可以用一维卷积来实现这个功能,速度快,效率高。

用深度学习框架来实现这个功能是不是大材小用?大材小用了,因为这里用的卷积的核参数不需要更新。其实没必要用复杂的深度学习框架。如果能在Numpy中实现这些功能,那就更简单方便了。

去做吧。经过搜索,我们发现Numpy.convolve可以实现我们想要的功能。

3.Numpy.convolve介绍

numpy.convolve(a,v,mode='full ')

参数:

A:(N,)一维输入数组

V:(M,)输入的第二个一维数组

模式:{ '完整','有效','相同' }参数是可选的。

默认值“完整”,返回每个卷积的值。长度为NM-1。在卷积的边缘,信号不重叠,存在边际效应。

' ' same '返回的数组长度是max(M,N),边际效应依然存在。

由“valid”返回的数组的长度是max(M,N)-min(M,N) 1,在这种情况下,它返回完全重叠的点。边缘的点无效。

类似于一维卷积参数,A是卷积数据,V是卷积核大小。

4.算法实现

def np_move_avg(a,n,mode='same '):

return(np.convolve(a,np.ones((n,)/n,mode=mode))

原理说明

移动平均是卷积数学运算的一个例子。对于运行平均值,沿输入滑动窗口并计算窗口内容的平均值。对于离散1D信号,卷积是相同的,只是不是计算任何线性组合的平均值,而是将每个元素乘以相应的系数,并将结果相加。这些系数,窗口中的每个位置一个,有时被称为卷积核。现在,n值的算术平均值是(x_1 x_2.x_N)/N,所以对应的核是(1/N,1/N,1/N),这正是我们用NP得到的。个((n,))/n。

边缘处理

此模式的参数np.convolve指定如何处理边。这里选择了相同的模式,可以保证一个输出长度,但是你可能有其他的优先级。这张图说明了模式之间的差异:

将numpy作为np导入

将matplotlib.pyplot作为plt导入

def np_move_avg(a,n,mode='same '):

return(np.convolve(a,np.ones((n,)/n,mode=mode))

modes=['完整','相同','有效']

对于模式中的m:

PLT . plot(NP _ move _ avg(NP . ones((200,)),50,mode=m));

plt.axis([-10,251,-.1,1.1]);

plt.legend(modes,loc=' lower center ');

plt.show()

5.参考

1.https://stack overflow . com/questions/13728392/移动平均线或移动平均数

总结

以上是边肖介绍的Python实现滑动平均滤波的思想的详细说明(基于Numpy.convolve)。希望对你有帮助。如果您有任何问题,请给我留言,边肖将及时回复您!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: