5.6 连续多形状发现
我们已经实现发现单形状曲线段的方法,有时我们还需要发现两种形状甚至更多形状连续出现的复合形状,比如先下降再平稳、先上升再平稳再下降等等。
还以之前的时间序列为例,找出先下降再平稳的曲线段。下图蓝色曲线标出的部分是先下降再平稳段的大概位置。
下面介绍如何发现连续多形状曲线段。
1. 用发现单形状曲线段的方法找出各形状的曲线段索引。
Id(1)=H(arg1)=[Id(1)(1), Id(1) (2),…, Id(1) (p1)]
Id(2)=H(arg2)=[Id(2)(1), Id(2) (2),…, Id(2) (p2)]
…
Id(k) =H(argk)=[Id(k)(1), Id(k) (2),…, Id(k) (pk)]
Ids=[ Id(1)(1), Id(1) (2),…, Id(1) (p1), Id(2) (1),…, Id(2) (p2),…, Id(k)(1),…, Id(k) (pk)]
其中Id(i)是第i种形状的索引集合,Id(i) (j)是Id(i) 的第j段曲线, H(…)是发现单形状曲线段的函数,argi是第i种形状的参数。
2. 将Ids按索引顺序排序Idst。
Idst=Ids.sort(~(1))
Idst是按每个Id(i) (j)中第一个元素排序的索引集合。
3. 找出Idst中与所需形状顺序相同且间隔不远的连续形状索引Idst’。
Idst’1=[Id(1)(s1), Id(2)(t1),…, Id(k)(u1)]
Idst’2=[Id(1)(s2), Id(2)(t2),…, Id(k)(u2)]
…
Idst’v=[Id(1)(s2), Id(2)(t2),…, Id(k)(u2)]
其中Idst’i是第i段连续形状曲线段的索引集合,每一段都是k个形状的索引集合且相邻两个形状的索引间隔不远,即后一段形状的第一个索引和前一段形状的最后一个索引相隔不远,以第一段连续形状的索引集合为例:
Id(2)(t1)(1)-Id(1)(s1)(-1)<ε
Id(2)(t1)(1)是第2种形状t1段的第一个索引,Id(1)(s1).m(-1)是第1种形状s1段的最后一个索引,ε是一个比较小的值,可以作为参数,保证两个形状在时间序列X上是相邻的。
4. 按连续形状的索引取时间序列的数据
连续形状的索引应该是连续的,所以把第一种形状的第一个索引到第k种形状的最后一个索引作为连续形状曲线段的索引。
spi=X(to(Id(1)(si)(1), Id(k)(ui).m(-1)))
spi是第i段连续形状,Id(1)(si)(1)是第一种形状第i段的第1个索引,Id(k)(ui).m(-1)是第k种形状第i段的最后一个索引。
SPL例程
时间序列数据不变,发现先下降再平稳的曲线段。
需要拟合主线M并计算升降指数L。
参数设置:
观察级别K’
K’=600
两种形状需要两套参数
下降段特征指数名组合Nm1
Nm1=[“L”]
平稳端特征指数名组合Nm2
Nm2=[“L”]
下降段取值范围Ag1
Ag1=[[-1,-0.1]]
平稳段取值范围Ag2
Ag2=[[-0.1,0.1]]
下降段形状长度范围dut1
dut1=[100,10000]
平稳段形状长度范围dut2
dut2=[100,10000]
两段形状间隔ε
ε=180
SPL例程
A |
B |
|
1 |
=file(“1Ddata.csv”).import@tc() |
/包含时间序列X的序表 |
2 |
600 |
/K' |
3 |
[L] |
/Nm1 |
4 |
[[-1,-0.1]] |
/Ag1 |
5 |
[100,10000] |
/dut1 |
6 |
[L] |
/Nm2 |
7 |
[[-0.1,0.1]] |
/Ag2 |
8 |
[100,10000] |
/dut2 |
9 |
180 |
/ε |
10 |
=A1.(Value) |
/时间序列X |
11 |
=2*power(4,lg(A2/15,2)-1) |
/平衡系数K |
12 |
=fit_main(A10,A11) |
/主线M |
13 |
=A2/40 |
/指数区间k |
14 |
=Lift(A12,A13) |
/升降指数L |
15 |
=[A14.min(),A14.max()] |
/升降指数最大最小值 |
16 |
=[A15] |
/特征指数最大最小值 |
17 |
=A1.derive(A14(#):L) |
/序表T |
18 |
=A4.((idx=#,~.(arg_throw(~,A16(idx)(2),A16(idx)(1))))) |
/下降段参数投射 |
19 |
=A3.(~/">="/"number("/$[A18(]/#/$[)(1)]/")"/"&&"/~/"<="/"number("/$[A18(]/#/$[)(2)]/")").concat("&&") |
/下降段筛选条件 |
20 |
=A17.pselect@a(eval(A19)) |
|
21 |
=A20.group@u(~-#) |
|
22 |
=A21.select(~.len()>=A5(1)&&~.len()<=A5(2)) |
/下降段索引结合Id(1) |
23 |
=A7.((idx=#,~.(arg_throw(~,A16(idx)(2),A16(idx)(1))))) |
/平稳段参数投射 |
24 |
=A6.(~/">="/"number("/$[A23(]/#/$[)(1)]/")"/"&&"/~/"<="/"number("/$[A23(]/#/$[)(2)]/")").concat("&&") |
/平稳段筛选条件 |
25 |
=A17.pselect@a(eval(A24)) |
|
26 |
=A25.group@u(~-#) |
|
27 |
=A26.select(~.len()>=A8(1)&&~.len()<=A8(2)) |
/平稳段索引结合Id(2) |
28 |
=[A22,A27] |
/Ids |
29 |
=A28.conj((idx=#,~.new(~:seq,idx:seq_idx))) |
/不同形状曲线段索引 |
30 |
=A29.sort(seq) |
/排序Idst |
31 |
=A30.group@u(seq_idx-#) |
/相邻分组 |
32 |
=A31.select(~.len()==A28.len()&&(ss=~.(seq),ss(2)(1)-ss(1).m(-1)<=A9)) |
/筛选间隔足够小的分组Idst’ |
33 |
=A32.((sq=~.(seq).conj(),to(sq.~,sq.m(-1)))) |
/满足要求的曲线段 |
34 |
=A33.(A10(~)) |
/指定形状Sp |
计算结果示例:
找出来的连续形状符合预期。