Tengo 2 listas con puntos de datos en ellos.
x = ["bunch of data points"] y = ["bunch of data points"]
He generado un gráfico usando matplotlib en python
import matplotlib.pyplot as plt plt.plot(x, y, linewidth=2, linestyle="-", c="b") plt.show() plt.close()
¿Sería capaz de reducir el ruido en los datos? ¿Funcionaría aquí un filtro de Kalman?
Depende de cómo se define el “ruido” y cómo se produce. Como no proporcionó mucha información sobre su caso, tomaré su pregunta como “cómo hacer que la curva sea suave”. El filtro de Kalman puede hacer esto, pero es demasiado complejo, prefiero el filtro IIR simple
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
Despues del filtro
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
es una función de scipy.signal .
Por cierto, si desea usar el filtro de Kalman para suavizar, scipy también proporciona un ejemplo . El filtro de Kalman también debería funcionar en este caso, pero no es tan necesario.
Dependiendo de cuánto quieras eliminar el ruido, también puedes usar el filtro Savitzky-Golay de scipy
.
Lo siguiente toma el ejemplo 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
y aplica el filtro Savitzky-Golay.
from scipy.signal import savgol_filter w = savgol_filter(y, 101, 2) plt.plot(x, w, 'b') # high frequency noise removed
Aumentando el window_length
a 501:
Lea más sobre el filtro aquí