均值滤波器

均值滤波器是一种使用频次较高的线性滤波器。它的实现原理很简单,就是指定一个长度大小为奇数的窗口,使用窗口中所有数据的平均值来替换中间位置的值,然后平移该窗口,平移步长为 1,继续重复上述操作,直至滑动到时序数据的末尾,如此一来,对时序数据的过滤操作就结束了。均值滤波器的思路简单,计算速度快,但是它容易被窗口中的极值点或者峰值所左右,不能很好地保留序列的边缘信息,在去噪的同时也对数据信号的细节特征产生了一定的破坏,不能很好地去除噪声点,这极大地影响了模型的预测精度。
均值滤波的公式

其中,m表示窗口大小,xi表示窗口中的第 i个数据,x表示窗口中所有数据的均值。
python代码实现均值滤波
  1. # 1. 均值滤波函数
  2. def moving_average(data, window=5):
  3. size = window - 1
  4. arr_value = list(data.values)
  5. fill_left = arr_value[0]
  6. for i in range(size):
  7. arr_value.insert(0, fill_left)
  8. dat = pd.Series(arr_value)
  9. dat_roll = dat.rolling(window).mean()
  10. return dat_roll.dropna().reset_index(drop=True)

具体应用到数据上:高频数据未完全拟合,其他数据也与源数据拟合程度一般

中值滤波器

中值滤波是一种非线性的滤波算法,它是将指定长度大小为奇数的窗口中的所有数据按从小到大的顺序进行排列,并将排好序的数据的中值取代窗口中间的值。中值滤波克服了均值滤波所存在的问题,对窗口中的极端值不敏感,从而可以有效保留区域中的边缘信息,并且能有效抑制椒盐噪声和脉冲噪声,避免细节特征的丢失。但是,在面对均匀分布的高斯噪声时,它表现很差。
中值滤波的公式见式

具体的python实现代码如下:

  1. # 2. 中值滤波函数
  2. def median_filter(data: pd.Series, window=5):
  3. return pd.Series(scipy.signal.medfilt(data, window))

应用到数据上:中值滤波将高频拟合,其他数据也与源数据拟合程度一般

SG滤波器

对曲线进行平滑处理,通过Savitzky-Golay 滤波器,可以在scipy库里直接调用,不需要再定义函数。

python代码实现:

  1. from scipy.signal import savgol_filter
  2. # 3. Savitzky-Golay滤波函数
  3. newans = savgol_filter(data, 5, 3, mode= 'nearest')
  4.  
  5. plt.plot(index,data,label='源网络流量',color='r',linestyle='-',marker='*')
  6. plt.plot(index,newans,label='SG滤波网络流量',color='b')#添加linestyle设置线条类型
  7. plt.legend()
  8. plt.show()

# 备注:
data:代表曲线点坐标(x,y)中的y值数组
window_length:窗口长度,该值需为正奇整数。例如:此处取值5
k值:polyorder为对窗口内的数据点进行k阶多项式拟合,k的值需要小于window_length。例如:此处取值3
mode:确定了要应用滤波器的填充信号的扩展类型。(This determines the type of extension to use for the padded signal to which the filter is applied. )

python原理手写代码实现:

  1. # 3. Savitzky-Golay滤波函数
  2. """
  3. data - list格式的1×n纬数据
  4. window_size - 拟合的窗口大小
  5. rank - 拟合多项式阶次
  6. ndata - 修正后的值
  7. """
  8. def savgol(data: list, window_size: int, rank: int):
  9. m = int((window_size - 1) / 2)
  10. odata = data[:]
  11. # 处理边缘数据,首尾增加m个首尾项
  12. for i in range(m):
  13. odata.insert(0, odata[0])
  14. odata.insert(len(odata), odata[len(odata)-1])
  15. # 创建X矩阵
  16. x = create_x(m, rank)
  17. # 计算加权系数矩阵B
  18. b = (x * (x.T * x).I) * x.T
  19. a0 = b[m]
  20. a0 = a0.T
  21. # 计算平滑修正后的值
  22. ndata = []
  23. for i in range(len(data)):
  24. y = [odata[i + j] for j in range(window_size)]
  25. y1 = np.mat(y) * a0
  26. y1 = float(y1)
  27. ndata.append(y1)
  28. return ndata
  29.  
  30. """
  31. 创建系数矩阵X
  32. size - 2×size+1 = window_size
  33. rank - 拟合多项式阶次
  34. x - 创建的系数矩阵
  35. """
  36. def create_x(size, rank):
  37. x = []
  38. for i in range(2 * size + 1):
  39. m = i - size
  40. row = [m**j for j in range(rank)]
  41. x.append(row)
  42. x = np.mat(x)
  43. return x
  44.  
  45. newans = savgol(list(data), 5, 3)
  46.  
  47. plt.plot(index,data,label='源网络流量',color='r',linestyle='-',marker='*')
  48. plt.plot(index,newans,label='SG滤波网络流量',color='b')#添加linestyle设置线条类型
  49. plt.legend()
  50. plt.show()

应用到数据上效果:此图更加接近源曲线,并且将高频部分进行平滑处理,拟合低频部分

