对于简单的一维场景,推荐使用异常检测技术吗?
classification
machine-learning
7
0

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

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

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

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

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

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


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

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

我要针对异常值/异常情况采取的措施是将其呈现给用户,并建议基本上从数据集中删除数据点(我不会了解他们的操作方式,但这很有意义(对于我的域),因此它将不会用作其他函数的输入。

到目前为止,我已经在有限的数据集上进行了三西格玛和IQR离群值测试。 IQR标志的值不够极端,三个西格玛指出了一些实例,这些实例更符合我对域的直觉。


有关算法,技术或与资源链接的信息,以了解此特定场景是有效且值得欢迎的答案。

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

参考资料:
Stack Overflow
收藏
评论
共 2 个回答
高赞 时间 活跃

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

有了手段之后,您就可以尝试找出是否有任何手段与任何手段相距甚远。您可以根据需要定义“远”,但我建议使用@Amro作为建议。

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

收藏
评论

查看三西格玛规则

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均值查找异常值。除了它主要是一个聚类算法(不是真正的离群值检测技术)外,k均值的问题还在于它需要事先知道一个很好的聚类数K值。

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

dbscan_clustering

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

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

如果邻居数小于minPoints ,则将该点标记为noise

如果群集已完全扩展(访问了范围内的所有点),则算法将迭代遍历其余未访问的点,直到耗尽为止。

最后,标记为噪声的所有点的集合被视为离群值

收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号