Рекомендуемая техника обнаружения аномалий для простого одномерного сценария? - PullRequest
29 голосов
/ 20 февраля 2010

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

Например, со следующими данными примера:

a = 10
b = 14
c = 25
d = 467
e = 12

d - это явно аномалия, и я бы хотел выполнить на ее основе определенное действие.

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

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


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

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

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

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


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

Каков рекомендуемый метод обнаружения аномалий для простых одномерных данных?

Ответы [ 3 ]

43 голосов
/ 20 февраля 2010

Ознакомьтесь с правилом трех сигм :

mu  = mean of the data
std = standard deviation of the data
IF abs(x-mu) > 3*std  THEN  x is outlier

Альтернативным методом является IQR-тест выбросов :

Q25 = 25th_percentile
Q75 = 75th_percentile
IQR = Q75 - Q25         // inter-quartile range
IF (x < Q25 - 1.5*IQR) OR (Q75 + 1.5*IQR < x) THEN  x is a mild outlier
IF (x < Q25 - 3.0*IQR) OR (Q75 + 3.0*IQR < x) THEN  x is an extreme outlier

Этот тест обычно используется Графики на ячейках (обозначены усами):

boxplot


EDIT:

Для вашего случая (простые одномерные одномерные данные) я думаю, что мой первый ответ хорошо подходит. Однако это не относится к многомерным данным.

@ smaclell предложил использовать K-средства, чтобы найти выбросы. Помимо того факта, что это в основном алгоритм кластеризации (на самом деле это не метод обнаружения выбросов), проблема с k-means заключается в том, что он требует заранее знать правильное значение для числа кластеров K.

Лучше всего подходит метод DBSCAN : алгоритм кластеризации на основе плотности. По сути, он выращивает области с достаточно высокой плотностью в кластеры, которые будут максимальным набором точек, связанных плотностью.

dbscan_clustering

Для DBSCAN требуются два параметра: epsilon и minPoints. Это начинается с произвольной точки, которая не была посещена. Затем он находит все соседние точки на расстоянии epsilon от начальной точки.

Если число соседей больше или равно minPoints, образуется кластер. Начальная точка и ее соседи добавляются в этот кластер, а начальная точка отмечается как посещенная. Затем алгоритм рекурсивно повторяет процесс оценки для всех соседей.

Если число соседей меньше minPoints, точка помечается как noise .

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

Наконец, набор всех точек, помеченных как шум, считается выбросами .

2 голосов
/ 20 февраля 2010

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

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

Более подробное обсуждение алгоритмов кластеризации см. В статье wikipedia о кластеризации.

0 голосов
/ 26 ноября 2014

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

The three-sigma rule is correct
mu  = mean of the data
std = standard deviation of the data
IF abs(x-mu) > 3*std  THEN  x is outlier

Тест IQR должен быть:

Q25 = 25th_percentile
Q75 = 75th_percentile
IQR = Q75 - Q25         // inter-quartile range
If x >  Q75  + 1.5 * IQR or  x   < Q25 - 1.5 * IQR THEN  x is a mild outlier
If x >  Q75  + 3.0 * IQR or  x   < Q25 – 3.0 * IQR THEN  x is a extreme outlier
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...