我正在尝试使用 Python 和 sklearn 在 time#series 之间进行一些异常检测(但绝对欢迎其他软件包建议!)。
我有一组 10 个时间序列;每个时间序列都包含从轮胎的扭矩值收集的数据(总共 10 个轮胎),并且集合可能包含不同数量的数据点(集合大小不同)。每个时间序列数据几乎只是轮胎 ID、时间戳和 sig_value(来自信号或传感器的值)。一个时间序列的样本数据如下所示:
tire_id timestamp sig_value
tire_1 23:06.1 12.75
tire_1 23:07.5 0
tire_1 23:09.0 -10.5
现在我有 10 个,其中 2 个表现得很奇怪。我知道这是一个异常检测问题,但我在网上阅读的大多数文章都是在同一时间序列内检测异常点(也就是说,如果在某些时候该轮胎的扭矩值不正常)。
为了检测哪两个轮胎表现异常,我尝试使用聚类方法,基本上是 k-means 聚类(因为它是无监督的)。
为了准备数据以输入 k-means 聚类,对于每个时间序列(也就是每个轮胎),我计算了:
- 前 3 组相邻的局部最大值和幅度最大的局部最小值(差值)
- 扭矩值的平均值
- 扭矩值的标准偏差
我还将集群的数量设置为只有 2,所以集群 1 或 2。
所以我的最终结果(分配集群后)如下所示:
amplitude local maxima local minima sig_value_std \
tire_0 558.50 437.75 -120.75 77.538645
tire_0 532.75 433.75 -99.00 77.538645
tire_0 526.25 438.00 -88.25 77.538645
tire_1 552.50 -116.50 436.00 71.125912
tire_1 542.75 439.25 -103.50 71.125912
sig_value_average cluster
tire_0 12.816990 0
tire_0 12.816990 0
tire_0 12.816990 0
tire_1 11.588038 1
tire_1 11.588038 0
现在我有一个关于如何处理这个结果的问题......所以每个轮胎都有 3 行数据,因为我选择了前 3 对具有 3 个最大幅度的局部最大值/最小值,这意味着每一行都可以分配到一个集群,有时甚至为 1 个轮胎分配到不同的集群。此外,集群大小通常大于 2。
我的问题是:
- 如何对“时间序列集”进行异常检测,而不仅仅是单个数据点?
- 我的方法合理/合乎逻辑吗?如果是,我怎样才能清理我的结果以获得我想要的?如果没有,我能做些什么来改进?