首页 > 解决方案 > 如何找到数据的集体异常?

问题描述

我有一个带有时间戳和值的数据。我需要使用无监督算法找到集体异常。

# DD MM YYYY HH mm 值
0 14 02 2014 14 27 51.846
1 14 02 2014 14 32 44.508
2 14 02 2014 14 37 41.244
3 14 02 2014 14 42 48.568
4 14 02 2014 14 47 46.714
5 14 02 2014 14 52 44.986
6 14 02 2014 14 57 49.108
7 14 02 2014 15 02 40.470
8 14 02 2014 15 07 53.404
9 14 02 2014 15 12 45.400
10 14 02 2014 15 17 43.216
11 14 02 2014 15 22 49.720
12 14 02 2014 15 27 46.370
13 14 02 2014 15 32 43.756
14 14 02 2014 15 37 47.582
15 14 02 2014 15 42 40.738
16 14 02 2014 15 47 51.216

我曾尝试使用 X 均值的多阶段聚类来处理数值数据。但是这里的时间戳似乎令人困惑。任何帮助,将不胜感激。

标签: pythonanomaly-detection

解决方案


也许聚类不是解决这个特定问题的最佳方法。我喜欢尽可能保持简单。

对于您的问题,我建议使用指数移动平均值来平滑数据,测量滚动偏差,并在当前值与预期值相差太远时将条目标记为异常。

https://en.wikipedia.org/wiki/Moving_average#Exponential_moving_average

这是您的数据(标记为蓝色),上面绘制了指数移动平均值(alpha 为 0.5)。使用指数移动平均线的优势变得很明显,它允许数据逐渐变化,同时抑制任何突然的变化。

在此处输入图像描述

我会做什么:

  • 根据时间戳对数据进行排序
  • 应用指数移动平均线来获得曲线的连续近似值
  • 检查新/下一个值时,将其与 EMA 进行比较
  • 如果该值超出 [EMA - std_dev, EMA + std_dev] 那么您可以将其归类为异常

调整参数:

  • 阿尔法(在 EMA 中使用)
  • 使用 std_dev ?或者也许先将 std_dev 与某个系数相乘?

推荐阅读