web-dev-qa-db-fra.com

Réduction du bruit sur les données

J'ai 2 listes contenant des points de données.

x = ["bunch of data points"]
y = ["bunch of data points"]

J'ai généré un graphique en utilisant matplotlib en python

import matplotlib.pyplot as plt

plt.plot(x, y, linewidth=2, linestyle="-", c="b")
plt.show()
plt.close()

Serais-je capable de réduire le bruit sur les données? Un filtre de Kalman fonctionnerait-il ici?

enter image description here

6
PiccolMan

Cela dépend de la façon dont vous définissez le "bruit" et de la façon dont il est causé. Puisque vous n'avez pas fourni beaucoup d'informations sur votre cas, je vais prendre votre question comme "comment rendre la courbe lisse". Le filtre de Kalman peut le faire, mais c'est trop complexe, je préfère un simple filtre IIR

import matplotlib.pyplot as plt

mu, sigma = 0, 500

x = np.arange(1, 100, 0.1)  # x axis
z = np.random.normal(mu, sigma, len(x))  # noise
y = x ** 2 + z # data
plt.plot(x, y, linewidth=2, linestyle="-", c="b")  # it include some noise

enter image description here

Après le filtre

from scipy.signal import lfilter

n = 15  # the larger n is, the smoother curve will be
b = [1.0 / n] * n
a = 1
yy = lfilter(b,a,y)
plt.plot(x, yy, linewidth=2, linestyle="-", c="b")  # smooth by filter

enter image description here

lfilter est une fonction de scipy.signal .

Soit dit en passant, si vous souhaitez utiliser le filtre de Kalman pour le lissage, scipy fournit également un exemple . Le filtre de Kalman devrait également fonctionner dans ce cas, mais pas si nécessaire.

15
Lyken Syu

Selon la quantité de bruit que vous souhaitez supprimer, vous pouvez également utiliser le filtre Savitzky-Golay de scipy.

Ce qui suit prend l'exemple de @ lyken-syu:

import matplotlib.pyplot as plt
import numpy as np
mu, sigma = 0, 500
x = np.arange(1, 100, 0.1)  # x axis
z = np.random.normal(mu, sigma, len(x))  # noise
y = x ** 2 + z # data
plt.plot(x, y, linewidth=2, linestyle="-", c="b")  # it include some noise

enter image description here

et applique le filtre Savitzky-Golay

from scipy.signal import savgol_filter
w = savgol_filter(y, 101, 2)
plt.plot(x, w, 'b')  # high frequency noise removed

window_length = 101

Augmenter le window_length à 501:

window_length = 501

En savoir plus sur le filtre ici

6
U3.1415926