Reducir el ruido en los datos

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?

introduzca la descripción de la imagen aquí

    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 

    introduzca la descripción de la imagen aquí

    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 

    introduzca la descripción de la imagen aquí

    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 

    introduzca la descripción de la imagen aquí

    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 

    window_length = 101

    Aumentando el window_length a 501:

    window_length = 501

    Lea más sobre el filtro aquí