Wygładzanie i filtrowanie danych

0

Witam,
posiadam zbiór zaszumionych danych - data, godzina i przypisana wartość typu BigDecimal (lista), po wczytaniu jej z pliku chciał bym spróbować wygładzić, odfiltrować szum z danych, niestety nie potrafię sobie z tym poradzić. Szukałem, ale nie znalazłem w Javie gotowych metod, które mogły by mi pomóc. Jednym z sposobów na odfiltrowanie danych jest filtr Savitzkiego - Golaya jednak jego implementacja w Javie trochę mnie przerasta. Znalazłem również informacje, że można by do tego użyć średniej ruchomej. Czy ktoś już coś takiego robił? bądź jest w stanie mi jakkolwiek pomóc?

Serdecznie pozdrawiam.

0

Nikt nic?
Myślę że Moving Average się do tego nada, jednak powstaje problem opóźnień. Znalazłem, że istnieje coś takiego jak Zero Lag Moving Average, ale niestety nie rozumie w jaki sposób to działa.

0

Czym jest szum? Czy jest to jakaś konkretna składowa częstotliwościowa? Np. powiedzmy 50 Hz'ów?

0

Możesz interpolować sobie te punkty jako wielomian to jest dość łatwe,(właściwie to nawet nie musisz wystarczy że myślisz o nich jak o wielomianie), a potem policzysz z tego wielomianu __SZEREGI __Fouriera*, wystarczy zaimplementować wzór z wiki, jedyna trudna rzecz to to że musisz czas na omege przeliczyć, całki numerycznie łatwo się liczy. Jak już będziesz miał te współczynniki itd. to ilość szumów możesz zredukować licząc mniej współczynników. Albo mnożąc je przez jakąś funkcje np. jeśli wiesz że szum jest dla około 50hz. to zmieszasz współczynniki koło 50 hz i szum się wygładza.
To jest takie prawie fachowe podejście do problemu.

Możesz też zrobić tak aproksymujesz sobie ten próbki wielomianem niższego rzędu niż liczba próbek, ale nie wiem jak zrobić na pewno to dobrze.

Złożoność czasowa pomijam bo dane czytasz z pliku wiec to chyba bez znaczenia.

*Szeregi nie transformatę bo szeregi są prostsze :)

0

Witam,
ogólne sytuacja wygląda tak że mam zestaw idealnych danych pomiędzy dwoma czujnikami, czyli np. jeden nalicza ilość wody wypompowanej z zbiornika A, a drugi ilość wody wpompowanej z zbiornika A do zbiornika B w danym okresie czasu. Czyli jeśli w danej chwili z A wypompujemy 5 l to do zbiornika B powinno zostać dolane 5l. Jak wspomniałem wygenerowałem zestaw idealnych danych czyli w kazdym okresie czasu ilosc wypompowanej i wpompowanej wody się zgadza czyli rekoncyliacja jest równa 0. Teraz symuluje nanoszenie szumu za pomocą rozkładu normalnego oraz wykładniczego. Teraz moje zadanie polega na tym aby w jak największym stopniu zbliżyć się do danych oryginalnych. Postanowiłem zastosować wykładniczą średnią kroczącą.

edit:
Z napisałem obsługę EMA, ogolnie wyszło mi coś takiego:
user image
Niebieskie - dane oryginalne
Czerwony - z szumem
Zielony - po zastosowaniu EMA

Co prawda jest to niewielka ilość danych bo tylko 24h (co 5 min), jak widać szum się wygładził ale niestety do oryginalnych wartości mu raczej daleko.

Chciałbym spróbować zastosować Zero lag EMA, ale nie wiem o co w tym chodzi i jak to sie ma do standardowej EMA? ktoś pomoże?
Wiem tylko że lag się oblicza z wzoru: (ilosc okresów - 1) / 2, ale nie mam pojęcia co dalej?

ZLEMA = EMA of (close + (close-close[lag]))

nie wiem czy dobrze rozumie ZLEMA = EMA(aktualna wart + (aktualna wart - wartość(ilosc dni temu))); ?

0

user image

Zobaczcie teraz wyszło mi coś takiego, myślę że jest idealnie!

1 użytkowników online, w tym zalogowanych: 0, gości: 1