本文继续讲解一篇关于小波变换在机器学习中的应用的博客:
《A guide for using the Wavelet Transform in Machine Learning》,极力推荐!!
3.1 使用连续小波变换可视化状态空间
1维信号的小波变换是2维的时间-尺度图,该图给出了系统状态空间的详细信息,也就是给出了系统的动态行为。
下图给出了El Nino数据集的原始时间序列信号、傅里叶变换和小波变换的结果。
由3.1部分的2维时间-尺度图可知:小波变换不仅可以更好地理解系统的动态行为,也可以被用来区分不同类型的信号。测试所用的数据集包含了人做6种不同的活动。
3.2.1 加载UCI-HAR时间序列数据集对于数据集的描述如下:包含人做6种不同的活动,一共10000多个信号,每个信号包含如下图的9个分量。
由于每个信号包含9个分量,因此需要对每个信号进行9次连续小波变换。
既然每条信号对应9张时间-尺度图,该怎么把它们输入到CNN中呢?有如下四种可选的方案:
1)为每个分量分别训练CNN,最终的结果通过集成方式确定。这个方法可能性能较差,因为它忽略了不同分量之间的联系;2)先将9个分量的时间序列信号串联起来,然后对串联信号做连续小波变换。这种方法会在信号拼接的地方不连续,进而在时间-尺度图上信号拼接处产生造成噪声。3)首先计算每个分量的连续小波变换,然后将9个不同分量的时间-尺度图拼接成一张大的,再输入到CNN中。但是该方法同样也会在拼接处不连续,从而将噪声引入到CNN中。如果CNN足够深,也许可以区分出这些噪声。 4)将9个不同分量的时间-尺度图纵向摞在一起,形成一张通道数为9的图片,再输入到CNN中训练,如下图所示。scales = range(1,128)waveletname = 'morl'train_size = 5000test_size= 500 train_data_cwt = np.ndarray(shape=(train_size, 127, 127, 9)) for ii in range(0,train_size): if ii % 1000 == 0: print(ii) for jj in range(0,9): signal = uci_har_signals_train[ii, :, jj] coeff, freq = pywt.cwt(signal, scales, waveletname, 1) coeff_ = coeff[:,:127] train_data_cwt[ii, :, :, jj] = coeff_ test_data_cwt = np.ndarray(shape=(test_size, 127, 127, 9))f