BP神经网络优化 | MATLAB基于遗传算法优化BP神经网络(GA-BP)的预测模型(含完整代码)

文章目录


前言

首先需要安装一下遗传算法工具箱,可参考这篇博客

MATLAB遗传算法工具箱安装包及安装方法(图解)_周杰伦今天喝奶茶了吗的博客-CSDN博客_matlab遗传算法工具箱安装

本模型可以结合自己的数据集进行预测,需要自行修改的地方均会使用【】进行标注。

一、遗传算法描述

       遗传算法(GeneticAlgorithm,GA)的理论是根据达尔文进化论而设计出来的算法,是一种通过模拟自然进化过程搜索最优解的方法。大体意思是生物是朝着好的方向进化的,在进化的过程中会自动选择优良基因淘汰劣等基因。向好的方向进化就是最优解的方向,优良的基因是符合当前条件的样本基因,可以得到充分的选择。遗传学机理中的生物进化过程中生物的一连串过程包括选择、交叉和变异三个主要的行为机制。因此遗传算法也主要分为选择、交叉和变异这三类操作完成淘汰机制,使训练后的自我进化按照条件朝着有力的方向进行,最终取得最优个体和解集合。作为一种算法的形成还需要编码、遗传变异计算适应度和解码等。

二、优化思路

       BP神经网络主要由三个层次组成,包括BP神经网络的输入层,BP神经网络的隐含层以及BP神经网络的输出层。来自外部的各种信息通过BP神经网络的输入层传输进入到其隐含层进行网络运算处理,并通过输出层输出得到最终的处理结果。当BP神经网络的输出层输出结果和其预先设置的输入值的误差较大的时候,则进入BP神经网络的反向传播阶段,并进行网络权值的更新,直到输出结果和期望结果误差满足一定条件为止。

       BP神经网络预测用遗传算法得到最优个体,并对网络进行初始权值和阈值的赋值,网络经训练后预测样本输出。遗传算法优化BP神经网络的要素包括种群初始化、适应度函数、选择算子、交叉算子和变异算子。

三、完整代码

1、main.m

包括导入数据、定义节点个数、定义算法参数、进行遗传操作和画预测对比图等部分,最后输出MAE、MAPE、RMSE、R2等评价指标。需要注意的是这里是以行为一各样本,若数据集以列为样本的话要注意转置。

%% 加载神经网络的训练样本 测试样本每行一个样本 每列一个特征 输入P 输出T

load input.mat % 【需要修改】导入输入数据集
load output.mat %【需要修改】导入输出数据集

P_train=input(1:75,1:5);   %【需要修改】第1-75行作为训练数据,输入数据集第1-5列是输入的特征
T_train=output(1:75,1);    %【需要修改】第1-75行作为训练数据,输出数据集第1列作为最终预测的特征
P_test=input(76:100,1:5);  %【需要修改】第76-100行作为测试数据,输入数据集第1-5列是输入的特征
T_test=output(76:100,1);   %【需要修改】第76-100行作为测试数据,输出数据集第1列作为最终预测的特征

%% 获取输入层节点、输出层节点个数
% 初始隐层神经元个数
inputnum=size(P_train,2); 
hiddennum=2*inputnum+1;
outputnum=size(T_train,2);
w1num=inputnum*hiddennum; % 输入层到隐层的权值个数
w2num=outputnum*hiddennum;% 隐层到输出层的权值个数
N=w1num+hiddennum+w2num+outputnum; %待优化的变量的个数

%% 定义遗传算法参数
NIND=50;        %个体数目
MAXGEN=50;      %最大遗传代数
PRECI=10;       %变量的二进制位数
GGAP=0.93;      %代沟
px=0.84;         %交叉概率
pm=0.02;        %变异概率
trace=zeros(N+1,MAXGEN);%寻优结果的初始值(初始化操作)
FieldD=[repmat(PRECI,1,N);repmat([-0.5;0.5],1,N);repmat([1;0;1;1],1,N)];%区域描述器,这一项主要是用来控制个体由2进制变成10进制的规则(个人理解就是数据由2进制转化为10进制并对样本进行归一化的过程)
Chrom=crtbp(NIND,PRECI*N);%初始种群 这里会生成一个40 x(10*N)的矩阵,即每一个种群中都包含了N个2进制的数用来表示N个个体

%% 优化
gen=0;                                 %代计数器
X=bs2rv(Chrom,FieldD);                 %计算初始种群的十进制转换(根据上述规则将X的2进制转化为10进制)
ObjV=Objfun(X,P_train,T_train,hiddennum,P_test,T_test); %计算目标函数值(将X带入适应度函数进行判断)
while gen<MAXGEN
   fprintf('%d\n',gen)
   FitnV=ranking(ObjV);                              %分配适应度值
   SelCh=select('sus',Chrom,FitnV,GGAP);              %选择
   SelCh=recombin('xovsp',SelCh,px);                  %重组
   SelCh=mut(SelCh,pm);                               %变异
   X=bs2rv(SelCh,FieldD);               %子代个体的十进制转换
   ObjVSel=Objfun(X,P_train,T_train,hiddennum,P_test,T_test);  %计算子代的目标函数值(经过交叉变异重组后再次计算适应度)
   [Chrom,ObjV]=reins(Chrom,SelCh,1,1,ObjV,ObjVSel); %重插入子代到父代,得到新种群
   X=bs2rv(Chrom,FieldD);%上述while中的计算都是用的2进制编码形式,接着将新的X转换为10进制
   gen=gen+1;                    %代计数器增加
   %获取每代的最优解及其序号,Y为最优解个体的值,I为个体的序号
   [Y,I]=min(ObjV);
   trace(1:N,gen)=X(I,:); %记下每代的最优值
   trace(end,gen)=Y;       %记下每代的最优值
