文章目录

  • 一、算法介绍
    • 1.1 遗传算法
    • 1.2BP神经网络
  • 二、MATLAB实现
    • 2.1 问题介绍
    • 2.2 未优化的BP神经网络
    • 2.3 遗传算法优化的的BP神经网络
      • 2.3.1 适应度函数
      • 2.3.2 选择操作
      • 2.3.3 交叉操作
      • 2.3.3 变异操作
      • 2.3.4 主函数

一、算法介绍

1.1 遗传算法

  遗传算法(Genetic Algorithm,GA)最早是由美国的 John holland于20世纪70年代提出,该算法是根据大自然中生物体进化规律而设计提出的。是模拟达尔文生物进化论的自然选择和遗传学机理的生物进化过程的计算模型,是一种通过模拟自然进化过程搜索最优解的方法。该算法通过数学的方式,利用计算机仿真运算,将问题的求解过程转换成类似生物进化中的染色体基因的交叉、变异等过程。在求解较为复杂的组合优化问题时,相对一些常规的优化算法,通常能够较快地获得较好的优化结果。遗传算法已被人们广泛地应用于组合优化、机器学习、信号处理、自适应控制和人工生命等领域。
  具体介绍请看这篇遗传算法详细介绍以及基于遗传算法和非线性规划函数的寻优算法—MATLAB实现
  算法流程如下:

1.2BP神经网络

  BP(back propagation)神经网络是1986年由Rumelhart和McClelland为首的科学家提出的概念,是一种按照误差逆向传播算法训练的多层前馈神经网络,是应用最广泛的神经网络模型之一。
  人工神经网络无需事先确定输入输出之间映射关系的数学方程,仅通过自身的训练,学习某种规则,在给定输入值时得到最接近期望输出值的结果。作为一种智能信息处理系统,人工神经网络实现其功能的核心是算法。BP神经网络是一种按误差反向传播(简称误差反传)训练的多层前馈网络,其算法称为BP算法,它的基本思想是梯度下降法,利用梯度搜索技术,以期使网络的实际输出值和期望输出值的误差均方差为最小。
  基本BP算法包括信号的前向传播和误差的反向传播两个过程。即计算误差输出时按从输入到输出的方向进行,而调整权值和阈值则从输出到输入的方向进行。正向传播时,输入信号通过隐含层作用于输出节点,经过非线性变换,产生输出信号,若实际输出与期望输出不相符,则转入误差的反向传播过程。误差反传是将输出误差通过隐含层向输入层逐层反传,并将误差分摊给各层所有单元,以从各层获得的误差信号作为调整各单元权值的依据。通过调整输入节点与隐层节点的联接强度和隐层节点与输出节点的联接强度以及阈值,使误差沿梯度方向下降,经过反复学习训练,确定与最小误差相对应的网络参数(权值和阈值),训练即告停止。此时经过训练的神经网络即能对类似样本的输入信息,自行处理输出误差最小的经过非线形转换的信息。
  具体介绍请看这篇BP神经网络分类以及对算法进行改进—MATLAB实现
  BP神经网络结构:

二、MATLAB实现

2.1 问题介绍

  有一组广告销售额的数据为200×\times× 4的矩阵,前3列为输入变量,最后一列为销售额,输出变量,共200个数据。将数据的前150组训练模型,后50组来验证模型准确率。
  数据大致如下:

TV radio newspaper sales
230.1 37.8 69.2 22.1
44.5 39.3 45.1 10.4
17.2 45.9 69.3 9.3
··· ··· ··· ···

2.2 未优化的BP神经网络

clc;clear all;close all;
%读取数据
data=xlsread('广告和销售额数据.xlsx');
%训练预测数据
data_train=data(1:150,1:4);
data_test=data(151:200,1:4);input_train=data_train(:,1:3)';
output_train=data_train(:,4)';input_test=data_test(:,1:3)';
output_test=data_test(:,4)';%数据归一化
[inputn,mininput,maxinput,outputn,minoutput,maxoutput]=premnmx(input_train,output_train); %对p和t进行字标准化预处理
net=newff(minmax(inputn),[10,1],{'tansig','purelin'},'trainlm');net.trainParam.epochs=1000;
net.trainParam.lr=0.1;
net.trainParam.goal=0.001;
net.trainParam.show=200;%网络训练
net=train(net,inputn,outputn);
%数据归一化
inputn_test = tramnmx(input_test,mininput,maxinput);
an=sim(net,inputn_test);
test_simu=postmnmx(an,minoutput,maxoutput);
error=test_simu-output_test;
e=sum(abs(test_simu-output_test))Yn=test_simu;
figure(1)                        %绘图
plot(Yn,'r*-')                %绘制预测值曲线
hold on                       %继续绘图
plot(output_test,'bo')                  %实际值曲线
legend('预测值','实际值')      %图例

