本文讲解一篇关于小波变换在机器学习中的应用的博客:《A guide for using the Wavelet Transform in Machine Learning》,极力推荐!!目录如下:

787f408610e90b9fad7884e54b9f6eb5.png

链接:http://ataspinar.com/2018/12/21/a-guide-for-using-the-wavelet-transform-in-machine-learning/1、引言

信号处理技术(比如傅里叶变换、小波变换等)可以用在时间序列分类的任务中。傅里叶变换可以将一个信号从时域变换到频域,频谱中的峰值对应着信号中最常出现的频率。在频谱中,峰值的位置(频率值)和高度(幅度值)可以作为分类器的输入。

傅里叶变换在很多分类问题中都表现得很好。通常情况下,只有当频谱是静态的时候,使用傅里叶变换才可行。信号越是非静态,傅里叶变换产生的结果就越差。然而,大多数实际问题中的信号都是非静态的,用于分析非静态信号的一种更好的方法是小波变换。

在这篇博客中,我们会稍微涉及一些小波变换的理论,以及如何将其应用在实际问题中,并且每一步都提供了相应的代码以方便理解。

2.1 从傅里叶变换到小波变换

傅里叶变换的工作原理是:将信号与一系列不同频率的sin波函数相乘,再进行积分。傅里叶变换在频域上有较高的分辨率,在时域上的分辨率为0。也就是说,傅里叶变换能够清楚地告诉我们信号中存在什么样的频率,但是不知道这些频率发生在什么时刻。

96a4ff52750507c29cd52c2e8f0b7ca6.png

两个信号的频谱一致,但是在时域上却不大不相同。傅里叶变换不能告诉我们关于频率发生的时刻。

为了解决傅里叶变换在处理非静态信号时的问题,短时傅里叶变换被提出来。短时傅里叶利用滑动窗口将信号等分成相同长度的区间(可以有重叠的区域),然后分别对这些区间进行傅里叶变换。但是,短时傅里叶变换存在分辨率的问题:若区间长度较小,则很容易知道频率发生在什么时刻,但是频率的信息则较少;如果区间长度较大,则很容易知道信号中存在什么样的频率,但是对于频率发生的时刻则较为模糊。

一种更好的方法便是小波变换。小波变换在频域和时域都具有较高的分辨率,不仅能告诉我们信号中存在什么样的频率,也能告诉我们这些频率发生在哪些时刻。

6ba08098c1f75abb97b3bfeac831040f.png

上图给出了四种方法的时域和频域的分辨率。原始时间序列的时间分辨率较好,但是频率分辨率为0;傅里叶变换的时间分辨率为0,但是频率分辨率较好;短时傅里叶变换的时间分辨率和频率分辨率都是固定不变的;小波变换在低频区域有较好的频率分辨率,但是时间分辨率较差,而在高频区域有较好的时间分辨率,但是频率分辨率较差。
In other words, the Wavelet Transforms makes a trade-off; at scales in which time-dependent features are interesting, it has a high resolution in the time-domain andat scales in which frequency-dependent features are interesting, it has a high resolution in the frequency domain.
2.2 小波变换的工作原理傅里叶变换使用一系列不同频率的sin波函数来分析信号。也就是说,信号可以表达成sin波函数的线性组合。小波变换用的是一系列的小波函数,每个小波函数都有不同的尺度因子。

35cb4ae626b7e1aff81ab92a926d0591.png

sin波函数与小波函数的主要区别在于:sin波函数不能在时间轴上定位(因为它是从负无穷一直到正无穷),但是小波变换却可以在时间上定位,这就使得小波变换既可以提供时域上的信息,也可以提供频域上的信息。由于小波函数可以在时间轴上定位,我们可以将信号与不同时间轴位置上的小波函数相乘。该过程从信号开始,并缓慢移动到信号结束【是一种卷积操作】。然后,我们可以改变小波函数的尺度因子,重复上述过程。

12cd80ff0416edbbb15f70fd8bdebcee.png

dbf6235733d36541c0d69a5d7848c98a.png

1维信号的小波变换有两个维度,也就是时间-尺度图。傅里叶变换中常用频率的概念,而小波变换中常用尺度的概念。两者之间成反比关系。2.3 不同类型的小波

傅里叶变换与小波变换的另一个区别在于小波变换有许多类型的小波函数。不同类型的小波函数的形状不一样,因此我们可以选择与我们想在信号中寻找的特征最匹配的那个小波函数。

PyWavelets函数库包含了14种母小波函数。

