Wygładzanie danych szeregów czasowych

14

Buduję aplikację na Androida, która rejestruje dane akcelerometru podczas snu, aby analizować trendy snu i opcjonalnie budzić użytkownika w pobliżu pożądanego czasu podczas snu lekkiego.

Zbudowałem już komponent, który gromadzi i przechowuje dane, a także alarm. Nadal muszę stawić czoła bestii, wyświetlając i zapisując dane dotyczące snu w naprawdę znaczący i przejrzysty sposób, który najlepiej nadaje się również do analizy.

Kilka zdjęć mówi dwa tysiące słów: (Mogę opublikować tylko jeden link z powodu niskiej liczby powtórzeń)

Oto niefiltrowane dane, suma ruchu, zebrane w 30-sekundowych odstępach

I te same dane, wygładzone przez mój własny efekt wygładzania średniej ruchomej

edycja) obie wykresy odzwierciedlają kalibrację - istnieje minimalny filtr szumu i maksymalny filtr odcięcia, a także poziom wyzwalania alarmu (biała linia)

Niestety żadne z tych rozwiązań nie jest optymalne - pierwsze jest trochę trudne do zrozumienia dla przeciętnego użytkownika, a drugie, łatwiejsze do zrozumienia, kryje w sobie wiele z tego, co się naprawdę dzieje. W szczególności uśrednianie usuwa szczegóły skoków w ruchu - i myślę, że mogą one mieć znaczenie.

Dlaczego więc te wykresy są tak ważne? Te szeregi czasowe są wyświetlane przez całą noc jako informacja zwrotna dla użytkownika i będą przechowywane do późniejszego przejrzenia / analizy. Wygładzanie idealnie obniży koszty pamięci (zarówno pamięci RAM, jak i pamięci), a także przyspieszy renderowanie na tych pozbawionych zasobów telefonach / urządzeniach.

Oczywiście istnieje lepszy sposób na wygładzenie danych - mam pewne niejasne pomysły, takie jak regresja liniowa w celu wykrycia „ostrych” zmian ruchu i modyfikowanie odpowiednio wygładzania średniej ruchomej. Naprawdę potrzebuję więcej wskazówek i informacji, zanim zacznę nurkować w coś, co można rozwiązać bardziej optymalnie.

Dzięki!

Jon
źródło

Odpowiedzi:

16

Po pierwsze, wymagania dotyczące kompresji i analizy / prezentacji niekoniecznie są takie same - w przypadku analizy możesz chcieć zachować wszystkie nieprzetworzone dane i mieć możliwość dzielenia ich na różne sposoby. A to, co będzie najlepsze dla Ciebie, będzie zależeć w dużej mierze od tego, co chcesz z tego wydostać. Ale istnieje wiele standardowych sztuczek, które możesz wypróbować:

  • Używaj różnic zamiast surowych danych
  • Użyj progu, aby usunąć hałas niskiego poziomu. (Połącz z różnicowaniem, aby zignorować małe zmiany).
  • Użyj wariancji w pewnym czasu zamiast średniej, aby uchwycić poziom aktywności zamiast ruchu
  • Zmień podstawę czasu z ustalonych przedziałów na przebiegi o zmiennej długości i kumuluj w pojedynczych punktach danych sekwencje zmian, dla których pewne kryterium ma zastosowanie (np. Różnice w tym samym kierunku, do pewnego progu)
  • Przekształć dane z wartości rzeczywistych na porządkowe (np. Niskie, średnie, wysokie); możesz to również zrobić w przedziałach czasowych zamiast pojedynczych próbek - np. poziom aktywności dla każdego 5-minutowego odcinka
  • Użyj odpowiedniego jądra splotu *, aby wygładzić bardziej subtelnie niż średnia ruchoma lub wybierz interesujące Cię funkcje, takie jak ostre zmiany.
  • Użyj biblioteki FFT, aby obliczyć widmo mocy

Ten ostatni może być nieco drogi dla twoich celów, ale prawdopodobnie dałby ci bardzo przydatne opcje prezentacji, w kategoriach „rytmów snu” i tym podobne. (Nic nie wiem o Androidzie, ale można sobie wyobrazić, że niektóre / wiele / wszystkie telefony mogły mieć wbudowany sprzęt DSP, z którego można skorzystać.)


* Biorąc pod uwagę, jak centralny jest splot cyfrowego przetwarzania sygnału, zaskakująco trudno jest znaleźć dostępne wprowadzenie online. Lub co najmniej za 3 minuty googlingu. Sugestie mile widziane!

krótkofalówka
źródło
10

Istnieje wiele nieparametrycznych algorytmów wygładzania, w tym splajny i less. Ale łagodzą także nagłe zmiany. Podobnie filtry dolnoprzepustowe. Myślę, że możesz potrzebować wygładzacza opartego na falkach, który pozwala na nagłe skoki, ale nadal wygładza hałas.

Sprawdź Percival i Walden (2000) i związany z R pakiet . Chociaż potrzebujesz rozwiązania Java, algorytmy w pakiecie R są typu open source i być może będziesz w stanie je przetłumaczyć.

Rob Hyndman
źródło
3

Jest to nieco styczne do tego, o co pytasz, ale warto spojrzeć na filtr Kalmana.

NPE
źródło
1

Wygładzanie Savitzky'ego-Golaya może być dobrą odpowiedzią. Jest to niezwykle wydajna implementacja wygładzania metodą najmniejszych kwadratów w przesuwanym oknie czasowym (splot tych danych), która sprowadza się do pomnożenia danych w każdym oknie czasowym przez stałe stałe. Możesz dopasować wartości, pochodne, drugie pochodne i wyższe.

Ty decydujesz, jak kolczaste pozwolisz na wyniki, na podstawie wielkości przesuwanego okna czasowego i stopnia dopasowania wielomianu w tym oknie czasowym. Zostało to pierwotnie opracowane do chromatografii, w której piki są istotną częścią wyników. Jedną z pożądanych właściwości wygładzania SG jest zachowanie lokalizacji pików. Na przykład okno od 5 do 11 punktów z dopasowaniem krzywej sześciennej zmniejsza hałas, ale nadal zachowuje wartości szczytowe.

W Wikipedii znajduje się dobry artykuł, chociaż jest on nazywany filtrem Savitzky'ego-Golay'a (lekceważący normalną terminologię z teorii sterowania systemami i analizy szeregów czasowych, a także oryginalny artykuł, w którym jest to poprawnie nazywane wygładzaniem). Należy również pamiętać, że w artykule w Wikipedii występuje błąd (sprzeczka) w przypadku formuł szacunkowych dla drugiej pochodnej - patrz sekcja Dyskusja dla tego artykułu. EDYCJA: Artykuł w Wikipedii został naprawiony

gms
źródło