使用 DWT 进行特征提取/减少

信息处理 小波 转变 局部特征
2021-12-30 20:04:42

对于长度为 n 个时间戳的给定时间序列,我们可以采用离散小波变换(使用“Haar”小波),然后我们得到(例如,在 Python 中)-

>>> import pywt
>>> ts = [2, 56, 3, 22, 3, 4, 56, 7, 8, 9, 44, 23, 1, 4, 6, 2]
>>> (ca, cd) = pywt.dwt(ts,'haar')
>>> ca
array([ 41.01219331,  17.67766953,   4.94974747,  44.54772721,
        12.02081528,  47.37615434,   3.53553391,   5.65685425])
>>> cd
array([-38.18376618, -13.43502884,  -0.70710678,  34.64823228,
        -0.70710678,  14.8492424 ,  -2.12132034,   2.82842712])

其中 ca 和 cd 是近似系数和详细系数。现在,如果我使用所有这些,我可以使用逆 DWT 构建我原来的时间序列。但相反,我想使用更少的系数(比如在傅里叶变换中,如果我们只使用前几个系数,我们可以近似地重建原始时间序列)。如果我只是使用ca或只是使用cd,我不会得到想要的结果。如果我只使用我们每个人的系数(比如前 4 个),我只能得到一半的时间序列。

我应该如何选择系数(从cacd),以便我可以从它们近似地创建原始信号(即它的大部分能量)?

1个回答

我认为它类似于在小波去噪中使用的软硬阈值。你遇到过这个话题吗?pywt为此目的已经有一个内置功能。请仔细查看此代码并尝试使用它:

import pywt
import matplotlib.pyplot as plt
import numpy as np

ts = [2, 56, 3, 22, 3, 4, 56, 7, 8, 9, 44, 23, 1, 4, 6, 2]

(ca, cd) = pywt.dwt(ts,'haar')

cat = pywt.thresholding.soft(ca, np.std(ca)/2)
cdt = pywt.thresholding.soft(cd, np.std(cd)/2)

ts_rec = pywt.idwt(cat, cdt, 'haar')

plt.close('all')

plt.subplot(211)
# Original coefficients
plt.plot(ca, '--*b')
plt.plot(cd, '--*r')
# Thresholded coefficients
plt.plot(cat, '--*c')
plt.plot(cdt, '--*m')
plt.legend(['ca','cd','ca_thresh', 'cd_thresh'], loc=0)
plt.grid('on')

plt.subplot(212)
plt.plot(ts)
plt.hold('on')
plt.plot(ts_rec, 'r')
plt.legend(['original signal', 'reconstructed signal'])
plt.grid('on')
plt.show()

这将产生以下结果-希望这将指导您。

在此处输入图像描述

使用最新版本运行代码的注意事项:

如果您收到这样的错误:

模块“pywt”没有属性“阈值”

在第 9 行和第 10 行使用:

 cat = pywt.threshold(ca, np.std(ca)/2, mode='soft')
 cdt = pywt.threshold(cd, np.std(cd)/2, mode='soft')

如果您收到以下错误:

plt.hold('on') 然后注释掉这一行:

  # plt.hold('on')