预测结果于真实值对比图如下:

重复5次求得每次的结果误差为:

结果误差
第一次 15.8820
第二次 15.0166
第三次 17.7604
第四次 18.8338
第五次 17.9484

2.3 遗传算法优化的的BP神经网络

2.3.1 适应度函数

适应度函数用训练数据训练BP神经网络,并且把训练数据预测误差作为个体适应度值。

function error = fun(x,inputnum,hiddennum,outputnum,~,inputn,outputn)
%该函数用来计算适应度值,BP神经网络预测,记录预测误差
%运用新版本netff
%x          input     个体
%inputnum   input     输入层节点数
%outputnum  input     隐含层节点数
%net        input     网络
%inputn     input     训练输入数据
%outputn    input     训练输出数据%error      output    个体适应度值
%提取
w1=x(1:inputnum*hiddennum);
B1=x(inputnum*hiddennum+1:inputnum*hiddennum+hiddennum);
w2=x(inputnum*hiddennum+hiddennum+1:inputnum*hiddennum+hiddennum+hiddennum*outputnum);
B2=x(inputnum*hiddennum+hiddennum+hiddennum*outputnum+1:inputnum*hiddennum+hiddennum+hiddennum*outputnum+outputnum);net=newff(inputn,outputn,hiddennum);
%网络进化参数
net.trainParam.epochs=1000;
net.trainParam.lr=0.1;
net.trainParam.goal=0.001;
net.trainParam.show=100;
net.trainParam.showWindow=0;%网络权值赋值
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,inputn,outputn);an=sim(net,inputn);error=sum(abs(an-outputn));

2.3.2 选择操作

选择操作采用轮盘赌法从种群中选择适应度好的个体组成新种群。

function ret=Select(individuals,sizepop)
% 该函数用于进行选择操作
% individuals input    种群信息
% sizepop     input    种群规模
% ret         output   选择后的新种群%求适应度值倒数
fitness1=10./individuals.fitness; %individuals.fitness为个体适应度值%个体选择概率
sumfitness=sum(fitness1);
sumf=fitness1./sumfitness;%采用轮盘赌法选择新个体
index=[];
for i=1:sizepop   %sizepop为种群数pick=rand;while pick==0    pick=rand;        endfor i=1:sizepop    pick=pick-sumf(i);        if pick<0        index=[index i];            break;  endend
end%新种群
individuals.chrom=individuals.chrom(index,:);   %individuals.chrom为种群中个体
individuals.fitness=individuals.fitness(index);
ret=individuals;

2.3.3 交叉操作

交叉操作从种群中选择两个个体,按一定概率交叉得到新个体。

function ret=Cross(pcross,lenchrom,chrom,sizepop,bound)
%本函数完成交叉操作
% pcorss                input  : 交叉概率
% lenchrom              input  : 染色体的长度
% chrom     input  : 染色体群
% sizepop               input  : 种群规模
% ret                   output : 交叉后的染色体for i=1:sizepop  %每一轮for循环中,可能会进行一次交叉操作,染色体是随机选择的,交叉位置也是随机选择的,%但该轮for循环中是否进行交叉操作则由交叉概率决定(continue控制)% 随机选择两个染色体进行交叉pick=rand(1,2);while prod(pick)==0pick=rand(1,2);endindex=ceil(pick.*sizepop);% 交叉概率决定是否进行交叉pick=rand;while pick==0pick=rand;endif pick>pcrosscontinue;endflag=0;while flag==0% 随机选择交叉位pick=rand;while pick==0pick=rand;endpos=ceil(pick.*sum(lenchrom)); %随机选择进行交叉的位置,即选择第几个变量进行交叉,注意:两个染色体交叉的位置相同pick=rand; %交叉开始v1=chrom(index(1),pos);v2=chrom(index(2),pos);chrom(index(1),pos)=pick*v2+(1-pick)*v1;chrom(index(2),pos)=pick*v1+(1-pick)*v2; %交叉结束flag1=test(lenchrom,bound,chrom(index(1),:));  %检验染色体1的可行性flag2=test(lenchrom,bound,chrom(index(2),:));  %检验染色体2的可行性if   flag1*flag2==0flag=0;else flag=1;end    %如果两个染色体不是都可行,则重新交叉endend
ret=chrom;

