[PYTHON] Rauschentfernungsverfahren unter Verwendung der Wavelet-Umwandlung

Es gab eine Rauschentfernungsmethode, von der ich überzeugt war, dass "es eine solche Methode gibt" in Kaggles Kernel (jetzt Notizbuch), also werde ich zusammenfassen, was ich hier und da untersucht habe.

Methodenübersicht

Es gibt eine Methode namens ** Wavelet-Umwandlung ** als Analysemethode für ein bestimmtes Signal oder eine bestimmte Wellenform. Ich denke, Sie stellen sich die Fourier-Transformation oft als Analysemethode vor, aber während die Fourier-Transformation die Wellenform in die Summe der Dreiecksfunktionen (sai, kosai) erweitert, zerlegt die Wavelet-Transformation sie in eine Wellenform beliebiger Form. Kann gemacht werden. (Und es gibt eine inverse Umwandlung)

Wenn daher eine teilweise charakteristische Welle (** Mutter-Wavelet **) in der gegebenen Wellenform durch Zerlegen der Welle als Basis bestätigt werden kann, ist es möglich zu bestimmen, in welcher Zeitzone und Regel die Charakteristik erscheint. Du kannst es überprüfen. (Der Koeffizient, der bei der Zerlegung auftritt, wird als ** Wavelet-Koeffizient ** bezeichnet.)

Wenn daher die Form des Rauschens erfasst werden kann, wird eine Wavelet-Umwandlung unter Verwendung als Mutter-Wavelet durchgeführt, der Rauschteil wird durch 0 ersetzt, und dann wird die inverse Umwandlung durchgeführt, um eine rauschfreie Wellenform zu erhalten.

Verfahren

Nun ist die Funktion, die den obigen Mechanismus ergab, wie folgt.

import numpy as np
import pywt 

def maddest(d, axis=None):
    return np.mean(np.absolute(d - np.mean(d, axis)), axis)

def denoise(x, wavelet='db', level=1):
    coeff = pywt.wavedec(x, wavelet, mode="per")
    sigma = (1/0.6745) * maddest(coeff[-level])

    uthresh = sigma * np.sqrt(2*np.log(len(x)))
    coeff[1:] = (pywt.threshold(i, value=uthresh, mode='hard') for i in coeff[1:])

    return pywt.waverec(coeff, wavelet, mode='per')

Der erste Def gibt die Berechnung der durchschnittlichen absoluten Abweichung an Die Abweichung ist die Differenz zwischen den einzelnen Daten und dem Durchschnitt, die absolute Abweichung ist der absolute Wert der Abweichung und die durchschnittliche absolute Abweichung ist die absolute Abweichung geteilt durch die Grundgesamtheit, dh den Durchschnitt.

Beispiel: 4 Daten von 50 Punkten, 70 Punkten, 90 Punkten, 70 Punkten (durchschnittlich 70 Punkte) Die Abweichungen betragen -20, 0, 20, 0, Absolute Abweichungen sind 20, 0, 20, 0, Die durchschnittliche absolute Abweichung beträgt (0 + 20 + 20 + 0) / 4 = 10.

Der zweite Def gibt die Entfernung von Wellenformrauschen an. Zuerst

coeff = pywt.wavedec(x, wavelet, mode='per')

Nun wird die gegebene Wellenform Wavelet-konvertiert. Parameter x sind Array-Daten, Wavelet ist der Name des Wavelets (in diesem Fall db), Mode ist die Randbedingung (per bedeutet, dass das rechte und linke Ende der Wellenform verbunden sind) Koeffizient wird als Liste von Wavelet-Koeffizienten angegeben. (Der erste von Anfang an ist jedoch nicht der Wavelet-Koeffizient. Der Rest der Mindestauflösung wird gespeichert.)

Nächster

sigma = (1/0.6745) * maddest(coeff[-level])

Dann wird die Größe des Rauschens angegeben. maddest (Koeffizient [-Level]) gibt die durchschnittliche absolute Abweichung des ersten Werts vom Ende der Liste der Wavelet-Koeffizienten an (je höher der Wert, desto höher die Auflösung. Die Einstellung ist Pegel). 0,6745 ist eine magische Sache, aber es ist eine Konstante, die das Verhältnis zwischen der Standardabweichung und der durchschnittlichen absoluten Abweichung ausdrückt.

Nächster

uthresh = sigma * np.sqrt(2*np.log(len(x)))
coeff[1:] = (pywt.threshold(i, value=uthresh, mode='hard') for i in coeff[1:])

Dann wird zuerst der Schwellenwert (uthresh) berechnet, und wenn der Wavelet-Koeffizient unter den Schwellenwert fällt, wird er als Rauschen betrachtet und 0 wird angegeben.

Schließlich

return pywt.waverec(coeff, wavelet, mode='per')

Dann wird die ursprüngliche Form durch die umgekehrte Umwandlung der Wavelet-Umwandlung wiederhergestellt. Da der Prozess der Untersuchung der Lücke mit dem Schwellenwert durchgeführt wird, kann eine rauschfreie Wellenform erhalten werden.

Impressionen

Ich wollte etwas mehr Theorie ausprobieren.

Referenz

Discrete Wavelet Transform (DWT) Grundlagen der Wavelet-Konvertierung [Entfernung von Wavelet-Rauschen](https://medium.com/@junkoda/%E3%82%A6%E3%82%A7%E3%83%BC%E3%83%96%E3%83%AC%E3 % 83% 83% E3% 83% 88% E3% 81% AB% E3% 82% 88% E3% 82% 8B% E3% 83% 8E% E3% 82% A4% E3% 82% BA% E9% 99 % A4% E5% 8E% BB-fc20d82bcb80)

Recommended Posts

Rauschentfernungsverfahren unter Verwendung der Wavelet-Umwandlung
Untersuchung der Austauschprognosemethode mittels Deep Learning und Wavelet-Konvertierung
Methodenaufruf mit __getattr__
Untersuchung der Austauschprognosemethode mit Deep Learning und Wavelet-Konvertierung - Teil 2-
Datenvisualisierungsmethode mit Matplotlib (1)
FFT & Trendentfernung mit Numpy
Lineare Regressionsmethode mit Numpy
Diskrete Kosinusumwandlung mit chainer.links.Linear
Datenvisualisierungsmethode mit Matplotlib (2)
SQL-Verbindungsmethode mit pyodbc