How to train multiple time series using one LSTM scriptt?

조회 수: 6 (최근 30일)
Fahad Butt
Fahad Butt 2022년 12월 17일
답변: Rahul 2025년 3월 10일
For example, I have electricity usage data from different cities as:
year :1 2 3 4 5 6 [years]
city 1 : 1 2 3 4 5 6 [GWh]
city 2 : 1 2 3 4 5 6 [GWh]
city 3 : 1 2 3 4 5 6 [GWh]
I want to predict for year 7. I can do thhat with narxnet or narnet by using a 3x6 matrix, but these two are inconsistant. LSTM seems to be mroe accurate.
I can predict for one city using the following script. P1 is electricity data for city 1.
%% clear variables
% clc; clear; close all
%% load data
data=p1;
%% partition data
trec=length(data);
trrec=0.9*trec;
NTST=round(trrec);
datatrain=data(1:NTST+1);
datatest=data(NTST+1:end);
%% standardize data
mu=mean(datatrain);
sig=std(datatrain);
datatrainstd=(datatrain-mu)/sig;
%% display standardized data
% figure,
% hold on; grid on; box on, grid minor
% set(gca,'FontSize',40)
% set(gca, 'FontName', 'Times New Roman')
% plot(datatrainstd)
% xlabel('Months')
% ylabel('Cases')
%% train network separate predictors and response
xtrain=datatrainstd(1:end-1);
ytrain=datatrainstd(2:end);
%% define lstm network architecture
nof=1;
nor=1;
nhu=10;
layers=[
sequenceInputLayer(nof,'Name','ip')
lstmLayer(nhu,"Name",'lstm')
fullyConnectedLayer(nor,'Name','fc')
regressionLayer('Name','rg')];
%% plot layers
% lgraph=layerGraph(layers);
% plot(lgraph)
%% training options
options=trainingOptions('adam',...
'MaxEpochs',200,...
'GradientThreshold',1,...
'InitialLearnRate',0.1,...
'LearnRateSchedule','piecewise',...
'LearnRateDropperiod',100,...
'LearnRateDropFactor',0.2,...
'Verbose',0,...
'plots','training-progres');
%% training lstm network
net=trainNetwork(xtrain,ytrain,layers,options);
%% validation
%% standardize validation data using same parameters of training phase
datateststd=(datatest-mu)/sig;
xtest=datateststd(1:end-1);
ytest=datatest(2:end);
net=predictAndUpdateState(net,xtrain);
[net, ypred] = predictAndUpdateState(net, ytrain(end));
NTSTs=length(xtest);
for i=2:NTSTs
[net, ypred(:,i)] = predictAndUpdateState(net, ytrain(:,i-1));
end
%% unstandarize data
ypred=sig*ypred+mu;
rmse=sqrt(mean(ypred-ytest).^2);
ase=mean(mode(ypred-ytest));
ASME=mode(mean((ypred-ytest)));
%% plotting
it=1:length(ypred);
figure,
hold on
plot(datatrain(1:end-1))
startpnt=NTST;
endpt=NTST+NTSTs;
idx=startpnt:endpt;
plot(idx,[data(startpnt) ypred],'o--')
plot(idx,[data(startpnt) ytest],'+--')
hold off

답변 (1개)

Rahul
Rahul 2025년 3월 10일
In order to train LSTM model over multiple time series data using a single script, consider representating all time series data in a single matrix like this:
data = [p1; p2; p3];
% Considering 'p1', 'p2', 'p3' contain the electricity data different cities
numCities = size(data, 1);
trec = size(data, 2);
Now, apply the same logic of training the LSTM as mentioned in the question. The difference would be to apply the logic iteratively using for loops. Here is an example:
nets = cell(1, numCities);
for i = 1:numCities
nets{i} = trainNetwork(squeeze(xtrain(i, :)), squeeze(ytrain(i, :)), layers, options);
end
If the time series data from different cities share similar patterns that can be standardized collectively, then concatenating the data and training can be an effective option.
concatenatedData = data(:)'; % Convert matrix to a single row vector
Note: The concatenated sequence can become very long, which may require adjustments in model architecture or training options to handle effectively.
The following MathWorks documentations can be referred:
Thanks.

카테고리

Help CenterFile Exchange에서 Deep Learning Toolbox에 대해 자세히 알아보기

제품


릴리스

R2020a

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by