Redukcja szumów na danych
Mam 2 Listy z punktami danych w nich.
x = ["bunch of data points"]
y = ["bunch of data points"]
Wygenerowałem Wykres używając matplotlib w Pythonie
import matplotlib.pyplot as plt
plt.plot(x, y, linewidth=2, linestyle="-", c="b")
plt.show()
plt.close()
Czy będę w stanie zmniejszyć hałas na danych? Czy filtr Kalmana mógłby tu działać?
3 answers
To zależy jak zdefiniujesz "szum" i jak jest spowodowany. Ponieważ nie podałeś zbyt wielu informacji o swojej sprawie, potraktuję twoje pytanie jako "jak zrobić krzywą gładką". Filtr Kalmana może to zrobić, ale jest zbyt skomplikowany, wolałbym prosty filtr 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
Po filtrze
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
jest funkcją z scipy.sygnał .
Przy okazji, jeśli chcesz użyć filtra Kalmana do wygładzania, scipy podaje również przykład . Filtr Kalmana powinien również działać w tym przypadku, po prostu nie jest to konieczne.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-06 10:23:16
W zależności od tego, jak bardzo lubisz usuwać szumy, możesz również użyć filtra Savitzky-Golay z scipy
.
Oto przykład z @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
I stosuje filtr Savitzky-Golay
from scipy.signal import savgol_filter
w = savgol_filter(y, 101, 2)
plt.plot(x, w, 'b') # high frequency noise removed
Zwiększenie window_length
do 501:
Więcej o filtrze tutaj
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-14 12:50:07
Jeśli masz do czynienia z timeseries proponujętsmoothie : bibliotekę Pythona do wygładzania timeseries i wykrywania odstających w wektorowy sposób.
Zapewnia różne algorytmy wygładzania wraz z możliwością obliczania interwałów.
Tutaj używam ConvolutionSmoother
, ale można go również przetestować inne. (Również {[2] } jest dostępny)
import numpy as np
import matplotlib.pyplot as plt
from tsmoothie.smoother import *
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
# operate smoothing
smoother = ConvolutionSmoother(window_len=30, window_type='ones')
smoother.smooth(y)
# generate intervals
low, up = smoother.get_intervals('sigma_interval', n_sigma=3)
# plot the smoothed timeseries with intervals
plt.figure(figsize=(11,6))
plt.plot(smoother.data[0], color='orange')
plt.plot(smoother.smooth_data[0], linewidth=3, color='blue')
plt.fill_between(range(len(smoother.data[0])), low[0], up[0], alpha=0.3)
Zaznaczam również, że tsmoothie może przeprowadzić wygładzanie wielu razy w wektoryzowanym sposób
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-08-25 09:01:31