Каковы хорошие алгоритмы для обнаружения аномалий? - PullRequest
13 голосов
/ 22 сентября 2010

Фон

Вот проблема:

  1. Черный ящик выводит новый номер каждый день.
  2. Эти числа были записаны в течение определенного периода времени..
  3. Обнаружение, когда новое число из черного ящика выходит за рамки чисел, установленных за период времени.

Числа являются целыми числами, а период времени - годом.

Вопрос

Какой алгоритм будет определять шаблон в числах?

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

Идеи

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

  • Машинное обучениеАлгоритмы?
  • Нейронные сети?
  • Классифицировать нормальные и ненормальные числа?
  • Статистический анализ?

Ответы [ 3 ]

5 голосов
/ 29 сентября 2010

Кластеризация ваших данных .

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

Если это кажется слишком сложным, вы будете рады узнать, что вся процедура GMM + BIC для автоматической идентификации кластера была реализована для вас в пакете превосходный MCLUST для R . Я использовал его несколько раз с большим успехом для таких проблем.

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

3 голосов
/ 23 сентября 2010

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

Затем вы можете вычислить производные величины, относящиеся к этим функциям. Например: «Я хочу обнаружить, что числа резко меняют направление» => вычислить u_ {n + 1} - u_n и ожидать, что он будет иметь постоянный знак или попадать в некоторый диапазон. Возможно, вы захотите сохранить эту гибкость и позволить своему дизайну кода быть расширяемым (шаблон стратегии, возможно, стоит рассмотреть, если вы выполните ООП)

Затем, когда у вас есть интересующие вас производные величины, вы выполняете их статистический анализ. Например, для производной величины A вы предполагаете, что она должна иметь некоторое распределение P (a, b) (равномерное ([a, b]) или Beta (a, b), возможно, более сложное), вы ставите априорные законы на а, б и вы настраиваете их на основе последовательной информации. Затем последующая вероятность информации, предоставленной последним добавленным пунктом, должна дать вам некоторое представление о том, нормально это или нет. Относительная энтропия между задним и предшествующим законом на каждом шаге - это тоже хорошая вещь для мониторинга. Обратитесь к книге о байесовских методах для получения дополнительной информации.

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

3 голосов
/ 23 сентября 2010

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

PCA - это еще один метод, который приходит на ум при работе с данными такого типа.

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

Звучит как забавная проблема! Удачи

...