Подтвердить что ты не робот

Простой алгоритм обнаружения онлайн-обнаружения общего временного ряда

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

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

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

double outlier_detection(double* vector, double value);

где vector - это массив двойных, содержащий исторические данные, а возвращаемое значение - это показатель аномалий для нового образца "значение".

4b9b3361

Ответ 1

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

Ответ 2

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

Обучение

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

Вычисление "outlierness":

Для единственного образца, о котором вы хотите узнать его "outlierness":

  • Извлеките средства, ковариационную матрицу и Расстояние Махаланобиса от обучения
  • Рассчитайте расстояние Mahalanobis "d" для вашего образца
  • Возвратите процентиль, в котором падает "d" (используя расстояния Махаланобиса от обучения).

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


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