Merkmalsextraktion / -reduzierung mit DWT

7

Für eine gegebene Zeitreihe mit einer Länge von n Zeitstempeln können wir eine diskrete Wavelet-Transformation (unter Verwendung von 'Haar'-Wavelets) durchführen und dann (zum Beispiel in 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])

wobei ca und cd Approximation und detaillierte Koeffizienten sind. Wenn ich jetzt alle verwende, kann ich meine ursprüngliche Zeitreihe mit inverser DWT zurückkonstruieren. Stattdessen möchte ich weniger Koeffizienten verwenden (wie bei der Fourier-Transformation können wir die ursprüngliche Zeitreihe ungefähr rekonstruieren, wenn wir nur die ersten Koeffizienten verwenden). Wenn ich nur caoder nur benutze cd, erhalte ich nicht die gewünschten Ergebnisse. Wenn ich nur die Koeffizienten von jedem von ihnen verwende (wie die ersten 4), erhalte ich nur die Hälfte der Zeitreihen.

Wie soll ich die Koeffizienten (von caund cd) auswählen, damit ich ungefähr das ursprüngliche Signal daraus erzeugen kann (dh den größten Teil seiner Energie)?

theharshest
quelle

Antworten:

9

Ich denke, es ähnelt dem weichen und harten Schwellenwert beim Wavelet-Entrauschen. Sind Sie auf dieses Thema gestoßen? pywthat zu diesem Zweck bereits eine eingebaute Funktion. Bitte schauen Sie sich diesen Code genauer an und versuchen Sie, damit zu spielen:

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

Dies wird Folgendes hervorbringen - ich hoffe, dies wird Sie führen.

Geben Sie hier die Bildbeschreibung ein

Hinweis zum Ausführen des Codes mit den neuesten Versionen:

Wenn Sie einen Fehler wie diesen erhalten:

Modul 'pywt' hat kein Attribut 'Schwellwert'

Verwendung in Zeile 9 und 10:

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

Wenn Sie eine Fehlermeldung erhalten:

plt.hold ('on') kommentiert dann diese Zeile aus:

  # plt.hold('on')
jojek
quelle
@theharshest: Freut mich das zu hören. Viel Glück!
Jojek