主要内容

深層学習を使用した時系列予測

この例では,長短期記憶(LSTM)ネットワークを使用して時系列データを予測する方法を説明します。

LSTMネットワークは,タイムステップでループ処理してネットワークの状態を更新することにより入力データを処理する再帰型ニューラルネットワーク(RNN)です。ネットワクの状態には,前のすべてのタムステップで記憶された情報が含まれています。LSTMネットワークを使用して,前のタイムステップを入力として使用して,時系列またはシーケンスの後続の値を予測できます。時系列予測用にLSTMネットワークに学習させるには,シーケンス出力で回帰用のLSTMネットワークに学習させます。ここで,応答(タゲット)は,1タムステップ分シフトした値を持学習シケンスとします。つまり,入力シーケンスの各タイムステップで,次のタイムステップの値を予測するようにLSTMネットワークに学習させます。

予測には,開ル,プ予測と閉ル,プ予測の2の方法があります。

  • 開ルプ予測では,入力デタのみを使用してシケンスの次のタムステップを予測します。後続のタイムステップの予測を行うときは,真の値をデータソースから収集し,それを入力として使用します。たとえば,1 ~ t - 1 のタムステップで収集されたデタを使用して,そのシケンスのタムステップ t の値を予測するとします。タ@ @ムステップ t + 1 の予測を行うには,タ t の真の値が記録されるまで待,それを入力として使用して次の予測を行います。次の予測を行う前にネットワ,クに提供する真の値がある場合は,開ル,プ予測を使用します。

  • 閉ルプ予測では,前の予測を入力として使用して,シケンスの後続のタムステップを予測します。この場合,モデルは予測を行うために真の値を必要としません。たとえば,1 ~ t - 1 のタムステップでのみ収集されたデタを使用して,シケンスのタムステップ t t + k の値を予測するとします。タ@ @ムステップ の予測を行うには,タ - 1 の予測値を入力として使用します。複数の後続のタイムステップを予測する場合,または次の予測を行う前にネットワークに提供する真の値がない場合には,閉ループ予測を使用します。

以下の图は、閉ル、プ予測を使用した予測値のシ、ケンスの例を示しています。

closedloop.png

この例では,波形デ,タセットを使用します。このデタセットには,3のチャネルの異なる波長の合成生成波形が2000個含まれます。この例では,閉ループ予測と開ループ予測の両方を使用して,前のタイムステップからの値を与えて波形の将来の値を予測するようLSTMネットワークに学習させます。

デ,タの読み込み

サンプルデ,タをWaveformData.matから読み込みます。デ,タは,numObservations行1列のシケンスのcell配列です。ここで,numObservationsはシ,ケンスの数です。各シ,ケンスはnumChannels-numTimeSteps列の数値配列です。ここで,numChannelsはシ,ケンスのチャネル数,numTimeStepsはシケンスのタムステップ数です。

负载WaveformData

最初のいくかのシケンスのサズを表示します。

数据(1:5)
ans =5×1单元格数组{3×103 double} {3×136 double} {3×140 double} {3×124 double} {3×127 double}

チャネル数を表示します。ネットワ,クに学習させるには,各シ,ケンスのチャネル数が同じでなければなりません。

numChannels = size(数据{1},1)
numChannels = 3

最初のいくかのシケンスをプロットに可視化します。

