Рекомендуемый метод обнаружения аномалий для простого одномерного сценария?

StackOverflow https://stackoverflow.com/questions/2303510

  •  21-09-2019
  •  | 
  •  

Вопрос

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

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

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

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

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

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


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

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

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

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


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

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

Это было полезно?

Решение

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

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


Редактировать:

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

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

Более подходящей техникой является DBSCAN - СЕРВЕР DBSCAN:алгоритм кластеризации, основанный на плотности.В основном он выращивает области с достаточно высокой плотностью в кластеры, которые будут представлять собой максимальный набор точек, связанных с плотностью.

dbscan_clustering

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

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

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

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

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

Другие советы

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

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

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

Часто используются как правило трех сигм, так и тест 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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top