Многошаговое прогнозирование временных рядов с использованием долговременной краткосрочной памяти (LSTM) - PullRequest
0 голосов
/ 29 апреля 2019

Я пытаюсь прогнозировать будущие значения временных рядов моих данных с помощью функции LSTM. Когда я разделил свои данные на обучение (70%) и тестирование (30%), LSTM точно прогнозирует значения, см. Прилагаемую фигуру, но когда я хочу прогнозировать, скажем 10000 точек данных на основе моей модели, результат очень бедный.

Итак, как правильно спрогнозировать данные будущих временных рядов, используя LSTM?

Я старался изо всех сил написать код Matlab, показанный ниже, но не знаю, где я делаю ошибки при прогнозировании будущих значений:

HsAll = History3{:,6};
Hs15 = History3{67209:70128,6};
data = Hs15';

figure
plot(data)
xlabel("Month")
ylabel("Wave height")
title("Time series data over the months")

%Partition the training and test data. 
%Train on the first 90% of the sequence and test on the last 10%.

numTimeStepsTrain = floor(0.7.*numel(data));
dataTrain = data(1:numTimeStepsTrain+1);
dataTest = data(numTimeStepsTrain+1:end);

% Standardize Data

mu = mean(dataTrain);
sig = std(dataTrain);

dataTrainStandardized = (dataTrain - mu) / sig;

% Prepare Predictors and Responses

XTrain = dataTrainStandardized(1:end-1);
YTrain = dataTrainStandardized(2:end);

%Define LSTM Network Architecture

numFeatures = 1;
numResponses = 1;
numHiddenUnits = 10;

layers = [ ...
    sequenceInputLayer(numFeatures)
    lstmLayer(numHiddenUnits)
    fullyConnectedLayer(numResponses)
    regressionLayer];
options = trainingOptions('adam', ...
    'MaxEpochs',100, ...
    'GradientThreshold',5, ...
    'InitialLearnRate',0.005, ...
    'LearnRateSchedule','piecewise', ...
    'LearnRateDropPeriod',125, ...
    'LearnRateDropFactor',0.2, ...
    'Verbose',1, ...
    'Plots','training-progress');

% Train LSTM Network
net = trainNetwork(XTrain,YTrain,layers,options);

% Forecast Future Time Steps
dataTestStandardized = (dataTest - mu) / sig;
XTest = dataTestStandardized(1:end-1);

net = predictAndUpdateState(net,XTrain);

YTest = dataTest(2:end);

%Update Network State with Observed Values
net = resetState(net);
net = predictAndUpdateState(net,XTrain);
YPred = [];
numTimeStepsTest = numel(XTest);
% numTimeStepsTest = 10000;  if this I try then getting bad result.[![enter image description here][1]][1]
% X= (1:numTimeStepsTest);

for i = 1:numTimeStepsTest
    [net,YPred(:,i)] = predictAndUpdateState(net,XTest(:,i),'ExecutionEnvironment','cpu');
end

YPred = sig*YPred + mu;

rmse = sqrt(mean((YPred-YTest).^2))

figure
subplot(2,1,1);
plot(YTest);
hold on
plot(YPred,'.-');
hold off
legend(["Observed" "Predicted"]);
ylabel("Cases")
title("Forecast with Updates");

subplot(2,1,2)
stem(YPred - YTest)
xlabel("Month")
ylabel("Error")
title("RMSE = " + rmse);

figure
plot(dataTrain(1:end-1))
hold on
idx = numTimeStepsTrain:(numTimeStepsTrain+numTimeStepsTest);
plot(idx,[data(numTimeStepsTrain) YPred],'r')
hold off
xlabel("Month")
ylabel("Cases")
title("Forecast")
legend(["Observed" "Forecast"])


% When I am trying to forecast say next 10000 values then it gives me constant values.

Результат обучения и тестовые значения:

Fig 1 is the result of training and test values

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...