β

基于小波变换的时间序列降噪

奇虎360-addops 116 阅读

0x00 背景

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

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

0x01 小波去噪的基本原理

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

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

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

  1. 选择合适的正交小波基和分解层数j,对含噪信号进行小波变换分解到j层;

  2. 对分解得到的小波系数进行阈值处理,可以使用两种处理方法:硬阈值和软阈值法。

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

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

0x02 Matlab 实现一维小波降噪

常用库函数

降噪效果

image

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

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

作者:奇虎360-addops
应用运维|运维开发|opsdev|addops|虚拟化|openstack|docker|容器化|k8s|智能运维
原文地址:基于小波变换的时间序列降噪, 感谢原作者分享。

发表评论