1.7 通道阈值调整

 

对于大多数数据来说,百分比阈值调整法都可以满足需求,但有一些特殊数据是它无能为力的,如下图这个时间序列:

..

图中时间序列前半段数据都在80附近,后半段突然下降,调整后稳定在73附近,直觉上调整的过程是异常时段,其他时段都可以认为是正常。

先按原来的参数发现异常:

学习区间k=100

距离法半径倍数n=2

阈值差百分比dst=0

..

发现的异常符合算法的逻辑,80附近的突变点的确属于少数,可以认为是异常,但相较于调整时段的变化幅度,这样的变化根本不算什么,可以认为是正常的。

观察tutd,两者在前半段相差很小,甚至相等,此时用百分比阈值调整法是无法调整异常度的。

下图是dst=0.3的异常发现结果:

..

可以发现dst几乎没有作用,面对这类数据应该怎么做呢?

对于这类数据,我们允许时间序列X中的值在某个范围内变化,无论其在该范围内怎么变化,都认为是正常的。如上图的数据,允许数据的变化范围不超过0.5,就像一个“管道”似的,只要数据在这个宽度的“管道”内,都可以认为是正常的,将这个管道称为通道,用ch表示。利用通道调整阈值的方法称为通道阈值调整法

通道阈值调整法也很简单:当xi大于tu时且td+ch也大于tu时,将tu调整为tu’=td+ch;当xi小于td时且tu-ch也小于td时,将td调整为td’=tu-ch

tu’=if(xi>tu&&td+ch>tu, td+ch,tu)

td’=if(xi<td&&tu-ch<td, tu-ch,td)

这样就可以保证在通道ch内,xi都是正常的。

SPL


A

B

1

=file(C1).import@tci()

/时间序列X

2

100

/学习区间k

3

2

/半径倍数

4

0.5

/ch

5

=A1.(if(#<=A2,,Threshold(~[-A2:-1],"up",A3)))

/阈值上限

6

=A1.(if(#<=A2,,Threshold(~[-A2:-1],"down",A3)))

/阈值下限

7

=to(A2+1,A1.len())

/有效X索引

8

=A1(A7)

/有效X

9

=A5(A7)

/tu

10

=A6(A7)

/td

11

=A9.(if(A8(#)>~&&A10(#)+A4>~,A10(#)+A4,~))

/tu'

12

=A10.(if(A8(#)<~&&A9(#)-A4<~,A9(#)-A4,~))

/td'

13

=A8.((a=max(~-A11(#),A12(#)-~,0),b=(A11(#)-A12(#)),if(a==0,0,if(b==0,1,a/b))))

/异常度Od

计算结果示例:

..

从图中可以看到,在通道内的数据都是正常了,也符合我们的直观判断。