图tiledlayout (2, 2)nexttile stackkedplot (data{I}') xlabel(“时间步”结束

デ,タを学習セットとテストセットに分割します。観測値の90%を学習に使用し,残りをテストに使用します。

numObservations = numel(data);idxTrain = 1:地板(0.9*numObservations);idxTest = floor(0.9*numObservations)+1:numObservations;data(idxTrain);dataTest =数据(idxTest);

学習用デ,タの準備

シーケンスの将来のタイムステップの値を予測するには,1タイムステップ分シフトした値を持つ学習シーケンスとしてターゲットを指定します。つまり,入力シーケンスの各タイムステップで,次のタイムステップの値を予測するようにLSTMネットワークに学習させます。予測子は,最後のタ。

n = 1: number (dataTrain) X = dataTrain{n};XTrain{n} = X(:,1:end-1);TTrain{n} = X(:,2:结束);结束

良好な適合を実現し,学習の発散を防ぐには,ゼロ平均と単位分散を持つように予測子とターゲットを正規化します。予測を行うときは,学習デ,タと同じ統計を使用してテストデ,タも正規化しなければなりません。すべてのシーケンスについて平均値と標準偏差を簡単に計算するには,時間の次元でシーケンスを連結します。

muX = mean(cat(2,XTrain{:}),2);sigmaX = std(cat(2,XTrain{:}),0,2);muT = mean(cat(2,TTrain{:}),2);sigmaT = std(cat(2,TTrain{:}),0,2);n = 1: number (XTrain) XTrain{n} = (XTrain{n} - muX) ./ sigmaX;TTrain{n} = (TTrain{n} - muT) ./ sigmaT;结束

LSTMネットワ,クア,キテクチャの定義

LSTM回帰ネットワ,クを作成します。

  • 入力デタのチャネル数と一致する入力サズのシケンス入力層を使用します。

  • 128個の隠れユニットを持LSTM層を使用します。隠れユニットの数によって,層に学習させる情報量が決まります。より多くの隠れユニットを使用するほど正確な結果が得られますが,学習データの過適合につながる可能性が高くなります。

  • 入力データと同じチャネル数でシーケンスを出力するには,入力データのチャネル数と一致する出力サイズの全結合層を含めます。

  • 最後に,回帰層を含めます。

layers = [sequenceInputLayer(numChannels) lstmLayer(128) fullyConnectedLayer(numChannels) regressionLayer];

学習オプションの指定

学習オプションを指定します。

  • 亚当最適化を使用して学習させます。

  • 学習を200エポック行います。より大きなデータセットでは,良好な適合を実現させるために多くのエポックを学習させる必要がない場合があります。

  • 各ミニバッチでシ,ケンスを左パディングし,シ,ケンスが同じ長さになるようにします。左パディングにより,シ,ケンスの最後にパディングされた値をネットワ,クが予測することを防ぎます。

  • すべてのエポックでデ,タをシャッフルします。

  • 学習の進行状況をプロットに表示。

  • 詳細出力を無効にします。

选项= trainingOptions(“亚当”...MaxEpochs = 200,...SequencePaddingDirection =“左”...洗牌=“every-epoch”...情节=“训练进步”...Verbose = 0);

ニュ,ラルネットワ,クの学習

関数trainNetworkを使用し,指定した学習オプションでLSTMネットワ,クに学習させます。

net = trainNetwork(XTrain,TTrain,图层,选项);

ネットワ,クのテスト

学習デ,タの場合と同じ手順に従って,予測用のテストデ,タを準備します。

学習デ,タから計算された統計を使用してテストデ,タを正規化します。1タ@ @ムステップ分シフトした値を持つテスト シーケンスとしてターゲットを指定し、最後のタイム ステップを含まないテスト シーケンスとして予測子を指定します。

n = 1:size(dataTest,1) X =数据测试{n};XTest{n} = (X(:,1:end-1) - muX) ./ sigmaX;TTest{n} = (X(:,2:end) - muT) ./ sigmaT;结束

テストデ,タを使用して,予測を実行します。学習の場合と同じパディングオプションを指定します。

YTest = predict(net,XTest,SequencePaddingDirection=“左”);

精度を評価するには,各テストシーケンスについて,予測とターゲットの間の平方根平均二乗誤差(RMSE)を計算します。

i = 1:尺寸(欧美,1)rmse (i) =√意味着(欧美{我}- tt{我})^ 2,。“所有”));结束

ヒストグラムで誤差を可視化します。値が小さいほど精度が高いことを示しています。