数据平滑处理-均值|中值|Savitzky-Golay滤波器的更多相关文章

  1. OpenCV笔记(1)(图片读取与现实、色彩空间、基础运算、均值方差、逻辑运算、泛洪填充、均值中值及自定义平滑)

    一.图片读取和显示 import cv2 as cv # 图片读取cv.imread(img_path) car_img = cv.imread("car1.png") # 图片显 ...

  2. java实现中值滤波均值滤波拉普拉斯滤波

    目录 来对下面的图像滤波,其实就是对各个像素点进行数学运算的过程 均值滤波 中值滤波 拉普拉斯滤波 Sobel滤波 注意 来对下面的图像滤波,其实就是对各个像素点进行数学运算的过程 均值滤波 均值滤波 ...

  3. verilog 实现中值滤波

    图像信号在形成.传输和记录的过程中,由于成像系统.传输介质.工作环境和记录设备等的固有缺陷,不可避免地产生各种类型的噪声,降低了图像的质量,进而影响后续处理(如边缘检测.图像分割.特征提取.模式识别等 ...

  4. 机器学习进阶-阈值与平滑-图像平滑操作(去噪操作) 1. cv2.blur(均值滤波) 2.cv2.boxfilter(方框滤波) 3. cv2.Guassiannblur(进行高斯滤波) 4. cv2.medianBlur(进行中值滤波)

    1.cv2.blur(img, (3, 3))  进行均值滤波 参数说明:img表示输入的图片, (3, 3) 表示进行均值滤波的方框大小 2. cv2.boxfilter(img, -1, (3, ...

  5. 基于MATLAB的中值滤波均值滤波以及高斯滤波的实现

    基于MATLAB的中值滤波均值滤波以及高斯滤波的实现 作者:lee神 1.   背景知识 中值滤波法是一种非线性平滑技术,它将每一像素点的灰度值设置为该点某邻域窗口内的所有像素点灰度值的中值. 中值滤 ...

  6. matlab中fspecial Create predefined 2-D filter以及中值滤波均值滤波以及高斯滤波

    来源: 1.https://ww2.mathworks.cn/help/images/ref/fspecial.html?searchHighlight=fspecial&s_tid=doc_ ...

  7. OpenCV计算机视觉学习(4)——图像平滑处理(均值滤波,高斯滤波,中值滤波,双边滤波)

    如果需要处理的原图及代码,请移步小编的GitHub地址 传送门:请点击我 如果点击有误:https://github.com/LeBron-Jian/ComputerVisionPractice &q ...

  8. Atitit   图像处理 平滑 也称 模糊, 归一化块滤波、高斯滤波、中值滤波、双边滤波)

    Atitit   图像处理 平滑 也称 模糊, 归一化块滤波.高斯滤波.中值滤波.双边滤波) 是一项简单且使用频率很高的图像处理方法 用途 去噪 去雾 各种线性滤波器对图像进行平滑处理,相关OpenC ...

  9. OpenCv高斯,中值,均值,双边滤波

    #include "cv.h" #include "highgui.h" #include <iostream> using namespace s ...

随机推荐

  1. 【记录一个问题】运算迁移到gpu后的计时问题

    我把部分计算迁移到GPU后,发现以帧率计算的程序,帧率下降:但是看各个函数的时间,又比之前减少了. 很奇怪,既然各个函数的时间减少,为什么帧率反而下降? 原来计算帧率使用了 gettimeofday( ...

  2. zookeeper,kafka,redis等分布式框架的主从同步策略

    1 zookeeper选主机制 1.1 LeaderElection选举算法 选举线程由当前Server发起选举的线程担任,他主要的功能对投票结果进行统计,并选出推荐的Server.选举线程首先向所有 ...

  3. Windows和Linux关闭占用端口

    关闭端口的方式有很多种,但是常用的就是这种比较来的快一点 如果通过以下方式解决不了,可以通过关闭服务来解决 Windows 1.查看端口占用的进程 netstat -ano | findstr 800 ...

  4. Servlet-ServletConfig类使用介绍

    ServletConfig类(Servlet程序的配置信息类) Servlet 程序和 ServletConfig对象都是由 Tomcat负责创建,我们负责使用. Servlet 程序默认是第一次访问 ...

  5. 使用Xamarin开发移动应用示例——数独游戏(二)创建游戏界面

    在本系列第一部分,我们创建了程序框架,现在我们创建游戏的界面,项目代码可以从Github下载:https://github.com/zhenl/ZL.Shudu .代码随项目进度更新. 首先在View ...

  6. python19day

    内容回顾 软件开发规范 预计 递归函数1天 re模块2天 logging模块+包的导入+带参数的装饰器1-2天 面向对象6天 网络编程4天 并发编程5-6天 数据库5天 今日内容 模块和实际工作之间的 ...

  7. JavaScript之最长回文字符串

    JavaScript经典面试题算法:最长回文字符串 下面的解题方法是通过中心扩散法的方式实现的,具体代码和注释如下(时间复杂度: O(n^2),空间复杂度:O(1)) // str字符串functio ...

  8. 关于diffing算法中key的使用

    在vue和react中(只学了这两个),经常需要渲染元素到DOM上,而且如果不写key,有的浏览器会进行报错或者进行提示. 在我的理解里:key其实就是一个身份的标识,证明这个位置坐的就是这个人.后期 ...

  9. CSS样式表的书写位置

    行内式(内联样式) 是通过标签的style属性来设置元素的样式,其基本语法格式如下: <标签名 style="属性1:属性值1; 属性2:属性值2; 属性3:属性值3;"&g ...

  10. MySQL MHA 高可用集群部署及故障切换

    MySQL MHA 高可用集群部署及故障切换 1.概念 2.搭建MySQL + MHA 1.概念: a)MHA概念 : MHA(MasterHigh Availability)是一套优秀的MySQL高 ...