import pywtprint(pywt.families(short=False))['Haar', 'Daubechies', 'Symlets', 'Coiflets', 'Biorthogonal', 'Reverse biorthogonal', 'Discrete Meyer (FIR Approximation)', 'Gaussian', 'Mexican hat wavelet', 'Morlet wavelet', 'Complex Gaussian wavelets', 'Shannon wavelets', 'Frequency B-Spline wavelets', 'Complex Morlet wavelets'
85869f7282f85d4565ea8fa16e2be35a.png

小波函数只需要满足两个数学条件,因此很容易找到符合条件的小波函数:1)有限能量;2)零均值。每一种类型的小波函数还可能含有子类,通过消失矩的个数以及降解的层次加以区分。

41e4e5ee918db68d8f64385498096465.png

2.4 连续小波变换和离散小波变换

小波变换有两种形式:连续小波变换和离散小波变换。

从数学上说,连续小波变换有如下形式:

f380cbaf987717a8f80d35737976bb5f.png

其中,a4e22ac7b13cad03c432b0a138bbc3c5.png是连续小波函数,由尺度因子a和平移量因子b刻画。连续小波变换中的尺度因子和平移量因子是连续的,因此它们是无限取值的,可以是1.3、1.31、1.311、1.3111等。

离散小波变换的最主要的区别在于:离散小波变换使用离散的尺度因子和平移量因子。尺度因子是以2为底的指数:2、4、8...,而平移量因子是整数增长的:1、2、3...。

注:离散小波变换只是在尺度因子和平移量因子上是离散的,而不是在时域上离散的。为了处理数字和离散信号,我们也需要将小波变换在时域上进行离散,也就是离散时间小波变换和离散时间连续小波变换。

2.5 离散小波变换:将离散小波变换作为一个滤波器组

事实上,离散小波变化总是通过一个滤波器组实现,也就是说它是通过一连串的高通和低通滤波器实现的,因为滤波器组可以将一个信号分解为几个频率带。

为了应用离散小波变换,我们首先从最小的尺度因子开始。最小的尺度因子也就对应着最高的频率。也就是说,我们首先分析高频成分。然后,将尺度因子增加两倍(频率减少一半),这时我们分析的就是一半最高频的成分。这个过程一直持续,直至达到了最大的降解层次。

在每一层降解后,信号中的样本点个数会减少一半(通过下采样实现),因为既然信号中的频率成分减半了,根据奈奎斯特采样定律,也就不需要那么多的样本点来表示原始信号。

下面给出一个例子,假设信号中的频率最高为1000Hz。

In the first stage we split our signal into a low-frequency part and a high-frequency part, i.e. 0-500 Hz and 500-1000 Hz.At the second stage we take the low-frequency part and again split it into two parts: 0-250 Hz and 250-500 Hz.At the third stage we split the 0-250 Hz part into a 0-125 Hz part and a 125-250 Hz part.This goes on until we have reached the level of refinement we need or until we run out of samples.

可以将上述过程可视化,以一个chirp信号为例(频率随时间变化,一开始频率最低,结束时频率最高)。

import pywt x = np.linspace(0, 1, num=2048)chirp_signal = np.sin(250 * np.pi * x**2)    fig, ax = plt.subplots(figsize=(6,1))ax.set_title("Original Chirp Signal: ")ax.plot(chirp_signal)plt.show()    data = chirp_signalwaveletname = 'sym5' fig, axarr = plt.subplots(nrows=5, ncols=2, figsize=(6,6))for ii in range(5):    // 返回两组系数,其中data表示近似系数,coeff_d表示细节系数。    (data, coeff_d) = pywt.dwt(data, waveletname)    axarr[ii, 0].plot(data, 'r')    axarr[ii, 1].plot(coeff_d, 'g')    axarr[ii, 0].set_ylabel("Level {}".format(ii + 1), fontsize=14, rotation=90)    axarr[ii, 0].set_yticklabels([])    if ii == 0:        axarr[ii, 0].set_title("Approximation coefficients", fontsize=14)        axarr[ii, 1].set_title("Detail coefficients", fontsize=14)    axarr[ii, 1].set_yticklabels([])plt.tight_layout()plt.show()

245649ef2ac7857c6e6652715e14bdec.png

近似系数代表了低通滤波器的输出,细节系数代表了高通滤波器的输出。每一层分解由滤波操作+下采样操作组成(信号的长度在每一层都会减半),每一层的信号都处在不同的频率带中(多尺度分析/子带编码)。

未完待续。。。

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