end

%% 画图
figure(1); %画进化图
plot(1:MAXGEN,trace(end,:));
grid on
xlabel('遗传代数')
ylabel('误差的变化')
title('进化过程')
bestX=trace(1:end-1,end);
bestErr=trace(end,end);
[~,bestT_sim]=BpFunction(bestX,P_train,T_train,hiddennum,P_test,T_test);
fprintf(['最优初始权值和阈值:\nX=',num2str(bestX'),'\n最小误差err=',num2str(bestErr),'\n'])

figure %画预测对比图
plot(T_test(:,1),'--','linewidth',1.2)
hold on
plot(bestT_sim(:,1),'linewidth',1.2)
legend('期望值','预测值')
xlabel('测试样本编号'),ylabel('指标值')
title('GA-BP测试集预测值和期望值的对比')
set(gca,'fontsize',12)

figure %画误差图
plot(T_test(:,1)-bestT_sim(:,1),'r-','linewidth',1.2)
xlabel('测试样本编号'),ylabel('预测偏差')
title('GA-BP神经网络测试集的预测误差')
set(gca,'fontsize',12)

YReal=T_test(:,1); %实际值
YPred=bestT_sim(:,1); %预测值
n=size(T_test,1);
mae = mean(abs(YReal - YPred));
mape = mean(abs((YReal - YPred)./YReal));
rmse = sqrt(sum((YReal - YPred).^2)./n);
r2 = 1 - (sum((YPred - YReal).^2) / sum((YReal - mean(YReal)).^2));
display(['mae=',num2str(mae),',mape=',num2str(mape),',rmse=',num2str(rmse),',r2=',num2str(r2)]);

2、Objfun.m

用于求得目标函数值,这里所定义的目标函数值是所有个体的预测样本的预测误差的范数

function Obj=Objfun(X,P_train,T_train,hiddennum,P_test,T_test)
%% 用来分别求解种群中各个个体的目标值
%% 输入
% X:所有个体的初始权值和阈值
% P_train:训练样本输入
% T_train:训练样本输出
% hiddennum:隐含层神经元数
% P_test:测试样本输入
% T_test:测试样本期望输出
%% 输出
% Obj:所有个体的预测样本的预测误差的范数

[M,N]=size(X);
Obj=zeros(M,1);
for i=1:M
    Obj(i)=BpFunction(X(i,:),P_train,T_train,hiddennum,P_test,T_test);
end

3、BpFunction.m

 构建BP神经网络,先归一化最后反归一化,最终得到预测误差的范数,范数越小说明预测效果越好。

%% 输入
% x:一个个体的初始权值和阈值
% P_train:训练样本输入
% T_train:训练样本输出
% hiddennum:隐含层神经元数
% P_test:测试样本输入
% T_test:测试样本期望输出
%% 输出
% err:预测样本的预测误差的范数

function [err,T_sim]=BpFunction(x,P_train,T_train,hiddennum,P_test,T_test)
inputnum=size(P_train,2);                             % 输入层神经元个数
% hiddennum=2*inputnum+1;                             % 隐含层神经元个数
outputnum=size(T_train,2);                            % 输出层神经元个数

%% 数据归一化
[p_train,ps_train]=mapminmax(P_train',0,1);
p_test=mapminmax('apply',P_test',ps_train);
[t_train,ps_output]=mapminmax(T_train',0,1);
%% 开始构建BP网络
net=newff(p_train,t_train,hiddennum);               %隐含层为hiddennum个神经元
%设定参数网络参数
net.trainParam.epochs=1000;
net.trainParam.goal=1e-3;
net.trainParam.lr=0.01;
net.trainParam.showwindow=false;                    %高版MATLAB使用 不显示图形框
%% BP神经网络初始权值和阈值
w1num=inputnum*hiddennum;                                           %输入层到隐层的权值个数
w2num=outputnum*hiddennum;                                          %隐含层到输出层的权值个数
W1=x(1:w1num);                                                      %初始输入层到隐含层的权值
B1=x(w1num+1:w1num+hiddennum);                                      %隐层神经元阈值
W2=x(w1num+hiddennum+1:w1num+hiddennum+w2num);                      %隐含层到输出层的权值
B2=x(w1num+hiddennum+w2num+1:w1num+hiddennum+w2num+outputnum);      %输出层阈值
net.iw{1,1}=reshape(W1,hiddennum,inputnum);                         %为神经网络的输入层到隐含层权值赋值
net.lw{2,1}=reshape(W2,outputnum,hiddennum);                        %为神经网络的隐含层到输出层权值赋值
net.b{1}=reshape(B1,hiddennum,1);                                   %为神经网络的隐层神经元阈值赋值
net.b{2}=reshape(B2,outputnum,1);                                   %为神经网络的输出层阈值赋值
%% 开始训练
net = train(net,p_train,t_train);
%% 测试网络
t_sim = sim(net,p_test);
T_sim = mapminmax('reverse',t_sim,ps_output);   %反归一化
T_sim=T_sim';
err=norm(T_sim-T_test);                         %预测结果与测试结果差的范数,范数越小说明预测得越准确,如果范数为0,说明预测得完全准确

预测结果 

  

代码链接放这:MATLAB基于遗传算法优化BP神经网络(GA-BP)的预测模型

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
乘风的头像乘风管理团队
上一篇 2023年12月12日 下午8:33
下一篇 2023年12月12日

相关推荐