我附上了我正在谈论的时间序列的图片。上为原系列,下为差异系列。
每个数据点是来自应变仪的 5 分钟平均读数。该应变仪放置在机器上。嘈杂区域对应机器开启的区域,清洁区域对应机器关闭的区域。如果您查看红色圈出的区域,我希望能够自动检测到读数中的异常步骤。
我完全不知道我怎么能做到这一点——有什么想法吗?
我附上了我正在谈论的时间序列的图片。上为原系列,下为差异系列。
每个数据点是来自应变仪的 5 分钟平均读数。该应变仪放置在机器上。嘈杂区域对应机器开启的区域,清洁区域对应机器关闭的区域。如果您查看红色圈出的区域,我希望能够自动检测到读数中的异常步骤。
我完全不知道我怎么能做到这一点——有什么想法吗?
看来您正在寻找相对安静区间内的尖峰。“相对”是指与典型的附近值相比,这表明对序列进行平滑处理。稳健的平滑是可取的,因为它不应该受到一些局部尖峰的影响。“安静”意味着平滑度附近的变化很小。同样,需要对局部变化进行稳健的估计。最后,“尖峰”将是一个很大的残差,是局部变化的倍数。
为了实现这个秘诀,我们需要选择(a)“附近”的接近程度,(b)平滑的秘诀,以及(c)寻找局部变化的秘诀。您可能需要对 (a) 进行试验,因此让我们将其设为易于控制的参数。(b) 和 (c) 的良好、现成的选择分别是Lowess和IQR。这是一个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 的含义取决于数据的单位,并且必须根据经验确定。f
r/z
z
这是一个两分钱的建议。
表示不同的系列。给定和一点, 定义
让我们说, 的价值通过低/高值表征关闭/开启区域。
异常步骤是一个点在哪里- 你需要做一些调整检测您想要什么,并避免机器开机时出现误报。我会先尝试和.
或者,您可以查看点在哪里为一个(例如,),这可能有助于微调(在这种情况下,你会为)。
如果您确实知道机器状态 - 开或关,这是一个重要的输入,可以作为回归模型解决,或者更具体地说是控制模型。
我对应变模型了解不多,但曲线让我想起了电路的一些物理模型,比如霍奇金赫胥黎方程。或更一般地,您可以通过回归来估计一阶微分方程在,, 和在哪里是当时的机器状态(开,关)和是时间序列图中 y 轴上的幅度(或其他)。
使用已知的物理模型,您可以计算残差,并轻松使用聚类或其他方法来识别这些异常时期。例如,一个简单的 boxcar 过滤器可用于识别平均残差超过某个阈值的时间段,该阈值使用分类器开发技术进行识别。