推荐的异常检测技术用于简单的一维场景?

时间:2010-02-20 20:05:20

标签: machine-learning classification

我有一个场景,我有几千个数据实例。数据本身表示为单个整数值。我希望能够检测到一个实例何时是一个极端异常值。

例如,使用以下示例数据:

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

d显然是一个异常现象,我希望在此基础上执行特定的操作。

我很想尝试使用我对特定领域的知识来检测异常。例如,找出与有用的平均值的距离,并根据启发式检查。但是,我认为如果我研究更一般的,强大的异常检测技术可能会更好,这些技术背后有一些理论。

由于我对数学的工作知识有限,我希望找到一种简单的技术,例如使用标准偏差。希望数据的单维特性会使这成为一个常见问题,但如果需要更多信息,请发表评论,我会提供更多信息。


编辑:我想我会添加更多有关数据的信息以及我尝试过的内容,以防它使一个答案比另一个更正确。

值均为正数且非零。我希望这些值会形成正态分布。这种期望是基于域的直觉而不是通过分析,如果这不是一件坏事,请告诉我。在聚类方面,除非还有标准算法来选择k值,否则我会发现很难将这个值提供给k-Means算法。

我想对异常值/异常采取的操作是将其呈现给用户,并建议基本上从数据集中删除数据点(我不会了解他们将如何做到这一点,但是它对我的域有意义,因此它不会被用作另一个函数的输入。

到目前为止,我已经尝试了三西格玛,并且我的有限数据集上的IQR异常值测试。 IQR标记的值不够极端,三西格玛指出的实例更符合我对域的直觉。


有关此特定方案的算法,技术或资源链接的信息是有效和受欢迎的答案。

对于简单的一维数据,推荐的异常检测技术是什么?

3 个答案:

答案 0 :(得分:43)

查看three-sigma rule

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

另一种方法是IQR outlier test

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

这个测试通常由Box plots使用(由胡须指示):

boxplot


修改

对于您的情况(简单的一维单变量数据),我认为我的第一个答案非常适合。 然而,这不适用于多变量数据。

@smaclell建议使用K-means来查找异常值。除了主要是聚类算法(实际上不是异常检测技术)之外,k-means的问题在于它需要事先知道聚类K的数量的良好值。

更适合的技术是DBSCAN:基于密度的聚类算法。基本上,它将具有足够高密度的区域生长成簇,这将是密度连接点的最大集合。

dbscan_clustering

DBSCAN需要两个参数:epsilonminPoints。它从一个尚未访问过的任意点开始。然后它会找到起点距离epsilon内的所有邻居点。

如果邻居的数量大于或等于minPoints,则形成一个集群。将起点及其邻居添加到此群集,并将起始点标记为已访问。然后,算法递归地重复所有邻居的评估过程。

如果邻居数量少于minPoints,则该点标记为噪声

如果群集已完全展开(访问范围内的所有点都已访问),则算法将继续迭代剩余的未访问点,直到它们耗尽为止。

最后,标记为噪音的所有点的集合被视为异常值

答案 1 :(得分:2)

您可以使用各种群集技术来尝试识别数据中的中心趋势。我在模式识别过程中大量使用的一种算法是K-Means。这将允许您识别是否存在多个相关数据集,例如bimodal distribution。这确实需要您了解期望的簇数,但是效率高且易于实现。

在你拥有了手段后,你可以尝试找出是否有任何一点远离任何手段。您可以根据需要定义“远”但我会推荐@Amro的建议作为一个很好的起点。

有关群集算法的更深入讨论,请参阅群集上的wikipedia条目。

答案 2 :(得分:0)

经常使用三西格玛规则和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