Сглаживание данных временных рядов


14

Я создаю приложение для Android, которое записывает данные акселерометра во время сна, чтобы анализировать тенденции сна и, по желанию, будить пользователя в нужное время во время легкого сна.

Я уже построил компонент, который собирает и хранит данные, а также сигнализацию. Мне все еще нужно разобраться с чудовищем отображения и сохранения данных сна действительно значимым и ясным способом, который предпочтительно также поддается анализу.

Пару картинок говорят две тысячи слов: (Я могу опубликовать только одну ссылку из-за низкой репутации)

Вот нефильтрованные данные, сумма движения, собранная с интервалом в 30 секунд

И те же данные, сглаженные моим собственным проявлением сглаживания скользящей средней

редактировать) обе диаграммы отражают калибровку - есть минимальный «шумовой» фильтр и максимальный фильтр отсечки, а также уровень срабатывания сигнализации (белая линия)

К сожалению, ни одно из этих решений не является оптимальным - первое довольно сложно понять для среднего пользователя, а второе, которое легче понять, скрывает многое из того, что происходит на самом деле. В частности, усреднение удаляет детали всплесков движения, и я думаю, что они могут быть значимыми.

Так почему же эти графики так важны? Эти временные ряды отображаются в течение ночи в качестве обратной связи с пользователем и будут сохранены для последующего просмотра / анализа. Сглаживание в идеале снизит стоимость памяти (как оперативной памяти, так и хранилища) и ускорит рендеринг на этих телефонах / устройствах с нехваткой ресурсов.

Очевидно, что есть лучший способ сгладить данные - у меня есть некоторые смутные идеи, такие как использование линейной регрессии для определения «резких» изменений в движении и изменение сглаживания моей скользящей средней в соответствии с этим. Мне действительно нужно больше руководства и информации, прежде чем я углублюсь в то, что можно решить более оптимально.

Благодарность!

Ответы:


16

Во-первых, требования к сжатию и анализу / представлению не обязательно одинаковы - действительно, для анализа вам может потребоваться сохранить все необработанные данные и иметь возможность разрезать и нарезать их различными способами. И то, что работает для вас лучше всего, будет зависеть от того, что вы хотите от этого получить. Но есть ряд стандартных приемов, которые вы можете попробовать:

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

Последнее может быть немного дороже для ваших целей, но, вероятно, даст вам несколько очень полезных вариантов презентации, с точки зрения «ритмов сна» и тому подобного. (Я почти ничего не знаю об Android, но возможно, что некоторые / многие / все телефоны могли иметь встроенное аппаратное обеспечение DSP, которым вы можете воспользоваться.)


* Учитывая то, как важна свертка цифровой обработки сигналов, на удивление сложно найти доступное вступление онлайн. Или, по крайней мере, в течение 3 минут поиска в Google. Предложения приветствуются!


10

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

Проверьте Персиваль и Уолден (2000) и связанного с ним R пакет . Хотя вам нужно решение Java, алгоритмы в пакете R имеют открытый исходный код, и вы можете их перевести.


3

Это несколько касательно того, что вы спрашиваете, но, возможно, стоит взглянуть на фильтр Калмана.


1

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

Вы выбираете, насколько резкими будут результаты, основываясь на размере скользящего временного окна и степени подгонки полинома к этому временному окну. Первоначально он был разработан для хроматографии, где пики являются важной частью результатов. Одним желательным свойством сглаживания SG является то, что положения пиков сохраняются. Например, окно от 5 до 11 точек с кубической кривой подгоняет шум, но сохраняет пики.

Там хорошая статья в Википедии, хотя он упоминается как Савицкий-Голея фильтр (делая небольшое насилие к нормальной терминологии из теории управления систем и анализа временных рядов, а также оригинальной работе, где он правильно называется сглаживанием). Также имейте в виду, что в статье в Википедии есть (аргумент выше) ошибка с формулами для оценок второй производной - см. Раздел «Обсуждение» для этой статьи. РЕДАКТИРОВАТЬ: статья в Википедии была исправлена

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.