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ć?

Tutaj wpisz opis obrazka

Author: Marco Cerliani, 2016-06-02

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

Tutaj wpisz opis obrazka

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

Tutaj wpisz opis obrazka

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.

 21
Author: Lyken,
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

Tutaj wpisz opis obrazka

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

window_length = 101

Zwiększenie window_length do 501:

window_length = 501

Więcej o filtrze tutaj

 10
Author: U3.1415926,
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)

Tutaj wpisz opis obrazka

Zaznaczam również, że tsmoothie może przeprowadzić wygładzanie wielu razy w wektoryzowanym sposób

 3
Author: Marco Cerliani,
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