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à.
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.
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.
J'avais envie d'essayer un peu plus de théorie.
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