Extração / redução de recursos usando DWT

7

Para uma série temporal específica com n timestamps de comprimento, podemos fazer a Transformada de Wavelet Discreta (usando wavelets 'Haar') e obter (por exemplo, em 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])

onde ca e cd são aproximações e coeficientes detalhados. Agora, se eu usar todos eles, posso construir minha série cronológica original de volta usando o DWT inverso. Mas, em vez disso, quero usar menos coeficientes (como na Transformada de Fourier, se usarmos apenas os primeiros coeficientes, podemos reconstruir aproximadamente a série temporal original). Se eu apenas usar caou apenas usar cd, não obtenho os resultados desejados. Se eu usar apenas os coeficientes de cada um deles (como os primeiros 4), recebo apenas metade da série temporal.

Como devo selecionar os coeficientes (de cae cd) para que eu possa criar aproximadamente o sinal original deles (ou seja, a maior parte de sua energia)?

theharshest
fonte

Respostas:

9

Eu acho que é parecido com um limiar suave e difícil usando no wavelet sem ruído. Você já se deparou com este tópico? pywtjá possui uma função integrada para esse fim. Por favor, dê uma olhada mais de perto neste código e tente brincar com ele:

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()

Isso produzirá o seguinte - espero que isso o guie.

insira a descrição da imagem aqui

Nota sobre a execução do código com as versões mais recentes:

se você receber um erro como este:

o módulo 'pywt' não possui atributo 'thresholding'

use nas linhas 9 e 10:

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

se você receber um erro em:

plt.hold ('on') e comente esta linha:

  # plt.hold('on')
jojek
fonte
@ theharshest: Fico feliz em ouvir isso. Boa sorte!
jojek