[PYTHON] Méthode de suppression du bruit utilisant la conversion en ondelettes

Il y avait une méthode de suppression du bruit dont j'étais convaincu qu '"il existe une telle méthode" dans le noyau de kaggle (maintenant notebook), je vais donc résumer ce que j'ai étudié ici et là.

Aperçu de la méthode

Il existe une méthode appelée ** conversion en ondelettes ** comme méthode d'analyse pour un certain signal ou forme d'onde. Je pense que vous imaginez souvent la transformée de Fourier comme une méthode d'analyse, mais alors que la transformée de Fourier étend la forme d'onde en une somme de fonctions triangulaires (sai, kosai), la transformée en ondelettes la décompose en une forme d'onde de n'importe quelle forme. Peut être fait. (Et il y a une conversion inverse)

Par conséquent, si une onde partiellement caractéristique (** ondelette mère **) peut être confirmée dans la forme d'onde donnée, en décomposant l'onde comme base, il est possible de déterminer dans quel fuseau horaire et de règle la caractéristique apparaît. Vous pouvez le vérifier. (Le coefficient qui apparaît une fois décomposé est appelé ** coefficient d'ondelettes **)

Par conséquent, si la forme du bruit peut être saisie, une conversion en ondelettes est effectuée en l'utilisant comme ondelette mère, la partie de bruit est remplacée par 0, puis la conversion inverse est effectuée pour obtenir une forme d'onde sans bruit.

procédure

Maintenant, la fonction qui a donné le mécanisme ci-dessus est la suivante.

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

La première définition donne le calcul de l'écart absolu moyen L'écart est la différence entre chaque donnée et la moyenne, l'écart absolu est la valeur absolue de l'écart, et l'écart absolu moyen est l'écart absolu divisé par la population, c'est-à-dire la moyenne.

Exemple: 4 données de 50 points, 70 points, 90 points, 70 points (70 points en moyenne) Les écarts sont de -20, 0, 20, 0, Les écarts absolus sont 20, 0, 20, 0, L'écart absolu moyen est (0 + 20 + 20 + 0) / 4 = 10.

La deuxième définition donne la suppression du bruit de forme d'onde. Premier

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

Maintenant, la forme d'onde donnée est convertie en ondelettes. Le paramètre x correspond aux données du tableau, l'ondelette est le nom de l'ondelette (db cette fois), le mode est la condition aux limites (cela signifie que les extrémités droite et gauche de la forme d'onde sont connectées) coeff est donné sous forme de liste de coefficients d'ondelettes. (Cependant, le premier depuis le début n'est pas le coefficient d'ondelettes. Le reste de la résolution minimale est stocké.)

prochain

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

Ensuite, la magnitude du bruit est donnée. maddest (coeff [-level]) montre l'écart absolu moyen de la première valeur à l'arrière de la liste des coefficients d'ondelettes (plus la valeur est élevée dans la liste, plus la résolution est élevée. Le réglage est de niveau). 0,6745 est une chose magique, mais c'est une constante qui exprime le rapport entre l'écart type et l'écart absolu moyen.

prochain

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

Ensuite, tout d'abord, la valeur de seuil (uthresh) est calculée, et lorsque le coefficient d'ondelette tombe en dessous de la valeur de seuil, il est considéré comme du bruit et 0 est donné.

finalement

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

Ensuite, la forme d'origine est restaurée par la conversion inverse de la conversion en ondelettes. Puisque le processus d'examen de l'écart avec la valeur de seuil est effectué, une forme d'onde sans bruit peut être obtenue.

Impressions

J'avais envie d'essayer un peu plus de théorie.

référence

Discrete Wavelet Transform (DWT) Bases de la conversion en ondelettes [Suppression du bruit d'ondelettes](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

Méthode de suppression du bruit utilisant la conversion en ondelettes
Examen de la méthode de prévision des échanges utilisant le Deep Learning et la conversion en ondelettes
Appel de méthode avec __getattr__
Examen de la méthode de prévision des échanges utilisant le Deep Learning et la conversion en ondelettes - Partie 2
Méthode de visualisation de données utilisant matplotlib (1)
Suppression de la FFT et des tendances avec Numpy
Méthode de régression linéaire utilisant Numpy
Conversion discrète de cosinus à l'aide de chainer.links.Linear
Méthode de visualisation de données utilisant matplotlib (2)
Méthode de connexion SQL utilisant pyodbc