BP神经网络优化 | MATLAB基于遗传算法优化BP神经网络(GA-BP)的预测模型(含完整代码)
温馨提示:这篇文章已超过369天没有更新,请注意相关的内容是否还可用!
文章目录
前言
一、遗传算法描述
二、优化思路
三、完整代码
预测结果
前言
首先需要安装一下遗传算法工具箱,可参考这篇博客
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
