Простой алгоритм онлайн-определения выбросов общего временного ряда - PullRequest
11 голосов
/ 02 августа 2010

Я работаю с большим количеством временных рядов.Эти временные ряды в основном представляют собой измерения сети, проводимые каждые 10 минут, и некоторые из них являются периодическими (т. Е. Пропускная способность), а некоторые другие - нет (т. Е. Объем трафика маршрутизации).Алгоритм выполнения онлайн "обнаружения выбросов".По сути, я хочу сохранить в памяти (или на диске) полные исторические данные для каждого временного ряда, и я хочу обнаружить любой выброс в реальном сценарии (каждый раз, когда захватывается новый образец).Каков наилучший способ достижения этих результатов?

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

double outlier_detection(double* vector, double value);

где вектор - массив значений типа double, содержащий исторические данные, а возвращаемое значение - показатель аномалии для новой выборки «значение».

Ответы [ 2 ]

9 голосов
/ 02 августа 2010

Это большой и сложный вопрос, и ответ будет зависеть от (а) того, сколько усилий вы хотите вложить в это и (б) насколько эффективно вы хотите, чтобы ваше обнаружение выброса было. Одним из возможных подходов является адаптивная фильтрация , которая обычно используется для таких приложений, как наушники с шумоподавлением и т. Д. У вас есть фильтр, который постоянно адаптируется к входному сигналу, эффективно сопоставляя его коэффициенты фильтра с гипотетической краткосрочной моделью источник сигнала, тем самым уменьшая среднеквадратичную ошибку вывода. Это затем дает вам выходной сигнал низкого уровня (остаточная ошибка) за исключением для случая, когда вы получаете выброс, который приведет к всплеску, который будет легко обнаружить (порог). Читайте о адаптивной фильтрации , LMS-фильтрах и т. Д., Если вы серьезно относитесь к этому виду техники.

1 голос
/ 24 ноября 2016

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

Обучение

  • Соберите как можно больше сэмплов в памяти
  • Удалите очевидные выбросы, используя стандартное отклонение для каждого атрибута
  • Рассчитать и сохранить матрицу корреляции, а также среднее значение каждого атрибута
  • Рассчитайте и сохраните расстояния Махаланобиса всех ваших образцов

Расчет "выброса":

Для единичного образца, из которого вы хотите узнать его «внешность»:

Это будет ваш показатель выбросов: 100% - это экстремальный выброс.


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