34

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

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

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

d显然是异常,我想基于此执行特定操作。

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

由于我的数学工作知识有限,我希望找到一种简单的技术,例如使用标准差。希望数据的单维性质将使这成为一个相当普遍的问题,但如果需要有关该场景的更多信息,请发表评论,我将提供更多信息。


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

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

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

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


有关用于了解此特定场景的算法、技术或资源链接的信息是有效且受欢迎的答案。

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

4

3 回答 3

47

查看三西格玛规则

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

此测试通常用于箱线图(由胡须表示):

箱形图


编辑:

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

@smaclell建议使用 K-means 来查找异常值。除了它主要是一种聚类算法(不是真正的异常值检测技术)之外,k-means 的问题在于它需要提前知道聚类数量 K 的一个好的值。

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

dbscan_clustering

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

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

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

如果集群完全扩展(访问范围内的所有点),则算法继续遍历剩余的未访问点,直到它们被耗尽。

最后,标记为噪声的所有点的集合被认为是异常值

于 2010-02-20T20:21:01.837 回答
2

您可以使用多种聚类技术来尝试识别数据中的中心趋势。我们在模式识别课程中大量使用的一种算法是K-Means。这将允许您确定是否存在多个相关数据集,例如双峰分布。这确实需要您对预期的集群数量有所了解,但相当有效且易于实施。

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

有关聚类算法的更深入讨论,请参阅关于聚类的维基百科条目。

于 2010-02-20T20:24:12.830 回答
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
于 2014-11-26T18:15:49.047 回答