このページの翻訳は最新ではありません。ここをクリックして,英語の最新版を参照してください。
この例では,長短期記憶(LSTM)ネットワークを使用して時系列データを予測する方法を説明します。
シーケンスの将来のタイムステップの値を予測するために,sequence-to-sequence回帰用のLSTMネットワークに学習させることができます。その応答は1タイムステップ分シフトした値を持つ学習シーケンスです。つまり,入力シーケンスの各タイムステップで,LSTMネットワークは次のタイムステップの値を予測するように学習します。
将来の複数のタイムステップの値を予測するには,関数predictAndUpdateState
を使用して,タイムステップを1つずつ予測し,予測ごとにネットワークの状態を更新します。
この例ではデータセットchickenpox_dataset
を使用します。この例では,前月までの水ぼうそうの発生件数を与えて,水ぼうそうの発生件数を予測するようLSTMネットワークに学習させます。
例のデータを読み込みます。chickenpox_dataset
には,月に対応するタイムステップと発生件数に対応する値を含む1つの時系列が含まれています。出力は细胞配列で,その各要素は1つのタイムステップです。データを行ベクトルに形状変更します。
数据= chickenpox_dataset;数据=({}):数据;图绘制(数据)包含(“月”) ylabel (“案例”)标题(“每月水痘病例”)
学習データとテストデータに分割します。シーケンスの最初の90%で学習を行い,残りの10%でテストを行います。
地板numTimeStepsTrain =(0.9 *元素个数(数据);dataTrain =数据(1:numTimeStepsTrain + 1);人数(=数据(numTimeStepsTrain + 1:结束);
良好な適合を実現し,学習の発散を防ぐには,ゼロ平均と単位分散を持つように学習データを標準化します。予測時には,学習データと同じパラメーターを使用してテストデータを標準化しなければなりません。
μ=意味着(dataTrain);sig =性病(dataTrain);datatrain标准化= (datatrainmu) / sig;
シーケンスの将来のタイムステップの値を予測するには,1タイムステップ分シフトした値を持つ学習シーケンスになるように応答を指定します。つまり,入力シーケンスの各タイムステップで,LSTMネットワークは次のタイムステップの値を予測するように学習します。予測子は,最後のタイムステップを含まない学習シーケンスです。
XTrain = dataTrainStandardized (1: end-1);YTrain = dataTrainStandardized(2:结束);
LSTM回帰ネットワークを作成します。200年個の隠れユニットを持つLSTM層を指定します。
numFeatures = 1;numResponses = 1;numHiddenUnits = 200;层= [...sequenceInputLayer(numFeatures) lstmLayer(numHiddenUnits) fulllyconnectedlayer (numResponses) regressionLayer];
学習オプションを指定します。ソルバーを“亚当”
250年に設定し,学習をエポック行います。勾配の発散を防ぐために,勾配のしきい値を1に設定します。初期学習率0.005をに指定し,125エポック後に係数0.2を乗算して学習率を下げます。
选择= trainingOptions (“亚当”,...“MaxEpochs”, 250,...“GradientThreshold”, 1...“InitialLearnRate”, 0.005,...“LearnRateSchedule”,“分段”,...“LearnRateDropPeriod”, 125,...“LearnRateDropFactor”, 0.2,...“详细”0,...“阴谋”,“训练进步”);
trainNetwork
を使用し,指定した学習オプションでLSTMネットワークに学習させます。
网= trainNetwork (XTrain、YTrain层,选择);
将来の複数のタイムステップの値を予測するには,関数predictAndUpdateState
を使用して,タイムステップを1つずつ予測し,予測ごとにネットワークの状態を更新します。予測ごとに,前の予測を関数への入力として使用します。
学習データと同じパラメーターを使用してテストデータを標準化します。
datatest标准化= (dataTest - mu) / sig;XTest = dataTestStandardized (1: end-1);
ネットワークの状態を初期化するには,まず,学習データXTrain
について予測を行います。次に,学習の応答YTrain(结束)
の最後のタイムステップを使用して,最初の予測を行います。残りの予測についてループし,前の予測をpredictAndUpdateState
に入力します。
データの大規模なコレクション,長いシーケンス,または大規模ネットワークの場合は,通常,GPUでの予測の方がCPUでの予測より計算時間が短縮されます。そうでない場合,通常,CPUでの予測の計算の方が高速です。1タイムステップの予測には,CPUを使用します。予測にCPUを使用するには,predictAndUpdateState
の“ExecutionEnvironment”
オプションを“cpu”
に設定します。
网= predictAndUpdateState(净,XTrain);[净,YPred] = predictAndUpdateState(净,YTrain(结束));numTimeStepsTest =元素个数(XTest);为i = 2:numTimeStepsTest [net,YPred(:,i)] = predictAndUpdateState(net,YPred(:,i)),“ExecutionEnvironment”,“cpu”);结束
前に計算したパラメーターを使用して予測を非標準化します。
YPred = sig*YPred + mu;
学習の進行状況プロットには,標準化されたデータから計算された平方根平均二乗誤差(RMSE)が報告されます。非標準化された予測からRMSEを計算します。
欧美=人数((2:结束);rmse =√意味着(YPred-YTest)。^ 2))
rmse =单248.5531
予測値と共に学習の時系列をプロットします。
图绘制(dataTrain (1: end-1))在idx = numTimeStepsTrain:(numTimeStepsTrain + numTimeStepsTest);情节(idx (numTimeStepsTrain) YPred][数据,“。”)举行从包含(“月”) ylabel (“案例”)标题(“预测”)传说([“观察”“预测”])
予測値をテストデータと比較します。
figure subplot(2,1,1) plot(YTest) hold在情节(YPred“。”)举行从传奇([“观察”“预测”]) ylabel (“案例”)标题(“预测”) subplot(2,1,2) stem(YPred - YTest) xlabel(“月”) ylabel (“错误”)标题(" RMSE = "+ rmse)
予測と予測の間にタイムステップの実際の値にアクセスできる場合,予測値の代わりに観測値を使用してネットワークの状態を更新できます。
まず,ネットワークの状態を初期化します。新しいシーケンスについて予測を行うには,resetState
を使用してネットワークの状態をリセットします。ネットワークの状態をリセットすると,前の予測が新しいデータについての予測に影響を与えるのを防ぐことができます。ネットワークの状態をリセットしてから,学習データに対して予測を行い,ネットワークの状態を初期化します。
网= resetState(净);网= predictAndUpdateState(净,XTrain);
タイムステップごとに予測を行います。予測ごとに,前のタイムステップの観測値を使用して次のタイムステップを予測します。predictAndUpdateState
の“ExecutionEnvironment”
オプションを“cpu”
に設定します。
YPred = [];numTimeStepsTest =元素个数(XTest);为i = 1:numTimeStepsTest [net,YPred(:,i)] = predictAndUpdateState(net,XTest(:,i)),“ExecutionEnvironment”,“cpu”);结束
前に計算したパラメーターを使用して予測を非標準化します。
YPred = sig*YPred + mu;
平方根平均二乗誤差(RMSE)を計算します。
rmse =√意味着(YPred-YTest)。^ 2))
rmse = 158.0959
予測値をテストデータと比較します。
figure subplot(2,1,1) plot(YTest) hold在情节(YPred“。”)举行从传奇([“观察”“预测”]) ylabel (“案例”)标题(“与更新预测”) subplot(2,1,2) stem(YPred - YTest) xlabel(“月”) ylabel (“错误”)标题(" RMSE = "+ rmse)
ここで,予測値の代わりに観測値を使用してネットワークの状態を更新すると,予測がより正確になります。
lstmLayer
|sequenceInputLayer
|trainingOptions
|trainNetwork