2.3.3 变异操作

变异操作从种群中随机选择一个个体,按一定概率变异得到新个体。

function ret=Mutation(pmutation,lenchrom,chrom,sizepop,num,maxgen,bound)
% 本函数完成变异操作
% pcorss                input  : 变异概率
% lenchrom              input  : 染色体长度
% chrom     input  : 染色体群
% sizepop               input  : 种群规模
% opts                  input  : 变异方法的选择
% pop                   input  : 当前种群的进化代数和最大的进化代数信息
% bound                 input  : 每个个体的上届和下届
% maxgen                input  :最大迭代次数
% num                   input  : 当前迭代次数
% ret                   output : 变异后的染色体
for i=1:sizepop   %每一轮for循环中,可能会进行一次变异操作,染色体是随机选择的,变异位置也是随机选择的,%但该轮for循环中是否进行变异操作则由变异概率决定(continue控制)% 随机选择一个染色体进行变异pick=rand;while pick==0pick=rand;endindex=ceil(pick*sizepop);% 变异概率决定该轮循环是否进行变异pick=rand;if pick>pmutationcontinue;endflag=0;while flag==0% 变异位置pick=rand;while pick==0      pick=rand;endpos=ceil(pick*sum(lenchrom));  %随机选择了染色体变异的位置,即选择了第pos个变量进行变异pick=rand; %变异开始     fg=(rand*(1-num/maxgen))^2;if pick>0.5chrom(i,pos)=chrom(i,pos)+(bound(pos,2)-chrom(i,pos))*fg;elsechrom(i,pos)=chrom(i,pos)-(chrom(i,pos)-bound(pos,1))*fg;end   %变异结束flag=test(lenchrom,bound,chrom(i,:));     %检验染色体的可行性end
end
ret=chrom;

2.3.4 主函数

