剔除集合中过大过小的异常值

一个集合X中可能存在过大或过小的异常值,希望计算一个范围,剔除集合X中过大或过小的异常值,这个范围的上下限就是阈值,较大值称为阈值上限,记为threshold_up,较小值称为阈值下限,记为threshold_down

X=[x1,x2,…,xn]

算法原理

集合中只有少数是异常值,如果把X中的点看作空间中的点,则某个点距离其他点都很远时认为该点是异常值,正常值取值范围就是正常值中最小值到最大值的范围。

计算过程

1.        计算每个xi与其他所有值的绝对差的和,称为半径,记为R

..

其中ri是半径序列R的第i个元素。

2.        记录下R中的元素从小到大排序后的索引序列,记为R_psort

3.        最小半径min_r和最大半径max_r

min_r=RR_psort(1)

max_r= RR_psort (-1)

其中R_psort(1)R_psort序列中的第一个(同R_psort1),R_psort(-1) R_psort序列中的最后一个。

4.        如果max_rmin_r大一个数量级(max_rmin_r*10)则把大于min_r*5以上的半径对应的xi剔除。

(1)     大于min_r*5的索引min_r5_pos

min_r5_pos=j,RR_psort(j)min_r*5

(2)     按索引剔除X序列中的数,得到X_new

X_new=X\XR_psort(jmin_r5_pos)

其中R_psort(jmin_r5_pos)R_psort中所有不小于min_r5_pos的索引集合。

(3)     X_new重复1,2,3,4,直到不满足max_rmin_r*10

5.        设最小半径的倍数为n(默认n=2,n5),称为半径倍数,找到半径大于min_r*n的索引min_rn_pos

min_rn_pos= j,RR_psort(j)>min_r*n

6.        min_rn_pos之前的xi为正常值序列,称为阈值序列,记为X_normal

X_normal=XR_psort (jmin_rn_pos-1)

7.        计算阈值上下限threshold_upthreshold_down

threshold_up= max(X_normal)

threshold_down= min(X_normal)

写出代码:


A B C D
1 =seq

/集合X
2 =up_down
/上限或下限
3 =n

/半径倍数n
4 =func(A7,seq,up_down,n)

5 return A4
/返回结果
6 /计算阈值,参数:序列,上限或下限,半径
7 func


8
=if(B7=="up",func(A10,A7,C7),func(A15,A7,C7)) /如果取上限就取阈值序列的最大值,下限就取阈值序列的最小值
9 /计算阈值上限

10 func


11
=A10.select(~)
/过滤 null
12
if B11==[]
return null
13
=func(A20,B11,B10).max()
/X_normal.max()
14 /计算阈值下限

15 func


16
=A15.select(~)
/过滤 null
17
if B16==[]
return null
18
=func(A20,B16,B15).min()
/ X_normal.min()
19 /计算阈值序列,参数:序列,半径倍数
20 func


21
=A20.((v=~,A20.(abs(v-~))).sum()) /R
22
=B21.psort()
/R_psort
23
if B21(B22(1))*10<B21(B22.m(-1)) =B22.pselect(B21(~)>=B21(B22(1))*5)

/如果 max_r>min_r*10

min_r5_pos

24

=A20\(A20(B22.m(C23:))) /去掉大于 min_r*5 的值
25

return func(A20,C24,B20)
26
else =B21(B22(1))*B20 /min_r*n
27

=(gt_min=B22.pselect(B21(~)>C26),if(!gt_min,A20.len(),gt_min-1)) /min_rn_pos
28

=A20(B22.to(C27)) /X_normal

输入参数说明:

1.      A1中的seq是输入集合X

2.      A2中的up_down是计算上限还是下限的参数。

up_down=up”时,计算阈值上限;

up_down=down”时,计算阈值下限。

3.      A3中的n是半径倍数n

2n5

n越大正常值的取值范围越大,即阈值上限越大,阈值下限越小。

算法效果实例

1.      把集合X和不同半径倍数n条件下的阈值上下限画在图上如下:

..

图中横轴是每个值的索引,纵轴是X中值的大小。图右侧的图例说明

X:集合X

X_n2_upn=2时的阈值上限

X_n2_downn=2时的阈值下限

X_n2.5_upn=2.5时的阈值上限

X_n2.5_downn=2.5时的阈值下限

X_n3_upn=3时的阈值上限

X_n3_downn=3时的阈值下限

不大于阈值上限且不小于阈值下限的值就是X中的正常值。