1.6 百分比阈值调整
无论使用上述哪种方法,阈值上限tu、阈值下限td都是学习区间中的某一个数,这就会有一个问题,当xi大于其中的最大值或小于最小值时,xi就一定会被认为是异常。
有时我们希望当xi超限不多时,不认为它异常。处理方法也比较简单,只要放大tu、缩小td即可。利用tu和td之间差值的百分比来调整,设置tu和td之间差值的百分比为dst,调整后的阈值上限tu’、阈值下限td’这样计算:
tu’=tu+dst*(tu-td)
td’=td-dst*(tu-td)
理论上dst的范围是[-0.5, ∞],但通常需要调大tu和td之间的范围,即dst>0;dst特别大时,就不会发现异常了,所以通常不会大于1,dst常用的范围是[0,1]。
将利用阈值上下限之差百分比调整阈值的方法称为百分比阈值调整法。
SPL例程
时间序列X如下图:
利用距离法对X进行异常发现,计算各个点的异常度。
SPL例程
A |
B |
|
1 |
=file(C1).import@tci() |
/时间序列X |
2 |
100 |
/学习区间k |
3 |
2 |
/半径倍数 |
4 |
0 |
/dst |
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.((d=~-A10(#),~+A4*d)) |
/tu' |
12 |
=A10.((d=A9(#)-~,~-A4*d)) |
/td' |
13 |
=A8.((a=max(~-A11(#),A12(#)-~,0),b=(A11(#)-A12(#)),if(a==0,0,if(b==0,1,a/b)))) |
/异常度Od |
参数设置:
学习区间k=100;
距离法半径倍数n=2;
阈值差百分比dst=0。
图例中Value是X值,Value_up是tu序列,Value_low是td序列,warn是异常度Od,前100个点是学习区间,没有异常度,所以图中的时间序列长度是1900。
从图中可以看出异常时刻太多了,直觉上感觉没必要发现这么多,调整dst可以使一些异常度小的点不被发现。
设置dst=0.3
此时的tu变大,td变小,发现异常就不那么敏感了。