%% BP神经网络预测
%% 初始化
clear
close all
clc
format shortg
% rng('default') %使MATLAB的随机种子为默认数字
%% 读取数据
input=xlsread('input_data.xls','Sheet1','A1:E150');
output=xlsread('output_data.xls','Sheet1','A1:A150');
%% 训练集、测试集
trainN=130; %设置训练样本个数1到第130个,其余的样本为测试样本
input_train = input(1:trainN,:)';
output_train =output(1:trainN)';
input_test =input(trainN+1:end,:)';
output_test =output(trainN+1:end)';
%% 数据归一化
[inputn,inputps]=mapminmax(input_train,0,1);
[outputn,outputps]=mapminmax(output_train);
inputn_test=mapminmax('apply',input_test,inputps);
%% 神经网络的节点个数
inputnum=size(input_train,1) %输入层神经元的节点个数
hiddennum=5 %隐含层的神经元节点个数
outputnum=size(output_train,1) %输出层的神经元节点个数
%% 构建BP神经网络
net=newff(inputn,outputn,hiddennum,{'tansig','purelin'},'trainlm','learngdm');
%输入层到隐含层的激活函数为tansig,隐含层到输出层的激活函数为purelin,训练算法为L-M,学习算法为learngdm
% 网络参数
net.trainParam.epochs=1000; % 训练次数
net.trainParam.lr=0.01; % 学习速率
net.trainParam.goal=0.000001; % 训练目标最小误差
%% BP神经网络训练
net=train(net,inputn,outputn);
%% BP神经网络测试
an=sim(net,inputn_test); %用训练好的模型进行仿真
test_simu=mapminmax('reverse',an,outputps); % 预测结果反归一化
error=test_simu-output_test; %预测值和真实值的误差
%%真实值与预测值误差比较
figure(1)
plot(output_test,'bo-','linewidth',2)
hold on
plot(test_simu,'r*-','linewidth',2)
legend('期望值','预测值','location','northeast')
xlabel('测试样本序号')
ylabel('指标值')
title('BP神经网络测试集预测值和期望值的对比')
figure(2)
plot(error,'bs-','linewidth',2)
legend('误差','location','northeast')
xlabel('测试样本序号')
ylabel('预测偏差')
title('BP测试集预测值和期望值的误差')
%计算误差
[~,len]=size(output_test); %[M,N]=size(A)函数获取变量A的行数M和列数N,这里~缺省第一个参数,len得到测试集的样本个数
MAE=sum(abs(error))/len; %平均绝对误差
MSE=error*error'/len; %均方误差
RMSE=MSE^(1/2); %均方根误差
MAPE=sum(abs(error./output_test))/len; %平均相对误差的绝对值
% disp('-----------------------训练集归一化的输入--------------------------')
% disp(inputn')
% disp('-----------------------测试集归一化的输入--------------------------')
% disp(inputn_test')
disp('-----------------------测试集的预测输出值-----------------')
disp('实际值 预测值 误差值')
result=[output_test',test_simu',error']
disp('-----------------------误差计算--------------------------')
disp(['平均绝对误差MAE为:',num2str(MAE)])
disp(['均方误差MSE为: ',num2str(MSE)])
disp(['均方根误差RMSE为: ',num2str(RMSE)])
disp(['平均相对误差为: ',num2str(MAPE*100),'%'])