Как обнаружить значительные изменения/тренды в данных временных рядов?

Итак, у меня есть массив из 25 образцов, и я хотел бы иметь возможность отметить тенденции снижения или n из этих 25 выборочных интервалов времени (в основном 25 массивов выборок - это мой буфер, который заполняется каждым скажем, 1 мс).

Обратите внимание, что это общая тенденция, которую я ищу, а не отдельная производная (как я бы получил, используя методы конечной разности или другие методы численного дифференцирования).

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

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

Спасибо заранее!

Ответ 1

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

Вам наверняка понадобится сглаживающий фильтр (и фильтр скользящей средней отлично - см. Bjorn answer для этой части).

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

Если базовая статистика ваших временных рядов стабильна (стационарные временные ряды), вы можете использовать фиксированный статистический порог в смысле стандартных отклонений от среднего. Например, вы можете выбрать 2 стандартных отклонения, если вы хотите достаточно сильный порог "тревоги" (думаю, тревожат только самые сильные 5% от прибыли).

Если в основной проблеме нет ничего, что говорит о том, что ваш временной ряд стабилен, т.е. если у серии может быть тенденция к ней, или основной процесс, генерирующий временные ряды, может проходить через изменения фонда, пока вы его контролируете, то вам нужно будет использовать динамический или адаптивный порог в смысле сигнала-шума (mu/sigma). Затем вы можете определить все "значимые" элементы, которые проходят тест на шум.

Ответ 2

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

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

http://blog.bjornroche.com/2012/08/basic-audio-eqs.html

Ответ 3

Вы можете использовать фильтр wiener, если вы знаете статистику сигнала и используете его как предиктор на шаг вперед. Тогда ваше решение тренда может быть легко основано на предсказании фильтра wiener. Если сигнал не является широкоугольным и вы считаете, что предсказание невозможно выполнить линейно (нелинейный/нестационарный процесс), тогда вы можете использовать адаптивный фильтр wiener, например LMS.