% 清空环境变量
clc
clear
close all;
%
%% 网络结构建立
%读取数据
data=xlsread('广告和销售额数据.xlsx');
%节点个数
inputnum=3;  %输入变量的个数
hiddennum=10;
outputnum=1;  %输出变量的个数
data_train=data(1:150,1:4);
data_test=data(151:200,1:4);input_train=data_train(:,1:3)';
output_train=data_train(:,4)';input_test=data_test(:,1:3)';
output_test=data_test(:,4)';[inputn,inputps]=mapminmax(input_train);
[outputn,outputps]=mapminmax(output_train);
net=newff(inputn,outputn,hiddennum,{'tansig','purelin'},'trainlm');%% 遗传算法参数初始化
maxgen=50;                         %进化代数,即迭代次数
sizepop=20;                        %种群规模
pcross=[0.3];                       %交叉概率选择,0和1之间
pmutation=[0.1];                    %变异概率选择,0和1之间%节点总数
numsum=inputnum*hiddennum+hiddennum+hiddennum*outputnum+outputnum;lenchrom=ones(1,numsum);
bound=[-3*ones(numsum,1) 3*ones(numsum,1)];    %数据范围%------------------------------------------------------种群初始化--------------------------------------------------------
individuals=struct('fitness',zeros(1,sizepop), 'chrom',[]);  %将种群信息定义为一个结构体
avgfitness=[];                      %每一代种群的平均适应度
bestfitness=[];                     %每一代种群的最佳适应度
bestchrom=[];                       %适应度最好的染色体
%初始化种群
for i=1:sizepop%随机产生一个种群individuals.chrom(i,:)=Code(lenchrom,bound);    %编码(binary和grey的编码结果为一个实数,float的编码结果为一个实数向量)x=individuals.chrom(i,:);%计算适应度individuals.fitness(i)=fun(x,inputnum,hiddennum,outputnum,net,inputn,outputn);   %染色体的适应度
end%找最好的染色体
[bestfitness, bestindex]=min(individuals.fitness);
bestchrom=individuals.chrom(bestindex,:);  %最好的染色体
avgfitness=sum(individuals.fitness)/sizepop; %染色体的平均适应度
% 记录每一代进化中最好的适应度和平均适应度
trace=[avgfitness bestfitness]; %% 迭代求解最佳初始阀值和权值
% 进化开始
for i=1:maxgen% 选择individuals=Select(individuals,sizepop); avgfitness=sum(individuals.fitness)/sizepop;%交叉individuals.chrom=Cross(pcross,lenchrom,individuals.chrom,sizepop,bound);% 变异individuals.chrom=Mutation(pmutation,lenchrom,individuals.chrom,sizepop,i,maxgen,bound);% 计算适应度 for j=1:sizepopx=individuals.chrom(j,:); %解码individuals.fitness(j)=fun(x,inputnum,hiddennum,outputnum,net,inputn,outputn);   end%找到最小和最大适应度的染色体及它们在种群中的位置[newbestfitness,newbestindex]=min(individuals.fitness);[worestfitness,worestindex]=max(individuals.fitness);% 代替上一次进化中最好的染色体if bestfitness>newbestfitnessbestfitness=newbestfitness;bestchrom=individuals.chrom(newbestindex,:);endindividuals.chrom(worestindex,:)=bestchrom;individuals.fitness(worestindex)=bestfitness;avgfitness=sum(individuals.fitness)/sizepop;trace=[trace;avgfitness bestfitness]; %记录每一代进化中最好的适应度和平均适应度end
%% 遗传算法结果分析 figure(1)
[r, c]=size(trace);plot([1:r]',trace(:,1),'b--');%平均适应度曲线
hold on                       %继续绘图
plot([1:r]',trace(:,2),'r-'); %每一代种群的最佳适应度曲线
title(['适应度曲线  ' '终止代数=' num2str(maxgen)]);
xlabel('进化代数');ylabel('适应度');
legend('平均适应度','最佳适应度');
x=bestchrom;%% 把最优初始阀值权值赋予网络预测
% %用遗传算法优化的BP网络进行值预测
w1=x(1:inputnum*hiddennum);
B1=x(inputnum*hiddennum+1:inputnum*hiddennum+hiddennum);
w2=x(inputnum*hiddennum+hiddennum+1:inputnum*hiddennum+hiddennum+hiddennum*outputnum);
B2=x(inputnum*hiddennum+hiddennum+hiddennum*outputnum+1:inputnum*hiddennum+hiddennum+hiddennum*outputnum+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);%% BP网络训练
%网络进化参数
net.trainParam.epochs=1000;
net.trainParam.lr=0.1;
net.trainParam.goal=0.001;%网络训练
[net,per2]=train(net,inputn,outputn);%% BP网络预测
%数据归一化
inputn_test=mapminmax('apply',input_test,inputps);
an=sim(net,inputn_test);
test_simu=mapminmax('reverse',an,outputps);
error=test_simu-output_test;
e=sum(abs(test_simu-output_test))Yn=test_simu;
figure(2)                        %绘图
plot(Yn,'r*-')                %绘制预测值曲线clchold on                       %继续绘图
plot(output_test,'bo')                  %实际值曲线
legend('预测值','实际值')      %图例

预测结果于真实值对比图如下:

重复5次求得每次的结果误差为:

结果误差
第一次 14.1473
第二次 26.4658
第三次 15.5426
第四次 14.3759
第五次 18.8988

将这个结果与之前的未优化的结果进行对比可以看出,的确有更好的结果出现了,起到了优化的作用。但同时也会有部分的较差的结果,这是因为遗传算法陷于了局部最优的情况。我们可以用其他算法例如粒子群算法或者模拟退火算法对此进一步优化。

代码链接:https://pan.baidu.com/s/1hOqbNXAUapEL609qwZpiIA
提取码:6666

遗传算法优化神经网络—MATLAB实现相关推荐

  1. ​遗传算法优化神经网络实现数据预测

    作者 | 李秋键 责编 | 寇雪芹 头图 | 下载于视觉中国 出品 | AI科技大本营(ID:rgznai100) 引言 随着人工智能和大数据的发展,大量实验和数据处理等流程对算法的要求也随之变得越来 ...

  2. 蚁群算法优化神经网络matlab源程序,粒子群优化神经网络的程序大集合

    粒子群程序集合 866867259psobp psobp.m pso(粒子群算法)优化神经网络 粒子群算法(PSO)应用于神经网络优化[matlab] PSOt A Particle Swarm Op ...

  3. 基于 MATLAB 的遗传算法优化神经网络

    面对较复杂的非线性系统问题时,由于 BP 网络设置的初始权值依赖设计者的经验和样本空间的反复试验,容易产生收敛速度慢.网络不稳定以及陷入局部最优等一系列问题.将 BP 神经网络算法与遗传算法结合,理论 ...

  4. 遗传算法优化matlab,遗传算法优化相关MATLAB算法实现

    遗传算法 1.案例背景 遗传算法(Genetic Algorithm,GA)是一种进化算法,其基本原理是仿效生物界中的"物竞天择.适者生存"的演化法则.遗传算法的做法是把问题参数编 ...

  5. 遗传算法 优化 工具箱 matlab pareto front,matlab遗传算法三目标优化,出来的pareto前沿图只是二维图...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 三目标不是三维图么?怎么修改啊?啊 function f=multidisk(x) global I1 I2 F r=350;u=0.5;fai=1;W= ...

  6. 阈值法matlab程序,遗传算法优化BP神经网络权值和阈值的通用MATLAB源码

    遗传算法优化神经网络有两种情况,一种是把训练好的神经网络作为黑箱函数,用遗传算法搜索该黑箱函数的最大值,另外一种情况,则是把遗传算法用于神经网络的训练,充分利用遗传算法全局搜索的特性,得到一个初始的权 ...

  7. 《MATLAB 神经网络43个案例分析》:第3章 遗传算法优化BP神经网络——非线性函数拟合

    <MATLAB 神经网络43个案例分析>:第3章 遗传算法优化BP神经网络--非线性函数拟合 1. 前言 2. MATLAB 仿真示例 3. 小结 1. 前言 <MATLAB 神经网 ...

  8. 【ELM分类】基于matlab遗传算法优化ELM神经网络数据分类【含Matlab源码 2138期】

    ⛄一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[ELM分类]基于matlab遗传算法优化ELM神经网络数据分类[含Matlab源码 2138期] 点击上面蓝色字体,直接付费下载,即可. ...

  9. 双隐藏层BP网络的matlab仿真,求遗传算法优化含有两个隐含层的BP神经网络的matlab程序...

    怎样用遗传算法优化含有两个隐含层的BP神经网络的matlab程序啊,这个代码是错的,可不知道错在哪,求高手帮忙解答,非常感谢! FieldD=[repmat(PRECI,1,N);repmat([-0 ...

  10. (Matlab)遗传算法优化的BP神经网络实现回归预测

    目录 摘要: 1.BP神经网络介绍: 2.遗传算法原理介绍: 3.遗传算法优化的BP神经网络: 4.算例分析: 5.Matlab代码实现 摘要: 基于Matalb平台,将遗传算法(GA)与BP神经网络 ...

最新文章

  1. Haproxy Nginx cluster构建
  2. python输入字母判断大小写_Python-检查输入的数字、大写字母、小写字母和特殊字符...
  3. Wormholes--POJ 3259
  4. text type dropdown list - INIT_DATA
  5. Y/C分离/2/3D滤波器
  6. linux系统安装serv u,建立第一个可用的FTP服务器
  7. Python 反爬篇之 ID 混淆
  8. udp 协议阻断_应对UDP反射放大攻击的五种常用防护思路
  9. 切换至 root 身份
  10. html音乐静音代码,HTML Audio muted用法及代码示例
  11. java语言的优缺点
  12. 微信小程序显示列表数据
  13. 在SQL Server2012上搭建Northwind详细教程,SQL2000SampleDb.msi的资源
  14. JAVA(jar)软件_Autojar - 打包工具 - 开发工具 - JAVA开源项目 - 开源吧
  15. 留学生如何搞定Extended Essay?
  16. docx.opc.exceptions.PackageNotFoundError: Package not found at
  17. android手势控制动画,轻松实现Android,iOS的一个手势动画效果
  18. 如何解决Error while saving file: Unable to open database file问题
  19. GitModel|Task04|随机模拟
  20. 如何快速搜索电脑文件

热门文章

  1. webservice 视频教程 Spring+xfire 整合
  2. 操作系统概念第四章部分作业题答案
  3. [软件更新]卡巴斯基全功能安全软件2010简体中文版程序发布
  4. 私塾在线 Java架构师在线课程(148讲教程)
  5. discuz子导航下面的版块只有图标没有标题,什么原因?
  6. 安徽大学(线性代数第一章详细答案)
  7. php各安装包中TS和NTS及SRC/VC6|VC9|VC11|VC14|VC15版本区别意思详解(转)
  8. css3仿手机版淘宝商品并列显示
  9. 操作系统——Windows 控制台命令
  10. 牛逼了,跨平台桌面端视频资源播放器,简洁无广告,免费高颜值