時系列予測: Slide Windows Methos (C)青山智夫、宮崎大学工学部
slide windowのNNプログラム(digital Fortran v.6)を公開する。
sw.forはこの方法を理解するためのプログラムで、sin(x)の外挿をします。
データも自動生成します。結果はSwtest.xlsです。コメントを読んでください。
Note-1: 階層型NN(multi-layer neural network)による時系列(time-series)データの予測,、slide windows methodについて
この方法の仮定:
1. 時系列データは等時間間隔にサンプリングされている。
2. 過去のデータを集合と考え、その集合を部分集合に分けたとき、その部分集合に未来を予測するデータ成分(関係ではない)が含まれる。
具体的方法:
時系列データを{x0,x1,x2,.....xN}とする。部分集合をたとえば{x0,x1,x2,x3,x4},{x1,x2,x3,x4,x5},{x2,x3,x4,x5,x6},......
とする。次に{x0,x1,x2,x3},{x1,x2,x3,x4},....をNNの入力データ、{x4},{x5},.....を教師データとしてBP学習する。
この学習が可能なのは、部分集合の要素の間の距離が~0でないことである。
学習が完了したNNに{......,xN}を入力して出力される{xN+1}がNNの予測である。
{xN+1}が得られると{....,xN,xN+1}が得られ、それはNNの入力データになるから、さらに{xN+2}が得られる。よってiterativeな予測が可能である。
当然この方法は周期的な現象に適する。実際f(x)=sin(x)やその線形結合関数の予測をするとほとんど完璧な予測ができる。しかも非常に長期の予測が可能である。逆に時間発展現象に対しては威力が発揮できない。
時間発展現象に対しては普通のfunction fittingと同じ近似になる。
増加/減少関係をパターンにして学習すれば(たとえばx0とxiの差分を学習すれば)時間発展現象も予測できるが本来のslide window methodのNNと組合せなければならない。
1 step先だけ予測し次々に測定されている筈の実測データを繰り込んでいく予測を、1 step predictionと言い、NNのslide window method予測にも採用可能である。1 step predictionを短期予測、iterativeにずーと予測する本来の方法を長期予測ともいう。
slide window methodの精度を支配する要因
部分集合{x0,x1,x2,x3,....xM}、window width=M の決定
データ数N
適切な隠れ層のニューロン数
以上
SW.FORプログラム・ソース リスト
c This is a program to understand the slide-window method.
c The program includes time-series data ganarator.
C Program: NR4.FOR(version 3), 1995.5.18 このプログラムはPC-9801, MS-FORTRAN 5.1で書かれた
C それをdigital Fortranにリメイクした。 2000.6.3, 2003.11.29: Tomoo AOYAMA
C NPTN:max.input patterns =< 65
C N60 :max.neurons of the input-layer =< 41
C N25 :max.neurons of the hidden-layer =< 30
C N10 :max.neurons of the output-layer =< 4
C WX :weight matrix between 1st, 2nd layer
C WY :weight matrix between 2nd, 3rd layer
C XIN :rescaled input data Cf. setP routine
C TE :teaching data Cf. gendat, setP routines
C
C MOPT(1): output list modify cf. PCBK1 routine
c MOPT(20)=NWIN(cf. setP)=slide-window's width
c MOPT(19)=NPTN= number of learning data
c XOPT(3)= termination condition for back-propagation :BPの終了閾値(default:0.0009)
c the main is to set neural network parameters.
IMPLICIT REAL*8 (A-H,O-Z)
COMMON/ARRAYS/XIN(41,65),WX(41,30),H(30),WY(30,4),
1 O(4),DFO(4),DH(30),TE(4,65),TMIN(4),TFAC(4)
COMMON/GAB/ETM,XOPT(20)
COMMON/CTL/N60,N25,N10,NPTN,EPS,EPSH,MOPT(20)
COMMON EX(41)
C base data for random number generation
COMMON/RNDBS/IB,IM,IA,JM,XF
INTEGER*4 IB,IM,IA,JM
IB=173453
IM=37
IA=1
JM=1000000
XF=1./DFLOAT(JM)
OPEN (6,FILE='sw.txt',STATUS='NEW',FORM='FORMATTED')
c default values: eps, epsh are larning coefficients for BP
EPSH=0.2
EPS=EPSH/2.0
DO 77 I=1,20
77 MOPT(I)=0
MOPT(1)=200
c slide-window's width
MOPT(20)=8
c intitial set the number of larning data
c the number is changed as NPTN-"slide window width"
MOPT(19)=21
c
DO 78 I=1,20
78 XOPT(I)=0.0
XOPT(3)=0.00001
C
WRITE(6,90)
90 FORMAT(' NR4(v.3)')
c call NN driver
call NNe(XIN,WX,H,WY,O,DFO,DH,TE,TMIN,TFAC)
c
STOP
END
c NN driver
subroutine NNe(XIN,WX,H,WY,O,DFO,DH,TE,TMIN,TFAC)
implicit real*8 (A-H,O-Z)
dimension XIN(41,65),WX(41,30),H(30),WY(30,4),O(4),
1 DFO(4),DH(30),TE(4,65),TMIN(4),TFAC(4)
c eee= interpolation/extrapolation values
dimension eee(60)
data jj/0/
if(jj.eq.0)then
CALL gendat(TE)
CALL setP(XIN,TE)
CALL LSTP(XIN,TE)
CALL INIT(WX,WY)
c LMTITR= limit number of BP-learning
LMTITR=9001
endif
c BP-learing
CALL PCBK1(LMTITR,XIN,WX,H,WY,O,TE,DFO,DH)
c interpolation (to check original precision of slide-window method)
CALL INTERPOL(eee,XIN,WX,H,WY,O,TE,TMIN,TFAC)
c extrapolation (it is not short-term prediction but long-term)
CALL EXTPOL(eee,XIN,WX,H,WY,O,TE,TMIN,TFAC)
return
end
SUBROUTINE INTERPOL(eee,XIN,WX,H,WY,O,TE,TMIN,TFAC)
c 学習期間再現確認ルーチン
IMPLICIT REAL*8 (A-H,O-Z)
dimension XIN(41,65),WX(41,30),H(30),WY(30,4),O(4),
1 DFO(4),DH(30),TE(4,65),TMIN(4),TFAC(4)
COMMON/GAB/ETM,XOPT(20)
COMMON/CTL/N60,N25,N10,NPTN,EPS,EPSH,MOPT(20)
dimension eee(60)
c
NWIN=MOPT(20)
N60M=N60-1
WRITE(*,410)
c WRITE(6,410)
410 FORMAT(' interpolation')
C
DO 100 IPTN=1,NPTN
DO 200 I=1,N25
S=0.
DO 210 J=1,N60
S=S+WX(J,I)*XIN(J,IPTN)
210 CONTINUE
H(I)=1.0/(1.0+DEXP(-S))
200 CONTINUE
DO 220 I=1,N10
S=0.
DO 230 J=1,N25
S=S+WY(J,I)*H(J)
230 CONTINUE
O(I)=S
220 CONTINUE
eee(IPTN)=O(1)
W=eee(IPTN)-TE(2,IPTN+NWIN)
WRITE(*,420)IPTN,eee(IPTN),W
420 FORMAT(1x,I3,':',2G15.6)
WRITE(6,421)IPTN,eee(IPTN),W
421 FORMAT(I3,2G15.6)
c ENDDO
100 CONTINUE
RETURN
END
SUBROUTINE EXTPOL(eee,XIN,WX,H,WY,O,TE,TMIN,TFAC)
c 長期予測ルーチン
IMPLICIT REAL*8 (A-H,O-Z)
dimension eee(60)
dimension XIN(41,65),WX(41,30),H(30),WY(30,4),O(4),
1 DFO(4),DH(30),TE(4,65),TMIN(4),TFAC(4)
COMMON/GAB/ETM,XOPT(20)
COMMON/CTL/N60,N25,N10,NPTN,EPS,EPSH,MOPT(20)
COMMON EX(41)
c
NWIN=MOPT(20)
N60M=N60-1
WRITE(*,410)
c WRITE(6,410)
410 FORMAT(' extrapolation')
C 外挿のための初期ベクトル作成 to create initial vector for the predictions
DO I=2,N60M
EX(I-1)=XIN(I,NPTN)
ENDDO
EX(N60M)=TE(1,NPTN)
C この要素は定数(バイアス)this is a bias neuron
EX(N60)=1.0
C ここから外挿計算 hereafter, calculations of extrapolation
DO 100 IPTN=1,NWIN*2
DO 200 I=1,N25
S=0.
DO 210 J=1,N60
S=S+WX(J,I)*EX(J)
210 CONTINUE
H(I)=1.0/(1.0+DEXP(-S))
200 CONTINUE
DO 220 I=1,N10
S=0.
DO 230 J=1,N25
S=S+WY(J,I)*H(J)
230 CONTINUE
O(I)=S
220 CONTINUE
eee(IPTN)=O(1)
w=eee(IPTN)-TE(2,NWIN+IPTN +NPTN)
WRITE(*,420)IPTN+NPTN,eee(IPTN),w
420 FORMAT(I3,':',2G15.6)
WRITE(6,421)IPTN+NPTN,eee(IPTN),w
421 FORMAT(I3,2G15.6)
C 外挿用の次のベクトル作成 for next step, creating a vector (: window's data)
DO I=2,N60M
EX(I-1)=EX(I)
ENDDO
EX(N60M)=O(1)
100 CONTINUE
RETURN
END
c wait-routine for debug, nornally it is not used.
subroutine wait0
write(*,90)
90 format(' waitting now')
read(*,100)i
100 format(i1)
return
end
SUBROUTINE gendat(TE)
C data generator: f(x)=(sin(x)+1)/2, 0<x<6pi
c please, to test various time-series phenomena, you change the routine.
IMPLICIT REAL*8 (A-H,O-Z)
dimension TE(4,65)
N=65
PI=0.5*3.141592653589793
DX=PI/(N-1)
DO 100 I=1,N
X=DX*(I-1)
TE(1,I)=(DSIN(X)+1.0)*0.5
100 CONTINUE
RETURN
END
SUBROUTINE LSTP(XIN,TE)
C rescaled input data listing
IMPLICIT REAL*8 (A-H,O-Z)
dimension XIN(41,65),TE(4,65)
COMMON/GAB/ETM,XOPT(20)
COMMON/CTL/N60,N25,N10,NPTN,EPS,EPSH,MOPT(20)
DIMENSION IM(20)
WRITE(*,128)
c WRITE(6,128)
128 FORMAT(' input data')
DO 100 J=1,NPTN
DO 110 I=1,N60
110 IM(I)=9.99*XIN(I,J)
c WRITE(6,130)J,(IM(I),I=1,N60)
WRITE(*,130)J,(IM(I),I=1,N60)
130 FORMAT(1X,I3,2X,49I1)
100 CONTINUE
c WRITE(*,1100)
c READ(*,1110)I
WRITE(*,129)
c WRITE(6,129)
129 FORMAT(' teaching data')
DO 105 J=1,NPTN
c WRITE(6,137)J,(TE(I,J),I=1,N10)
WRITE(*,137)J,(TE(I,J),I=1,N10)
137 FORMAT(1X,I3,2X,10G14.6)
105 CONTINUE
c
c WRITE(*,1100)
c 1100 FORMAT(' push return key')
c READ(*,1110)I
c 1110 FORMAT(I5)
C
RETURN
END
SUBROUTINE INIT(WX,WY)
C WX, WY matrix initialize by using random number
IMPLICIT REAL*8 (A-H,O-Z)
dimension WX(41,30),WY(30,4)
COMMON/GAB/ETM,XOPT(20)
COMMON/CTL/N60,N25,N10,NPTN,EPS,EPSH,MOPT(20)
COMMON/RNDBS/IB,IM,IA,JM,XF
INTEGER*4 IB,IM,IA,JM
C
DO 100 J=1,N25
DO 100 I=1,N60
IB=IB*IM+IA
IB=MOD(IB,JM)
100 WX(I,J)=(XF*DFLOAT(IB)-0.5)*0.2
DO 110 J=1,N10
DO 110 I=1,N25
IB=IB*IM+IA
IB=MOD(IB,JM)
110 WY(I,J)=(XF*DFLOAT(IB)-0.5)*0.2
C
RETURN
END
SUBROUTINE setP(XIN,TE)
C pattern setting routine, generation of slide-windows
IMPLICIT REAL*8 (A-H,O-Z)
dimension XIN(41,65),TE(4,65)
COMMON/CTL/N60,N25,N10,NPTN,EPS,EPSH,MOPT(20)
NWIN=MOPT(20)
NPTN=MOPT(19)
write(6,306)NPTN,NWIN
306 format(' setP: org.NPTN, NWIN=',2I8)
C window 処理1: ここで入力データを作る creation of "input data" of NN
NPTN=NPTN-NWIN
WRITE(*,301)NPTN
c WRITE(6,301)NPTN
301 FORMAT(' renew.NPTN=',I3)
DO IPTN=1,NPTN
DO I=1,NWIN
XIN(I,IPTN)=TE(1,I+IPTN-1)
ENDDO
ENDDO
C window 処理2: ここで教師データを作る creation of teaching data
C 答え合わせ用データを作る
DO IPTN=1,65
TE(2,IPTN)=TE(1,IPTN)
ENDDO
DO IPTN=1,NPTN
TE(1,IPTN)=TE(2,IPTN+NWIN)
ENDDO
C N10 is the number of output layer neurons. it must be 1
N10=1
C N25 is the number of second layer neurons. it is determined experimentally.
C in case of simple waves, N25 should be 6--8.
c you should check excess-learning on large N25.
N25=6
c N60 is 1st layer's neurons. It includes a bias neuron.
N60=NWIN+1
WRITE(*,430)N60,N25,N10
c WRITE(6,430)N60,N25,N10
430 FORMAT(' N60,N25,N10=',3I8)
DO 410 J=1,NPTN
410 XIN(N60,J)=1.0
C
900 RETURN
END
SUBROUTINE RSCAL(TE,TMIN,TFAC)
C rescaling of the teaching data
c the routine is not used now.
IMPLICIT REAL*8 (A-H,O-Z)
dimension TE(4,65),TMIN(4),TFAC(4)
COMMON/GAB/ETM,XOPT(20)
COMMON/CTL/N60,N25,N10,NPTN,EPS,EPSH,MOPT(20)
XMIN=10000.
XMAX=-XMIN
I=1
DO 320 J=1,NPTN
IF(TE(I,J).GT.XMAX)XMAX=TE(I,J)
IF(TE(I,J).LT.XMIN)XMIN=TE(I,J)
320 CONTINUE
WRITE(*,321)I,XMAX,XMIN
c WRITE(6,321)I,XMAX,XMIN
321 FORMAT(' RSCAL, DATA',I3,2X,'(MAX,MIN)=',2F12.4)
TFAC(I)=1.0/(XMAX-XMIN)
DO 340 J=1,NPTN
340 TE(I,J)=(TE(I,J)-XMIN)*TFAC(I)
TMIN(I)=XMIN
C
c WRITE(*,360)TMIN(I)
c WRITE(6,360)TMIN(I)
c 360 FORMAT(' TMIN=',5G13.5)
c WRITE(*,361)TFAC(I)
c WRITE(6,361)TFAC(I)
c 361 FORMAT(' TFAC=',5G13.5)
C
RETURN
END
SUBROUTINE PCBK1(LMTITR,XIN,WX,H,WY,O,TE,DFO,DH)
C execution of the back propagation
C LMTITR=number of the iteration
c neuron emulate functions are sigmoid (for the 2nd layer) and linear (for output layer)
c it is not normal 3-layer NN.
c This type NN has following characters:
c 1. first learning, 2. extrapolation function, 3. less non-linear-fitting ability, i.e.,
c the NN is hardly trapped by excess-learning
IMPLICIT INTEGER*4 (I-N)
IMPLICIT REAL*8 (A-H,O-Z)
dimension XIN(41,65),WX(41,30),H(30),WY(30,4),O(4),
1 DFO(4),DH(30),TE(4,65)
COMMON/GAB/ETM,XOPT(20)
COMMON/CTL/N60,N25,N10,NPTN,EPS,EPSH,MOPT(20)
C
DO 90 ITER=1,LMTITR
C
ERM=-10000.
DO 100 IPTN=1,NPTN
C
DO 200 I=1,N25
S=0.
DO 210 J=1,N60
S=S+WX(J,I)*XIN(J,IPTN)
210 CONTINUE
H(I)=1.0/(1.0+DEXP(-S))
200 CONTINUE
C
DO 220 I=1,N10
S=0.
DO 230 J=1,N25
S=S+WY(J,I)*H(J)
230 CONTINUE
C O(I)=1.0/(1.0+DEXP(-S))
O(I)=S
220 CONTINUE
C
S=0.
DO 320 I=1,N10
W=O(I)-TE(I,IPTN)
C DFO(I)=W*O(I)*(1.0-O(I))
DFO(I)=W
320 S=S+W*W
ERR=S
C
DO 360 I=1,N25
S=0.
DO 361 J=1,N10
361 S=S+WY(I,J)*DFO(J)
360 DH(I)=S*H(I)*(1.0-H(I))
DO 350 I=1,N10
W=-EPS*DFO(I)
DO 350 J=1,N25
350 WY(J,I)=WY(J,I)+W*H(J)
DO 370 I=1,N25
W=-EPSH*DH(I)
DO 370 J=1,N60
370 WX(J,I)=WX(J,I)+W*XIN(J,IPTN)
C
IF(ERR.GT.ERM)ERM=ERR
100 CONTINUE
C
IF(ERM.LT.XOPT(3))go to 9999
90 CONTINUE
c
WRITE(6,400)ITER,ERM
400 FORMAT(1x,I6,', max.BP.err=',F14.6)
C
9999 RETURN
END
sin(x)予測結果:
sin(6x), 0<x<2pi, を65点でサンプリングし、1-21点を学習期間、window幅を8とした。
21-8=13が学習期間である。これは予測のための十分なデータが学習期間にある場合である。

1-13までが学習期間、それ以上はNNの予測である。
真値との差は:

学習期間1-13の誤差は+/-0.005以下で、予測になると+/-0.02となり約4倍の誤差となる。
関数fittingによる予測と違い誤差が∞にいかないのが特徴である。
以下、予測のためのデータを減じるとどうなるかを示す。
6pi=3periods, 3*21(学習期間)/65=97%, 予測誤差=0.02, 2%(+16step先) 高精度予測、当然である
5pi=2.5periods, 81%, 0.05, 5%(+16step先)
4pi=2periods, 65%, 0.08 (+6step先)
3pi=1.5, 48%, 0.08 (+6step)
2pi=1.0, 32%, 0.09 (+3step) NNでも学習期間に将来を予測する成分が無いと、予測不能ということである
0.5pi=0.25, 0.035 (+16step) 関数がf(x)=xに似ているため、予測精度があがる
slide windowは65%とかなり未来を予測するデータが少なくなっても、高精度の予測をします。
その理由は:
SW.FOR NN予測プログラムは、隠れ層ニューロン関数sigmoid、出力層線形関数です。
NN全体では∑(sigmoid関数)*係数 という近似になってる(*)ので、
原則sigmoid関数によってどのような非線形関数も近似できるはずです。
しかし実際はiteration学習なのでそういかない。
どうしてもsigmoid関数に良く似た関数、sin(x)や線形関数に近似してしまいます。
線形関数に近似するということは、予測を接線方向に延長するということなので、悪くない近似です。
普通人間はそうします。
(*) このNNは数学的にはRBFと同じです。
学習期間に未来を予測する十分な情報がないとき、現象の性質を使って、情報を補強することもできます。
sin(x)はy→-yという変換に対称なので、slide windows+symmetry操作による予測が可能です。
sym操作とは: {x0,x1,...}と{1-x0,1-x1,....}が対になっていると考え、補データ{1-x0,1-x1,....}を学習すること。
学習期間
2pi=1.0, 32%, 0.09 (+16step) sym操作により予測精度の向上が見られる
1.5pi=0.75, 24%, 0.09 (+15step)
1pi=0.5, 16%, 0.06 (+16step)
0.5pi=0.25, 0.07 (+16step) sym操作により予測精度が少し悪くなる

sym操作による予測。F(x)=sin(x), 0<x<2pi(65点),学習期間は1-21点
したがって必要な未来予測情報の32%しかない。
上図の14—がNNによる予測である。誤差は

予測期間14—は次第に増大していくが、十分な精度(10%以下)で予測できている。