2.4 主线

 

原值的波动可能比较频繁,但整体上呈现某一种趋势,主线就是描述这种趋势的衍生序列。

通俗的讲,将原值平滑后就可以描述原值的趋势。平滑化最常见的手段的就是平均,具体到时间序列就是移动平均。

时间序列X的主线M

mi=avg(X[-(l+1)]i+1)

SPL例程:


A

B

C

1

=data=file(“1Ddata.csv”).import@tci().to(100)

/时间序列X

2

=l=5

/区间l

3

=A1.(if(#<=l,null,(s=~[-l:-1],avg(s))))

/主线M

A3格中计算主线M

思考:尝试用SPL实现线性加权移动平均和指数加权移动平均。

计算结果示例:

..

图中横轴是序列索引,纵轴是原值X的取值。图例中X是原值,M是主线。(前5个时刻没有主线,图中只画了后95个时刻的主线)

移动平均方便计算,平滑效果也不错,但缺点也很明显,比如主线上的每个点都是之前某个区间所有值的平均,这就必然导致主线整体延迟于原值,即原值开始下降时,主线可能还保持原来的状态,延迟一段时间后主线才会下降。这会导致异常发现不够及时,对即时性要求高的场景不太适合选用此方法。

我们再换一种方法计算主线。

主线要表征原值的信息,所以原则上要与原值接近;主线还要平滑,所以相邻点也要接近。假设已经计算出主线,我们把主线与原值的绝对差之和称为原值距离,主线上相邻点的绝对差之和称为主线距离。合适的主线应该使这两种距离都尽量小,那么对这两类距离加权合计后求其最小值即可得到合适的主线M

这种方法计算的主线将权衡两类距离,延迟效应不明显,及时性很好,适合对即时性要求高的场景。但它也有自己的缺点,计算复杂度相较于移动平均高不少,对计算效率要求高的场景要慎用。

1. 计算距离

主线距离是主线上相邻两点的距离(差的平方和)的总和,记为MD

MD=sum(mi-mi-1)2

原值距离是主线与原值的距离(差的平方和)的总和,记为VD

VD=sum(mi-xi)2

2. 两类距离加权后的最小值

设置平衡系数k来平衡两类距离的权重,则总距离D

D=VD+k*MD

3. 优化mi使总距离D最短

对每个mi求偏导:

..

转换后的问题变为解多元线性方程问题。

系数矩阵用Cm表示

..

矩阵中未填写数值处都是0

Cm*M=X

解上述方程就得到了主线M

M=linefit(Cm,X)

其中linefit()是解线性方程的函数。

平衡系数k调节两类距离的权重,k越大,主线距离MD占比越大,主线越平滑,k越小,原值距离VD占比越大,主线越接近原值。当k=0时,主线就是原值。当k=∞时,主线是一个常数,常数值等于原值的平均值。

SPL例程:


A

B

C

1

=data=file(“1Ddata.csv”).import@tci().to(100)

/时间序列X

2

=k=10

/平衡系数k

3

=ln=data.len()

/序列长度

4

=A1.(if(#==1,[k+1,-k].insert(0,(ln-#-2).(0)),

if(#==ln,(#-2).(0).insert(0,[-k,k+1]),

(#-2).(0).insert(0,[-k,2*k+1,-k]).insert(0,(ln-#-1).(0)))))

/系数矩阵Cm

5

=linefit(A4,A1).conj()

/最小二乘法算主线

A4格构造系数矩阵Cm

A5格计算主线序列M

计算结果示例:

..

图中横轴是序列索引,纵轴是原值X的取值。图例中X是原值,M是主线。