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?
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
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
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.
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
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
Augmenter le window_length
à 501:
En savoir plus sur le filtre ici