%% 加载数据与数据集划分
clc;clear;close all
load data
nwhole =size(input,2);
train_ratio=700/1011;
ntrain=round(nwhole*train_ratio);
ntest =nwhole-ntrain;
% 准备输入和输出训练数据
input_train = input(:,1:ntrain);
output_train = output(:,1:ntrain);
% 准备测试数据
input_test = input(:, ntrain+1:ntrain+ntest);
output_test = output(:,ntrain+1:ntrain+ntest);
%% 数据归一化
method=@mapminmax;
[inputn_train,inputps]=method(input_train);
inputn_test=method('apply',input_test,inputps);
[outputn_train,outputps]=method(output_train);
outputn_test=method('apply',output_test,outputps);
%% 数据的一个转换,转换成MATLAB的CNN的输入数据形式,是4-D形式的,最后一维就是样本数
trainD=reshape(inputn_train,[size(input,1),1,1,ntrain]);%训练集输入
testD =reshape(inputn_test, [size(input,1),1,1,ntest]); %测试集输入
targetD = outputn_train;%训练集输出
targetD_test = outputn_test;%测试集输出
%% CNN模型建立
layers = [
imageInputLayer([size(input,1) 1 1]) %输入层参数设置
convolution2dLayer(3,16,'Padding','same')%卷积层的核大小、数量,填充方式
reluLayer %relu激活函数
fullyConnectedLayer(384) % 384 全连接层神经元
fullyConnectedLayer(384) % 384 全连接层神经元
fullyConnectedLayer(1) % 输出层神经元
regressionLayer]; % 添加回归层,用于计算损失值
%% 模型训练与测试
options = trainingOptions('adam', ...
'MaxEpochs',20, ...
'MiniBatchSize',16, ...
'InitialLearnRate',0.005, ...
'GradientThreshold',1, ...
'Verbose',false,...
'Plots','training-progress',...
'ValidationData',{testD,targetD_test'});
% 训练
net = trainNetwork(trainD,targetD',layers,options);
% 预测
YPred = predict(net,testD);
% 结果
YPred =double(YPred');
% 反归一化
CNNoutput_test=method('reverse',YPred,outputps);
CNNoutput_test=double(CNNoutput_test);
%% 测试集误差评价
CNNerror_test=CNNoutput_test'-output_test';
CNNpererror_test=CNNerror_test./output_test';
CNNpererror_test=filloutliers(CNNpererror_test,'spline');
CNNpererror_test(abs(CNNpererror_test)>1)=0;
% R
Rtest21=sum((output_test -mean(output_test)).*( CNNoutput_test - mean(CNNoutput_test)));
Rtest22=sqrt(sumsqr(output_test -mean(output_test)).*sumsqr(CNNoutput_test - mean(CNNoutput_test)));
Rtest = Rtest21/Rtest22;
% RMSE
RMSEtest = sqrt(sumsqr(CNNerror_test)/length(output_test));
% MAPE
MAPEtest = mean(abs(CNNpererror_test));
disp("——————CNN网络模型测试数据——————————")
disp(" 预测值 真实值 误差 ")
disp([CNNoutput_test' output_test' CNNerror_test])
%--------------------------------------------------------------------------
disp('CNN测试平均绝对误差百分比MAPE');
disp(MAPEtest)
disp('CNN测试均方根误差RMSE')
disp(RMSEtest)
%--------------------------------------------------------------------------
%% 数据可视化
figure()
plot(CNNoutput_test,':.')
hold on
plot(output_test,'-')
legend( '测试数据','实际数据','Location','NorthWest','FontName','华文宋体');
title('CNN模型测试结果及真实值','fontsize',12,'FontName','华文宋体')
xlabel('时间','fontsize',12,'FontName','华文宋体');
ylabel('数值','fontsize',12,'FontName','华文宋体');
xlim([1 ntest]);
%-------------------------------------------------------------------------------------
figure()
plot(CNNerror_test,'-','Color',[128 0 0]./255,'linewidth',1)
legend('CNN模型测试误差','Location','NorthEast','FontName','华文宋体')
title('CNN模型测试误差','fontsize',12,'FontName','华文宋体')
ylabel('误差','fontsize',12,'FontName','华文宋体')
xlabel('样本','fontsize',12,'FontName','华文宋体')
xlim([1 ntest]);
%-------------------------------------------------------------------------------------
figure()
plot(CNNpererror_test,'-','Color',[128 0 255]./255,'linewidth',1)
legend('CNN模型测试相对误差','Location','NorthEast','FontName','华文宋体')
title('CNN模型测试相对误差','fontsize',12,'FontName','华文宋体')
ylabel('误差','fontsize',12,'FontName','华文宋体')
xlabel('样本','fontsize',12,'FontName','华文宋体')
xlim([1 ntest]);
- 1
- 2
- 3
- 4
- 5
- 6
前往页