时序数据异常检测问题中,涉及异常阈值的动态预测场景。检索到算法Dynamic Thresholding,该阈值计算方法在工程应用中实现成本较低;多个阈值计算过程无数据依赖,可拆分并行计算提高效率;时间窗口计算思想与Flink实时计算框架中的窗口一致,利于技术对接
原作论文 Kyle Hundman, Valentino Constantinou, Christopher Laporte, Ian Colwell, and Tom Soderstrom. Detecting Spacecraft Anomalies Using LSTMs and Nonparametric Dynamic Thresholding. KDD, 2018.
开源地址 https://github.com/khundman/telemanom
核心思想1:对序列模型的预测值和真实值误差进行建模
使用LSTM预测时序序列数据,得到一个时序误差序列窗口
\scriptsize
\textbf{e} = [e^{(t-h)},\dots,e^{(t-l_s)},\dots,e^{(t-1)},e^{t}]
为抑制LSTM预测值陡然突变,使用指数加权平滑误差序列窗口值
\scriptsize \mathbf{e_s} = [e_{s}^{(t-h)},\dots,e_{s}^{(t-l_s)},\dots,e_{s}^{(t-1)},e_{s}^{t}]
核心思想2:对最近误差进行统计学分析预估异常阈值
使用上述窗口数据的均值和标准差估计阈值,通过枚举z计算一个初始阈值
\scriptsize \mathbf{\epsilon} = \mu(\mathbf{e_s}) + \mathbf{z}\sigma(\mathbf{e_s})
将上述枚举得到的各初始阈值作为异常数据判定标准,带入下式得到结果:大多数数据在阈内,同时阈外数据对序列离散程度贡献较大的情况会在下式取得大值,反映出较好的异常数据区分度。因此结果最大的初始阈值定为最终阈值
\scriptsize
\mathbf{\epsilon} =
argmax{(\mathbf{\epsilon})} =
\frac{\Delta \mu(\mathbf{e_s})/ \mu(\mathbf{e_s}) + \Delta \sigma(\mathbf{e_s})/ \sigma(\mathbf{e_s})}
{|\mathbf{e_a}|+|\mathbf{E_{seq}}|^2}\\
\Delta \mu(\mathbf{e_s}) = \mu(\mathbf{e_s}) - \mu(\{e_s \in \mathbf{e_s}|e_s \lt \epsilon\})\\
\Delta \sigma(\mathbf{e_s}) = \sigma(\mathbf{e_s}) - \sigma(\{e_s \in \mathbf{e_s}|e_s \lt \epsilon\})\\
\mathbf{e_a} = \{e_s \in \mathbf{e_s}|e_s \gt \epsilon\}\\
E_{seq} = continuous\ sequences\ of\ e_a \in \mathbf{e_a}
论文使用下式衡量异常值的偏离严重程度
\scriptsize
s^{(i)} =
\frac{max(\mathbf{e^{(i)}_{seq})} - argmax(\mathbf\epsilon)}
{\mu(\mathbf{e_s})+\sigma(\mathbf{e_s})}