Zeitreihendaten werden geglättet


14

Ich erstelle eine Android-Anwendung, die Beschleunigungsmesserdaten während des Schlafes aufzeichnet, um Schlaf-Trends zu analysieren und den Benutzer während des leichten Schlafes optional in der Nähe einer gewünschten Zeit aufzuwecken.

Ich habe bereits die Komponente erstellt, die Daten sammelt und speichert, sowie den Alarm. Ich muss mich immer noch mit der Bestie befassen, Schlafdaten wirklich aussagekräftig und übersichtlich anzuzeigen und zu speichern, was sich vorzugsweise auch für Analysen eignet.

Ein paar Bilder sagen zweitausend Worte: (Ich kann wegen geringer Wiederholungszahlen nur einen Link posten)

Hier sind die ungefilterten Daten, die Summe der Bewegungen, die alle 30 Sekunden erfasst werden

Und dieselben Daten, geglättet durch meine eigene Manifestation der Glättung des gleitenden Durchschnitts

Bearbeiten) Beide Diagramme spiegeln die Kalibrierung wider. Es gibt ein Minimum-Rausch- und ein Maximum-Grenzfilter sowie einen Alarmauslösungspegel (die weiße Linie).

Leider ist keine dieser Lösungen optimal - die erste ist für den Durchschnittsbenutzer etwas schwer zu verstehen, und die zweite, die einfacher zu verstehen ist, verbirgt viel von dem, was wirklich vor sich geht. Insbesondere die Mittelung entfernt die Details von Bewegungsspitzen - und ich denke, dass diese aussagekräftig sein können.

Warum sind diese Diagramme so wichtig? Diese Zeitreihen werden die ganze Nacht über als Rückmeldung an den Benutzer angezeigt und zur späteren Überprüfung / Analyse gespeichert. Die Glättung senkt idealerweise die Speicherkosten (sowohl RAM als auch Speicher) und beschleunigt das Rendern auf diesen ressourcenarmen Telefonen / Geräten.

Es gibt eindeutig einen besseren Weg, die Daten zu glätten. Ich habe einige vage Vorstellungen, z. Ich brauche wirklich mehr Anleitung und Input, bevor ich mich kopfüber auf etwas einlasse, das sich besser lösen lässt.

Vielen Dank!

Antworten:


16

Erstens sind die Anforderungen für die Komprimierung und Analyse / Präsentation nicht unbedingt gleich - tatsächlich möchten Sie für die Analyse möglicherweise alle Rohdaten behalten und können sie auf verschiedene Arten in Scheiben schneiden und würfeln. Und was für Sie am besten funktioniert, hängt sehr davon ab, was Sie daraus machen möchten. Es gibt jedoch eine Reihe von Standardtricks, die Sie ausprobieren können:

  • Verwenden Sie Unterschiede anstelle von Rohdaten
  • Verwenden Sie die Schwellenwerteinstellung, um leise Geräusche zu entfernen. (Mit Differenzierung kombinieren, um kleine Änderungen zu ignorieren.)
  • Verwenden Sie die Varianz über ein bestimmtes Zeitfenster und nicht über den Durchschnitt, um das Aktivitätsniveau und nicht die Bewegung zu erfassen
  • Ändern Sie die Zeitbasis von festen Intervallen zu Läufen mit variabler Länge und akkumulieren Sie Änderungssequenzen, für die ein Kriterium gilt (z. B. Unterschiede in derselben Richtung, bis zu einem bestimmten Schwellenwert), in einem einzelnen Datenpunkt.
  • Daten von reellen Werten in Ordnungszahlen umwandeln (z. B. niedrig, mittel, hoch); Sie können dies auch auf Zeitbehältern und nicht auf einzelnen Proben durchführen - z. B. Aktivitätsstufe für jede 5-minütige Strecke
  • Verwenden Sie einen geeigneten Faltungskern *, um subtiler als der gleitende Durchschnitt zu glätten, oder suchen Sie nach interessanten Merkmalen wie starken Änderungen.
  • Verwenden Sie eine FFT- Bibliothek, um ein Leistungsspektrum zu berechnen

Letzteres mag für Ihre Zwecke etwas teuer sein, würde Ihnen jedoch wahrscheinlich einige sehr nützliche Präsentationsoptionen bieten, z. B. "Schlafrhythmus". (Ich weiß so gut wie nichts über Android, aber es ist denkbar, dass einige / viele / alle Mobilteile DSP-Hardware eingebaut haben, die Sie nutzen können.)


* Angesichts der zentralen Bedeutung der digitalen Signalverarbeitung ist es überraschend schwierig, ein zugängliches Intro online zu finden. Oder zumindest in 3 Minuten googeln. Vorschläge willkommen!


10

Es gibt viele nichtparametrische Glättungsalgorithmen, einschließlich Splines und Loess. Aber sie werden auch die plötzlichen Veränderungen ausgleichen. Dies gilt auch für Tiefpassfilter. Ich denke, Sie brauchen vielleicht einen Wavelet-basierten Glätter, der plötzliche Sprünge erlaubt, aber dennoch das Rauschen glättet.

Schauen Sie sich Percival und Walden (2000) und das zugehörige R-Paket an . Obwohl Sie eine Java-Lösung wünschen, sind die Algorithmen im R-Paket Open Source und Sie können sie möglicherweise übersetzen.


3

Dies ist etwas tangential zu dem, was Sie fragen, aber es kann sich lohnen, sich den Kalman-Filter anzusehen.


1

Savitzky-Golay-Glättung könnte eine gute Antwort sein. Es ist eine äußerst effiziente Implementierung der Glättung kleinster Quadrate über ein gleitendes Zeitfenster (eine Faltung über diese Daten), die darauf hinausläuft, die Daten in jedem Zeitfenster nur mit festen Konstanten zu multiplizieren. Sie können Werte, Ableitungen, zweite Ableitungen und höher anpassen.

Sie legen fest, wie stachelig die Ergebnisse sein sollen, basierend auf der Größe des Gleitzeitfensters und dem Grad der Polynomanpassung in diesem Zeitfenster. Das wurde ursprünglich für die Chromatographie entwickelt, bei der Peaks ein wesentlicher Bestandteil der Ergebnisse sind. Eine wünschenswerte Eigenschaft der SG-Glättung ist, dass die Orte der Peaks erhalten bleiben. Beispielsweise reduziert ein Fenster mit 5 bis 11 Punkten und einer kubischen Kurvenanpassung das Rauschen, behält jedoch Spitzenwerte bei.

Es gibt einen guten Artikel in Wikipedia, obwohl er als Savitzky-Golay- Filter bezeichnet wird (was der normalen Terminologie aus der Systemsteuerungstheorie und der Zeitreihenanalyse sowie der Originalarbeit, in der es korrekt als Glättung bezeichnet wird, geringfügig widerspricht). Beachten Sie auch, dass der Wikipedia-Artikel einen Fehler enthält, der Formeln für Schätzungen der zweiten Ableitung enthält. Weitere Informationen finden Sie im Abschnitt Diskussion zu diesem Artikel. BEARBEITEN: Der Wikipedia-Artikel wurde behoben

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.