% ----------------------- README ------------------------------------------
% ------------------- 原创声明 -------------------------------------------
% -------------- 最后一次修改:2023/7/12 ------------------------------------
% ------------------- 欢迎关注₍^.^₎♡ -------------------------------------
% -------------- 项目:BP神经网络预测改进 --------------------------------
% -------------- B站:KAU的云实验台_s -------------------------------------
% -------------- CSDN:KAU的云实验台 ---------------------------------------
% -------------------------------------------------------------------------
%% 初始化
clear
close all
clc
format shortg
rng(3)
%% 读取读取
% load('data.mat')
%
% input = input(1:200,:);
% output = output(1:200);
load('concrete_data.mat')
input = attributes';
output = strength;
%输入输出数据
input=input';
n = randperm(size(input,2));%随机选取
% n=1:size(input,2);%顺序选取
N=length(output); %全部样本数目
testNum=floor(N*0.2); %设定测试样本数目
trainNum=N-testNum; %计算训练样本数目
%% 划分训练集、测试集
input_train = input(:,n(1:trainNum));
output_train = output(:,n(1:trainNum));
input_test = input(:,n((trainNum+1):end));
output_test = output(:,n((trainNum+1):end));
%% 数据归一化
[inputn,inputps]=mapminmax(input_train,-1,1);
[outputn,outputps]=mapminmax(output_train);
inputn_test=mapminmax('apply',input_test,inputps);
%% 1 单隐含层BP预测
%% 构建BP神经网络
disp(' ')
disp('单隐含层BP预测:')
inputnum=size(input,1);
outputnum=size(output,1);
hiddennum=15;%设置隐含层节点数为7
net0=newff(inputn,outputn,hiddennum,{'tansig','purelin'},'trainlm');% 建立模型
%网络参数配置
net0.trainParam.epochs=500; % 训练次数,这里设置为500次
net0.trainParam.lr=0.1; % 学习速率,这里设置为0.01
net0.trainParam.goal=0.00001; % 训练目标最小误差,这里设置为0.0001
net0.trainParam.show=25; % 显示频率,这里设置为每训练25次显示一次
net0.trainParam.mc=0.01; % 动量因子
net0.trainParam.min_grad=1e-6; % 最小性能梯度
net0.trainParam.max_fail=6; % 最高失败次数
%开始训练
net0=train(net0,inputn,outputn);
%预测
an0=sim(net0,inputn_test); %用训练好的模型进行仿真
%预测结果反归一化与误差计算
BPtest_simu0=mapminmax('reverse',an0,outputps); %把仿真得到的数据还原为原始的数量级
% 误差分析
% output_test 实际值
% test_simu0 BP预测值
% GAtest_simu GABP预测值
n = size(output_test,2);
ms_bp = abs(BPtest_simu0-output_test)./output_test;
mae_bp = mean(abs(output_test - BPtest_simu0));
rmse_bp = sqrt(mean((output_test - BPtest_simu0).^2));
mape_bp = mean(abs((output_test - BPtest_simu0)./BPtest_simu0));
%% 2 多隐含层BP预测
%% 构建BP神经网络
disp(' ')
disp('多隐含层BP预测:')
inputnum=size(input,1);
outputnum=size(output,1);
hiddennum1=15;%设置隐含层节点数为7
hiddennum2=15;%设置隐含层节点数为7
net1=newff(inputn,outputn,[hiddennum1 hiddennum2],{'logsig','tansig','purelin'},'trainlm');% 建立模型
%网络参数配置
net1.trainParam.epochs=500; % 训练次数,这里设置为500次
net1.trainParam.lr=0.1; % 学习速率,这里设置为0.01
net1.trainParam.goal=0.00001; % 训练目标最小误差,这里设置为0.0001
net1.trainParam.show=25; % 显示频率,这里设置为每训练25次显示一次
net1.trainParam.mc=0.01; % 动量因子
net1.trainParam.min_grad=1e-6; % 最小性能梯度
net1.trainParam.max_fail=6; % 最高失败次数
%开始训练
net1=train(net1,inputn,outputn);
%预测
an1=sim(net1,inputn_test); %用训练好的模型进行仿真
%预测结果反归一化与误差计算
IBPtest_simu0=mapminmax('reverse',an1,outputps); %把仿真得到的数据还原为原始的数量级
% 误差分析
% output_test 实际值
% test_simu0 BP预测值
% GAtest_simu GABP预测值
n = size(output_test,2);
ms_ibp = abs(IBPtest_simu0-output_test)./output_test;
mae_ibp = mean(abs(output_test - IBPtest_simu0));
rmse_ibp = sqrt(mean((output_test - IBPtest_simu0).^2));
mape_ibp = mean(abs((output_test - IBPtest_simu0)./IBPtest_simu0));