图直方图(rmse)“RMSE”) ylabel (“频率”

すべてのテスト観測にいて平均rmseを計算します。

(rmse)
ans =0.5080

将来のタ@ @ムステップの予測

入力された時系列またはシケンスにいて,将来の複数のタムステップの値を予測するには,関数predictAndUpdateState。予測ごとに,前の予測を関数への入力として使用します。

テストシケンスの1をプロットに可視化します。

Idx = 2;X = XTest{idx};T = TTest{idx};图stackedplot (X ', DisplayLabels =“通道”+ (1:numChannels)) xlabel(“时间步”)标题(“试验观察”+ idx)

開ル,プ予測

開ルプ予測では,入力デタのみを使用してシケンスの次のタムステップを予測します。後続のタイムステップの予測を行うときは,真の値をデータソースから収集し,それを入力として使用します。たとえば,1 ~ t - 1 のタムステップで収集されたデタを使用して,そのシケンスのタムステップ t の値を予測するとします。タ@ @ムステップ t + 1 の予測を行うには,タ t の真の値が記録されるまで待,それを入力として使用して次の予測を行います。次の予測を行う前にネットワ,クに提供する真の値がある場合は,開ル,プ予測を使用します。

まず,関数resetStateを使用して状態をリセットし,ネットワ,クの状態を初期化します。次に,入力デタの最初のいくかのタムステップを使用して初期予測を行います。入力デタの最初の75タムステップを使用して,ネットワクの状態を更新します。

net = resetState(net);Offset = 75;[net,~] = predictAndUpdateState(net,X(:,1:offset));

さらに予測を続行するには,タ@ # @ムステップでル,プ処理し,関数predictAndUpdateStateを使用してネットワ,クの状態を更新します。入力データをタイムステップでループ処理し,それらをネットワークへの入力として使用することにより,テスト観測の残りのタイムステップの値を予測します。最初の予測は,タ偏移量+ 1に対応する値です。

numTimeSteps = size(X,2);numPredictionTimeSteps = numTimeSteps - offset;Y = 0 (numChannels,numPredictionTimeSteps);t = 1:numPredictionTimeSteps Xt = X(:,offset+t);[net,Y(:,t)] = predictAndUpdateState(net,Xt);结束

予測とタ,ゲット値を比較します。

figure t = tiledlayout(numChannels,1);标题(t)“开环预测”i = 1:numChannels nexttile plot(T(i,:)) hold住情节(抵消:numTimeSteps [T(我,抵消)Y(我:)],“——”) ylabel (“通道”+ i)结束包含(“时间步”nexttile(1) legend([“输入”“预测”])

閉ル,プ予測

閉ルプ予測では,前の予測を入力として使用して,シケンスの後続のタムステップを予測します。この場合,モデルは予測を行うために真の値を必要としません。たとえば,1 ~ t - 1 のタムステップでのみ収集されたデタを使用して,そのシケンスの t t + k のタ@ @ムステップの値を予測するとします。タ@ @ムステップ の予測を行うには,タ - 1 の予測値を入力として使用します。後続の複数のタイムステップの予測を行う場合,または次の予測を行う前にネットワークに提供する真の値がない場合は,閉ループ予測を使用します。

まず,関数resetStateを使用して状態をリセットし,ネットワ,クの状態を初期化します。次に,入力デタの最初のいくかのタムステップを使用して初期予測Zを求めます。入力デタの最初の75タムステップを使用して,ネットワクの状態を更新します。

net = resetState(net);offset = size(X,2);[net,Z] = predictAndUpdateState(net,X);

さらに予測を続行するには,タ@ # @ムステップでル,プ処理し,関数predictAndUpdateStateを使用してネットワ,クの状態を更新します。ネットワクに前の予測値を繰り返し渡すことにより,次の200タムステップを予測します。ネットワークはさらに予測を行うための入力データを必要としないため,予測するタイムステップには任意の数を指定できます。

numPredictionTimeSteps = 200;Xt = Z(:,end);Y = 0 (numChannels,numPredictionTimeSteps);t = 1:numPredictionTimeSteps [net,Y(:,t)] = predictAndUpdateState(net,Xt);Xt = Y(:,t);结束

予測値をプロットに可視化します。

numTimeSteps = offset + numPredictionTimeSteps;figure t = tiledlayout(numChannels,1);标题(t)“闭环预测”i = 1:numChannels nexttile plot(T(i,1:offset)) hold住情节(抵消:numTimeSteps [T(我,抵消)Y(我:)],“——”) ylabel (“通道”+ i)结束包含(“时间步”nexttile(1) legend([“输入”“预测”])

閉ループ予測では任意のタイムステップ数を予測できますが,予測プロセス中にネットワークが真の値にアクセスできないため,開ループ予測と比較して精度が低くなる可能性があります。

参考

|||

関連するトピック