Згладжування даних часових рядів


14

Я будую додаток для android, яке записує дані акселерометра під час сну, щоб аналізувати тенденції сну та необов'язково будити користувача протягом бажаного часу під час легкого сну.

Я вже створив компонент, який збирає та зберігає дані, а також сигнал тривоги. Мені все-таки потрібно боротися зі звітом, що відображає та зберігає дані про сон, по-справжньому змістовному та зрозумілому способу, який, бажано, також піддається аналізу.

Кілька картинок говорять про дві тисячі слів: (Я можу розмістити лише одне посилання через низьку кількість представників)

Ось нефільтровані дані, сума руху, зібрана з інтервалом 30 секунд

І ті ж дані, згладжені власним проявом ковзного середнього згладжування

редагувати) обидві діаграми відображають калібрування - є мінімальний фільтр "шум" та максимальний фільтр обрізання, а також рівень тригера тривоги (біла лінія)

На жаль, жодне з цих варіантів не є оптимальними рішеннями: перше - це важко зрозуміти середньому користувачеві, а друге, яке простіше зрозуміти, приховує багато того, що насправді відбувається. Зокрема, усереднення знімає деталі шипів у русі - і я думаю, що це може бути значущим.

То чому ці діаграми такі важливі? Ці часові ряди відображаються впродовж ночі як зворотній зв’язок з користувачем і будуть зберігатися для перегляду / аналізу пізніше. Згладжування в ідеалі знизить вартість пам’яті (як оперативної пам’яті, так і пам’яті), а також зробить рендерінг швидше на цих телефонах / пристроях, де голодує ресурс.

Очевидно, що є кращий спосіб згладити дані. У мене є деякі нечіткі ідеї, такі як використання лінійної регресії для з'ясування "різких" змін у русі та модифікація мою середню згладжування відповідно. Мені справді потрібні ще кілька вказівок і вкладів, перш ніж зануритися головою в те, що можна вирішити більш оптимально.

Спасибі!

Відповіді:


16

По-перше, вимоги до стиснення та аналізу / презентації необов’язково однакові - дійсно, для аналізу ви можете зберегти всі необроблені дані та мати можливість нарізати та нарізати їх різними способами. А те, що найкраще працює для вас, дуже залежатиме від того, що ви хочете з нього вийти. Але є ряд стандартних хитрощів, які ви можете спробувати:

  • Використовуйте відмінності, а не необроблені дані
  • Використовуйте порогове значення для видалення шуму низького рівня. (Поєднайте з розрізненням, щоб ігнорувати невеликі зміни.)
  • Використовуйте відхилення протягом деякого часового вікна, а не середнього, щоб захопити рівень активності, а не руху
  • Змініть базу часу з фіксованих інтервалів на прогони змінної довжини і накопичіть в одній послідовності точок даних зміни, щодо яких дотримується деякий критерій (наприклад, різниці в одному напрямку, до деякого порогу)
  • Перетворіть дані з реальних значень у порядкові (наприклад, низький, середній, високий); Ви також можете це зробити на часових скриньках, а не на окремих зразках - наприклад, рівень активності на кожні 5 хвилин
  • Використовуйте відповідне згортання ядра *, щоб згладити більш тонко, ніж ваш ковзний середній розмір, або вибрати функції, що цікавлять вас, наприклад, різкі зміни.
  • Використовуйте бібліотеку FFT для обчислення спектру потужності

Останнє може бути трохи дорогим для ваших цілей, але, ймовірно, дасть вам кілька дуже корисних варіантів презентації, з точки зору "ритмів сну" тощо. (Я майже нічого не знаю про Android, але можливо, що деякі / багато / всі телефони можуть бути вбудовані в апаратне забезпечення DSP, яким ви можете скористатися.)


* З огляду на те, наскільки центральною є технологія цифрової обробки сигналів, знайти доступний вступ в Інтернеті напрочуд важко. Або хоча б за 3 хвилини гугла. Пропозиції Ласкаво просимо!


10

Існує багато непараметричних алгоритмів згладжування, включаючи сплайни та льоси. Але вони згладять і раптові зміни. Так само будуть фільтри низьких частот. Я думаю, що вам може знадобитися плавніше на основі вейвлетів, яке дозволяє раптові стрибки, але все-таки згладжує шум.

Перевірте Персіваль і Уолден (2000) і пов'язаного з ним R пакет . Хоча ви хочете рішення java, алгоритми в пакеті R є відкритим кодом, і ви, можливо, зможете їх перекласти.


3

Це дещо дотично до того, що ви запитуєте, але, можливо, варто поглянути на фільтр Кальмана.


1

Згладжування Савіцького-Голая може бути хорошою відповіддю. Це надзвичайно ефективна реалізація згладжування найменших квадратів у розсувному часовому вікні (згортання над цими даними), що зводиться до простого множення даних у кожному часовому вікні на фіксовані константи. Ви можете встановити значення, похідні, другі похідні та вище.

Ви вибираєте, наскільки колючими ви дозволяєте отримувати результати, виходячи з розміру розсувного часового вікна та ступеня розміщення полінома на цьому часовому вікні. Це було спочатку розроблено для хроматографії, де піки є невід'ємною частиною результатів. Однією бажаною властивістю згладжування СГ є те, що місця розташування вершин зберігаються. Наприклад, вікно від 5 до 11 точок з кубічною кривою зменшує шум, але все ще зберігає вершини.

У Вікіпедії є хороша стаття, хоча вона називається фільтром Савіцкого-Голая (що робить незначне насильство до звичайної термінології з теорії управління системами та аналізу часових рядів, а також оригінальної статті, де її правильно називають згладжуванням). Також пам’ятайте, що в статті Вікіпедії є (аргумент) помилка щодо формул для другого похідного оцінювання - див. Розділ «Розмова» цієї статті. EDIT: Стаття у Вікіпедії була виправлена

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.