检测时间序列中的步骤

机器算法验证 时间序列 变化点
2022-03-07 05:33:47

我附上了我正在谈论的时间序列的图片。上为原系列,下为差异系列。

每个数据点是来自应变仪的 5 分钟平均读数。该应变仪放置在机器上。嘈杂区域对应机器开启的区域,清洁区域对应机器关闭的区域。如果您查看红色圈出的区域,我希望能够自动检测到读数中的异常步骤。

我完全不知道我怎么能做到这一点——有什么想法吗?

在此处输入图像描述

3个回答

看来您正在寻找相对安静区间内的尖峰“相对”是指与典型的附近值相比,这表明对序列进行平滑处理稳健平滑是可取的,因为它不应该受到一些局部尖峰的影响。“安静”意味着平滑度附近的变化很小。同样,需要对局部变化进行稳健的估计。最后,“尖峰”将是一个很大的残差,是局部变化的倍数

为了实现这个秘诀,我们需要选择(a)“附近”的接近程度,(b)平滑的秘诀,以及(c)寻找局部变化的秘诀。您可能需要对 (a) 进行试验,因此让我们将其设为易于控制的参数。(b) 和 (c) 的良好、现成的选择分别是LowessIQR这是一个R实现:

library(zoo)                      # For the local (moving window) IQR
f <- function(x, width=7) {       # width = size of moving window in time steps
    w <- width / length(x)
    y <- lowess(x, f=w)           # The smooth
    r <- zoo(x - y$y)             # Its residuals, structured for the next step
    z <- rollapply(r, width, IQR) # The running estimate of variability
    r/z                           # The diagnostic series: residuals scaled by IQRs
}

作为其使用示例,请考虑这些模拟数据,其中两个连续的尖峰被添加到一个安静期(连续两个尖峰应该比一个孤立的尖峰更难检测):

> x <- c(rnorm(192, mean=0, sd=1), rnorm(96, mean=0, sd=0.1), rnorm(192, mean=0, sd=1))
> x[240:241] <- c(1,-1) # Add a local spike
> plot(x)

模拟数据

这是诊断图:

> u <- f(x)
> plot(u)

诊断图

尽管原始数据中存在所有噪声,但该图很好地检测到了中心的(相对较小的)尖峰。 通过扫描较大的值(绝对值大于约 5:实验以查看最适合样本数据的值)来自动检测。f(x)

> spikes <- u[abs(u) >= 5]
      240       241       273 
 9.274959 -9.586756  6.319956

在时间 273 的虚假检测是一个随机的局部异常值。 您可以通过修改以同时查找诊断的高值和运行 IQR 的低值来优化测试以排除(大多数)此类虚假值然而,尽管诊断具有通用(无单位)的规模和解释,“低”IQR 的含义取决于数据的单位,并且必须根据经验确定。fr/zz

这是一个两分钱的建议。

表示Xt不同的系列。给定Δ>0和一点t, 定义

a(Δ,t)=12Δ+1|Xt|.

让我们说Δ=50, 的价值a(Δ,t)通过低/高值表征关闭/开启区域。

异常步骤是一个点t在哪里|Xt|>αa(Δ,t)- 你需要做一些调整α,Δ检测您想要什么,并避免机器开机时出现误报。我会先尝试Δ=50α=4.

或者,您可以查看点t在哪里a(δ,t)>αa(Δ,t)为一个δΔ(例如δ=10,Δ=100),这可能有助于微调(在这种情况下,你会为α)。

如果您确实知道机器状态 - 开或关,这是一个重要的输入,可以作为回归模型解决,或者更具体地说是控制模型。

我对应变模型了解不多,但曲线让我想起了电路的一些物理模型,比如霍奇金赫胥黎方程或更一般地,您可以通过回归来估计一阶微分方程YiXi,Xi1, 和Yi1在哪里Xi是当时的机器状态i(开,关)和Yi是时间序列图中 y 轴上的幅度(或其他)。

使用已知的物理模型,您可以计算残差,并轻松使用聚类或其他方法来识别这些异常时期。例如,一个简单的 boxcar 过滤器可用于识别平均残差超过某个阈值的时间段,该阈值使用分类器开发技术进行识别。