Time Series Noise Reduction Based on Wavelet Transform

栏目: 编程工具 · 发布时间: 5年前

内容简介:由于生产环境中各类因素的影响,使得监控数据特别是时间序列数据里存在许多噪声。这些噪声严重影响了进一步的定量分析和数据挖掘,有必要预先去噪。但是时间序列本身具有非线性和信噪比高的特点,采用传统的高斯去噪、中值滤波等方法往往存在诸多缺陷。而小波理论是根据时频局部化的要求而发展起来的,具有自适应和数学显微镜性质,特别适合非平稳、非线性信号的处理。关于小波变换数学推导详见

由于生产环境中各类因素的影响,使得监控数据特别是时间序列数据里存在许多噪声。这些噪声严重影响了进一步的定量分析和数据挖掘,有必要预先去噪。

但是时间序列本身具有非线性和信噪比高的特点,采用传统的高斯去噪、中值滤波等方法往往存在诸多缺陷。而小波理论是根据时频局部化的要求而发展起来的,具有自适应和数学显微镜性质,特别适合非平稳、非线性信号的处理。

0x01 小波去噪的基本原理

关于小波变换数学推导详见 Wavelet

小波顾名思义就是一个很小的波,其积分大概为0,小波按照形状种类分为六种。小波分解个人觉得类似于傅里叶变换,就是将已有的波分解为很多个可以小的波形。

时间序列去噪采用的较广泛的方法为非线性阈值处理法,其原理是通过小波变换后有用信号的能量集中于少数小波系数上,而白噪声在小波变换域上仍然分散在大量小波系数之上。因而相对来说,有用信号的小波系数值必然大于那些能量分散且幅值较小的噪声的小波系数值。因此,从频谱的幅度上看,有用信号和噪声可以实现分离。该方法主要步骤为:

  1. 选择合适的正交小波基和分解层数j,对含噪信号进行小波变换分解到j层;
  2. 对分解得到的小波系数进行阈值处理,可以使用两种处理方法:硬阈值和软阈值法。

硬阈值法保留较大的小波系数并将较小的小波系数置零;软阈值法将较小的小波系数置零,而对较大的小波系数向零收缩。根据相关推导证明了软阈值法去噪后的估计信号是原始信号的近似最优估计,并且具有更广泛的适用性。

关于分解层数的问题,根据多分辨率分析理论,高层分解的小波系数对应的是低频部分,而低频部分主要由信号构成。因此分解层次越高,去掉的低频成分越多,去噪效果越明显,但失真度也增大。为保守起见,分解层次不宜太高,最大不超过5层。对波动性更强的序列如CPU-time序列,一般不超过4层。根据我这段时间对线上时间序列监控数据的实践来讲,基于db4小波函数分解到3-4层可以取得不错的效果。

0x02 Matlab 实现一维小波降噪

Time Series Noise Reduction Based on Wavelet Transform

从上图中可以看出,小波降噪的效果还是比较理想的。

Matlab代码

clc; 
clear; 
% 获取噪声信号 
S=importdata('data_0391');
sig = S(1:1400);

% 信号的分解 
[c,l]=wavedec(sig,4,'db4');
 
%提取四层细节分量和近似分量
a1=appcoef(c,l,'db4',1);
d1=detcoef(c,l,1);
a2=appcoef(c,l,'db4',2);
d2=detcoef(c,l,2);
a3=appcoef(c,l,'db4',3);
d3=detcoef(c,l,3);
a4=appcoef(c,l,'db4',4);
d4=detcoef(c,l,4);
 
% 重构小波分解向量,其中第一、二层的细节分量被置零
dd1=zeros(size(d1));
dd2=zeros(size(d2)); 
c1=[a4 d4 d3 dd2 dd1];
aa1=waverec(c1,l,'db4');
 
% 作图 
subplot(211), 
plot(sig), title('原始噪声信号'); 
plot(212)
plot(aa1,'b')
title('1&2层的细节分量置零后的重构信号')
```

0x03 Python 实现一维小波降噪

pyWavelet 的主要特点:

  1. 类似 Matlab Wavelet Toolbox 的使用;
  2. 1D, 2D 正反离散小波变换;
  3. 70 多个内置小波滤波器。

Python 代码

import pywt

# 小波滤噪
def wavelet_denoising(data):
 # 小波函数取db4
 db4 = pywt.Wavelet('db4')
 if type(data) is not types.NoneType:
 # 分解
 coeffs = pywt.wavedec(data, db4)
 # 高频系数置零
 coeffs[len(coeffs)-1] *= 0
 coeffs[len(coeffs)-2] *= 0
 # 重构
 meta = pywt.waverec(coeffs, db4)
 return meta

参考文献

[1] https://www.wikiwand.com/en/Wavelet  [2] https://www.kancloud.cn/digest/imageproebow/122469  [3] https://pywavelets.readthedocs.io/en/latest/  [4] https://github.com/PyWavelets/pywt

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

运营制胜

运营制胜

张恒 / 电子工业出版社 / 2016-10-1 / 65

《运营制胜——从零系统学运营构建用户增长引擎》主要从内容运营、用户运营、推广运营三个方向来介绍产品运营方面的知识。 其中内容运营主要介绍了内容生成的机制、内容方向设定、内容输出、内容生产引擎、内容推荐机制、数据如何驱动内容运营、内容运营的KPI 设定、建立内容库、内容的赢利模式。用户运营主要介绍了产品的冷启动、获得种子用户及早期用户、建立用户增长引擎、利用心理学引爆产品用户增长、增加用户活跃......一起来看看 《运营制胜》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

URL 编码/解码
URL 编码/解码

URL 编码/解码

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换