【MATLAB第2期】源碼分享#基于LSTM時間序列單步預測,含驗證和預測未來
1.運行環(huán)境
matlab2020a + cpu
2.數(shù)據(jù)說明
單列數(shù)據(jù),2018/10~2018/12 共三個月,92個數(shù)據(jù)。
?
3.數(shù)據(jù)處理
樣本標準化處理,其中,前85個數(shù)據(jù)作為訓練樣本,來驗證后7個數(shù)據(jù)效果。最后預測未來7個數(shù)據(jù)。
numTimeStepsTrain = floor(85);%85數(shù)據(jù)訓練 ,7個用來驗證
dataTrain = data(1:numTimeStepsTrain+1,:);% 訓練樣本
dataTest = data(numTimeStepsTrain:end,:); %驗證樣本
4.LSTM參數(shù)設(shè)置
numHiddenUnits = 500;%隱含層神經(jīng)元節(jié)點數(shù)
dropoutLayer(0.2)%丟棄層概率
5.運行過程
?
根據(jù)訓練效果RMSE誤差圖以及損失圖,可在運行時降低訓練次數(shù),如設(shè)置為300,加快收斂。
6.運行結(jié)果
訓練結(jié)果:
?
驗證結(jié)果:
?
評價指標:
訓練集數(shù)據(jù)的MAE為:2524.5837
驗證集數(shù)據(jù)的MAE為:3277.468
訓練集數(shù)據(jù)的MAPE為:0.3253
驗證集數(shù)據(jù)的MAPE為:0.31752
訓練集數(shù)據(jù)的RMSE為:3380.5039
驗證集數(shù)據(jù)的RMSE為:3862.0957
原數(shù)據(jù)量級比較大,加上參數(shù)還需要打磨,所以誤差顯得比較大 ??梢蕴子米约簲?shù)據(jù)試試。
7.預測未來
文章來源:http://www.zghlxwxcb.cn/news/detail-448658.html
8.代碼展示:
%% 1.環(huán)境清理
clear, clc, close all;
%% 2.導入數(shù)據(jù)
data=xlsread('data.csv');
data1=data;
% 原始數(shù)據(jù)繪圖
figure
plot(data,'-s','Color',[0 0 255]./255,'linewidth',1,'Markersize',5,'MarkerFaceColor',[0 0 255]./255)
legend('原始數(shù)據(jù)','Location','NorthWest','FontName','華文宋體');
xlabel('樣本','fontsize',12,'FontName','華文宋體');
ylabel('數(shù)值','fontsize',12,'FontName','華文宋體');
%% 3.數(shù)據(jù)處理
numTimeStepsTrain = floor(85);%85數(shù)據(jù)訓練 ,7個用來驗證
[XTrain,YTrain,XTest,YTest,mu,sig] = shujuchuli(data,numTimeStepsTrain);
%% 4.定義LSTM結(jié)構(gòu)參數(shù)
numFeatures= 1;%輸入節(jié)點
numResponses = 1;%輸出節(jié)點
numHiddenUnits = 500;%隱含層神經(jīng)元節(jié)點數(shù)
%構(gòu)建 LSTM網(wǎng)絡(luò)
layers = [sequenceInputLayer(numFeatures)
lstmLayer(numHiddenUnits) %lstm函數(shù)
dropoutLayer(0.2)%丟棄層概率
reluLayer('name','relu')% 激勵函數(shù) RELU
fullyConnectedLayer(numResponses)
regressionLayer];
XTrain=XTrain';
YTrain=YTrain';
%% 5.定義LSTM函數(shù)參數(shù)
def_options();
%% 6.訓練LSTM網(wǎng)絡(luò)
net = trainNetwork(XTrain,YTrain,layers,options);
%% 7.建立訓練模型
net = predictAndUpdateState(net,XTrain);
%% 8.仿真預測(訓練集)
M = numel(XTrain);
for i = 1:M
[net,YPred_1(:,i)] = predictAndUpdateState(net,XTrain(:,i),'ExecutionEnvironment','cpu');%
end
T_sim1 = sig*YPred_1 + mu;%預測結(jié)果去標準化 ,恢復原來的數(shù)量級
%% 9.仿真預測(驗證集)
N = numel(XTest);
for i = 1:N
[net,YPred_2(:,i)] = predictAndUpdateState(net,XTest(:,i),'ExecutionEnvironment','cpu');%
end
T_sim2 = sig*YPred_2 + mu;%預測結(jié)果去標準化 ,恢復原來的數(shù)量級
%% 10.評價指標
% 均方根誤差
T_train=data1(1:M)';
T_test=data1(M+1:end)';
error1 = sqrt(sum((T_sim1 - T_train).^2) ./ M);
error2 = sqrt(sum((T_sim2 - T_test ).^2) ./ N);
% MAE
mae1 = sum(abs(T_sim1 - T_train)) ./ M ;
mae2 = sum(abs(T_sim2 - T_test )) ./ N ;
disp(['訓練集數(shù)據(jù)的MAE為:', num2str(mae1)])
disp(['驗證集數(shù)據(jù)的MAE為:', num2str(mae2)])
% MAPE
maep1 = sum(abs(T_sim1 - T_train)./T_train) ./ M ;
maep2 = sum(abs(T_sim2 - T_test )./T_test) ./ N ;
disp(['訓練集數(shù)據(jù)的MAPE為:', num2str(maep1)])
disp(['驗證集數(shù)據(jù)的MAPE為:', num2str(maep2)])
% RMSE
RMSE1 = sqrt(sumsqr(T_sim1 - T_train)/M);
RMSE2 = sqrt(sumsqr(T_sim2 - T_test)/N);
disp(['訓練集數(shù)據(jù)的RMSE為:', num2str(RMSE1)])
disp(['驗證集數(shù)據(jù)的RMSE為:', num2str(RMSE2)])
%% 11. 繪圖
figure
subplot(2,1,1)
plot(T_sim1,'-s','Color',[255 0 0]./255,'linewidth',1,'Markersize',5,'MarkerFaceColor',[250 0 0]./255)
hold on
plot(T_train,'-o','Color',[150 150 150]./255,'linewidth',0.8,'Markersize',4,'MarkerFaceColor',[150 150 150]./255)
legend( 'LSTM擬合訓練數(shù)據(jù)','實際分析數(shù)據(jù)','Location','NorthWest','FontName','華文宋體');
title('LSTM模型預測結(jié)果及真實值','fontsize',12,'FontName','華文宋體')
xlabel('樣本','fontsize',12,'FontName','華文宋體');
ylabel('數(shù)值','fontsize',12,'FontName','華文宋體');
xlim([1 M])
%-------------------------------------------------------------------------------------
subplot(2,1,2)
bar((T_sim1 - T_train)./T_train)
legend('LSTM模型訓練集相對誤差','Location','NorthEast','FontName','華文宋體')
title('LSTM模型訓練集相對誤差','fontsize',12,'FontName','華文宋體')
ylabel('誤差','fontsize',12,'FontName','華文宋體')
xlabel('樣本','fontsize',12,'FontName','華文宋體')
xlim([1 M]);
%-------------------------------------------------------------------------------------
figure
subplot(2,1,1)
plot(T_sim2,'-s','Color',[0 0 255]./255,'linewidth',1,'Markersize',5,'MarkerFaceColor',[0 0 255]./255)
hold on
plot(T_test,'-o','Color',[0 0 0]./255,'linewidth',0.8,'Markersize',4,'MarkerFaceColor',[0 0 0]./255)
legend('LSTM預測測試數(shù)據(jù)','實際分析數(shù)據(jù)','Location','NorthWest','FontName','華文宋體');
title('LSTM模型預測結(jié)果及真實值','fontsize',12,'FontName','華文宋體')
xlabel('樣本','fontsize',12,'FontName','華文宋體');
ylabel('數(shù)值','fontsize',12,'FontName','華文宋體');
xlim([1 N])
%-------------------------------------------------------------------------------------
subplot(2,1,2)
bar((T_sim2 - T_test )./T_test)
legend('LSTM模型測試集相對誤差','Location','NorthEast','FontName','華文宋體')
title('LSTM模型測試集相對誤差','fontsize',12,'FontName','華文宋體')
ylabel('誤差','fontsize',12,'FontName','華文宋體')
xlabel('樣本','fontsize',12,'FontName','華文宋體')
xlim([1 N]);
%% 12.預測未來
P = 7;% 預測未來數(shù)量
YPred_3 = [];%預測結(jié)果清零
[T_sim3] = yuceweilai(net,XTrain,data,P,YPred_3,sig,mu)
%% 13.繪圖
figure
plot(1:size(data,1),data,'-s','Color',[255 0 0]./255,'linewidth',1,'Markersize',5,'MarkerFaceColor',[250 0 0]./255)
hold on
plot(size(data,1)+1:size(data,1)+P,T_sim3,'-o','Color',[150 150 150]./255,'linewidth',0.8,'Markersize',4,'MarkerFaceColor',[150 150 150]./255)
legend( 'LSTM預測結(jié)果','Location','NorthWest','FontName','華文宋體');
title('LSTM模型預測結(jié)果','fontsize',12,'FontName','華文宋體')
xlabel('樣本','fontsize',12,'FontName','華文宋體');
ylabel('數(shù)值','fontsize',12,'FontName','華文宋體');
9.代碼獲?。?/h3>
調(diào)用函數(shù)以及案例數(shù)據(jù)可后臺私信回復“第2期”獲取下載鏈接了,免費下載即可。
內(nèi)容整理不易,求個關(guān)注,后續(xù)會持續(xù)分享機器學習相關(guān)的源代碼。文章來源地址http://www.zghlxwxcb.cn/news/detail-448658.html
到了這里,關(guān)于【MATLAB第2期】源碼分享#基于LSTM時間序列單步預測,含驗證和預測未來的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!