Wygładzanie i filtrowanie danych

Wygładzanie i filtrowanie danych
DR
  • Rejestracja:ponad 13 lat
  • Ostatnio:prawie 4 lata
  • Postów:37
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.

edytowany 1x, ostatnio: drakoo
DR
  • Rejestracja:ponad 13 lat
  • Ostatnio:prawie 4 lata
  • Postów:37
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.

Gjorni
  • Rejestracja:około 12 lat
  • Ostatnio:około 3 lata
0

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


The quieter you become, the more you are able to hear.
T9
  • Rejestracja:około 10 lat
  • Ostatnio:prawie 6 lat
  • Postów:329
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 :)

edytowany 6x, ostatnio: topik92
Zobacz pozostałe 4 komentarze
Gjorni
Niestety nie bardzo rozumiem, czego nie zrozumiałeś w tym, co napisałem. Spróbuję to napisać trochę inaczej. Jeżeli chcemy odfiltrować z surowego sygnału składową częstotliwościową, powiedzmy, 50 Hz'ów, to nie interpolujemy/wygładzamy go przed filtracją, tylko najpierw nakładamy filtr, np. Butterwortha (bandpass). I dopiero wtedy, gdy uznamy, że chcielibyśmy wygładzić nasz sygnał złożony z pozostałych składowych, to stosujemy wybraną metodę, czy to wielomian, czy Savitzky'ego, czy cokolwiek innego.
Gjorni
PS Nie wiem, czy dobrze zrozumiałem, ale czy Ty filtrujesz rozkładając sygnał szeregiem Fouriera i po prostu "wyłączasz" składowe, których nie chcesz w sygnale?
T9
do ps. ja wymieniłem kilka sposobów bo nie wiem co autor chce uzyskać.
Gjorni
Rozumiem. Filtrowanie oparte o wyrzucanie składowych częstotliwościowych z szeregu Fouriera jest bardzo złym pomysłem. Nie polecaj czegoś takiego jako metody filtrującej.
T9
Pisałem o ograniczeniu częstotliwości w "środku" i o tym żeby liczyć mniej współczynników. Nie da się policzyć wszystkich wiec trzeba się kiedyś poddać można ten moment sprytnie wybrać.
DR
  • Rejestracja:ponad 13 lat
  • Ostatnio:prawie 4 lata
  • Postów:37
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))); ?

edytowany 3x, ostatnio: drakoo
Gjorni
Co to znaczy, że nakładasz szum bazujący na rozkładzie normalnym i wykładniczym? Jaki to jest szum? Po co to w ogóle robisz? Czy w sytuacji rzeczywistej może pojawić się niedokładność pomiarowa, która jest tożsama z nanoszonym przez Ciebie szumem? Chodzi o to, że w sytuacji, gdy wiesz jaką idealną wartość przyjmuje próbka w danym czasie, tzn. np. w Twoim przypadku rekoncyliacja, to wiesz również jakie odchylenie od tej wartości jest szumem i go po prostu wtedy odejmujesz. Nie rozumiem Twojego problemu. Wiem, co robisz, ale nie rozumiem po co i dokąd to ma prowadzić.
DR
To jaka jest wartość prawidłowa pozwala mi przy testowaniu sprawdzic o ile dana metodą udało mi się odfiltrować szum, praktycznie nigdy nie będę miał tych danych tylko będę otrzymywał dane zaszumione, które będę próbował odfiltrować. Jeśli to co napisałem o ZLEMA jest prawdą to przyjmując ze biore pod uwagę 10 okresów lag = 10 - 1 / 2 = 4,5 Skad mam wiedzieć jaka wartość była w 4,5 okresie?
DR
  • Rejestracja:ponad 13 lat
  • Ostatnio:prawie 4 lata
  • Postów:37
0

user image

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

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.