基于遗传算法的Bp神经网络优化算法代码

简介:

BP神经网络是一种广泛运用的机器学习算法,由输出层,输入层,以及一个或多个隐藏层神经元构成,常用于数据的预测,分类,等等应用。

而遗传算法是一种经典且实用的优化算法,它模拟了自然界生物为适应环境演化进化的过程,通过每一代不同解空间的选择,交叉,变异,产生更加优良的下一代,算法可以不断的产生优良解,并且接近全局最优点。

本项目使用遗传算法优化BP神经网络隐藏节点的权重与阈值,主体的代码如下.

GABPMain.m

clc
clear 
close all
%% 加载神经网络的训练样本 测试样本每列一个样本 输入P 输出T
%样本数据就是前面问题描述中列出的数据
load data
% warning('off')
% 初始隐层神经元个数
hiddennum=31;
inputnum=size(P,1);       % 输入层神经元个数
outputnum=size(T,1);      % 输出层神经元个数
w1num=inputnum*hiddennum; % 输入层到隐层的权值个数
w2num=outputnum*hiddennum;% 隐层到输出层的权值个数
N=w1num+hiddennum+w2num+outputnum; %待优化的变量的个数

%% 定义遗传算法参数
NIND=40;        %个体数目
MAXGEN=100;      %最大遗传代数
PRECI=10;       %变量的二进制位数
GGAP=0.95;      %代沟
px=0.7;         %交叉概率
pm=0.01;        %变异概率
trace=zeros(N+1,MAXGEN);                        %寻优结果的初始值

FieldD=[repmat(PRECI,1,N);repmat([-0.5;0.5],1,N);repmat([1;0;1;1],1,N)];                      %区域描述器
Chrom=crtbp(NIND,PRECI*N);                      %初始种群
%% 优化
gen=0;                                 %代计数器
X=bs2rv(Chrom,FieldD);                 %计算初始种群的十进制转换
ObjV=Objfun(X,P,T,hiddennum,P_test,T_test);        %计算目标函数值
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,T,hiddennum,P_test,T_test);             %计算子代的目标函数值
   [Chrom,ObjV]=reins(Chrom,SelCh,1,1,ObjV,ObjVSel); %重插入子代到父代,得到新种群
   X=bs2rv(Chrom,FieldD);
   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,T,hiddennum,P_test,T_test);
fprintf(['最优初始权值和阈值:\nX=',num2str(bestX'),'\n最小误差err=',num2str(bestErr),'\n'])

BpFunction.m

%% 输入
% x:一个个体的初始权值和阈值
% P:训练样本输入
% T:训练样本输出
% hiddennum:隐含层神经元数
% P_test:测试样本输入
% T_test:测试样本期望输出
%% 输出
% err:预测样本的预测误差的范数
function [err,T_sim]=BpFunction(x,P,T,hiddennum,P_test,T_test)
inputnum=size(P,1);                             % 输入层神经元个数
% hiddennum=2*inputnum+1;                           % 隐含层神经元个数
outputnum=size(T,1);                                % 输出层神经元个数
%% 数据归一化
[p_train,ps_train]=mapminmax(P,0,1);
p_test=mapminmax('apply',P_test,ps_train);
[t_train,ps_output]=mapminmax(T,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;                                          %隐含层到输出层的权值个数
% x=2*rand(1,w1num+hiddennum+w2num+outputnum)-1;                      %随即生成权值
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);   %反归一化
err=norm(T_sim-T_test);                         %预测结果与测试结果差的范数,范数越小说明预测得越准确,如果范数为0,说明预测得完全准确

Objfun.m

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

[M,N]=size(X);
Obj=zeros(M,1);
for i=1:M
%     Obj(i)=Bpfun(X(i,:),P,T,hiddennum,P_test,T_test);
    Obj(i)=BpFunction(X(i,:),P,T,hiddennum,P_test,T_test);
end
基于遗传算法BP神经网络优化算法是一种综合应用遗传算法BP神经网络优化算法,可以有效提高BP神经网络的收敛速度和全局搜索能力。 遗传算法是一种模拟自然界生物进化过程的随机优化算法,利用选择、交叉和变异等遗传操作,通过种群演化来搜索最优解。 BP神经网络是一种前向反馈式的人工神经网络,通过不断调整权值和阈值来逼近所需输出。 基于遗传算法BP神经网络优化算法代码实现主要包括以下几个步骤: 1. 初始化BP神经网络的权值和阈值,并设置遗传算法的相关参数,如种群大小、迭代次数等。 2. 根据种群大小,随机生成一定数量的个体,每个个体代表一组BP神经网络的权值和阈值。 3. 迭代遗传算法的过程中,根据个体的适应度评估其优劣,适应度可以根据BP神经网络的误差或其他指标来计算。 4. 选择操作:按照适应度大小进行选择操作,选择适应度较好的个体作为下一代的父代。 5. 交叉操作:对父代个体进行交叉操作,生成新的子代个体。 6. 变异操作:对子代个体进行变异操作,引入新的基因信息,增加种群的多样性。 7. 更新种群:将子代个体与父代个体合并为新的种群,并更新当前代的个体。 8. 检查终止条件:如果达到了预设的终止条件(如种群的适应度达到一定阈值或迭代次数达到一定值),则算法终止;否则返回第3步。 基于遗传算法BP神经网络优化算法主要通过种群的演化来搜索神经网络的最优解。通过不断迭代和演化,神经网络不断优化,使网络的性能进一步提高。这种算法在实际应用中取得了不错的效果,但也存在一定的局限性和参数调优的难题。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值