700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > 遗传算法优化BP神经网络的实例

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

时间:2021-09-08 03:21:44

相关推荐

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

本文内容为将遗传算法与BP神经网络算法相结合,优化神经网络的权值阈值

BP网络是一类多层的前馈神经网络。它的名字源于在网络训练的过程中,调整网络的权值的算法是误差的反向传播的学习算法,即为BP学习算法。其具有结构简单,可调整的参数多,训练算 法好等优点。据统计,80以上的神经网络模型都是采用了BP网络或其变形。但其也具有学习收敛速度太慢、不能保证收敛到全局最小点等缺陷。

我们忽略实际工程问题背景,直接引入9组样本数据,每组样本数据含有15个变量(输入参数)。其结果(输出参数)为三种,我们分别用(1,0,0)、(0,1,0)和(0,0,1)来表示。同时为了对训练好的网络进行测试,另有三组新数据作为网络的测试数据。

样本数据和测试数据如下:

%%样本数据%%样本输入参数0.2286 0.2090 0.0442 0.2603 0.3690 0.0359 0.1759 0.0724 0.26340.1292 0.0947 0.0880 0.1715 0.2222 0.1149 0.2347 0.1909 0.22580.0720 0.1393 0.1147 0.0702 0.0562 0.1230 0.1829 0.1340 0.11650.1592 0.1387 0.0563 0.2711 0.5157 0.5460 0.1811 0.2409 0.11540.1335 0.2558 0.3347 0.1491 0.1872 0.1977 0.2922 0.2842 0.10740.0733 0.0900 0.1150 0.1330 0.1614 0.1248 0.0655 0.0450 0.06570.1159 0.0771 0.1453 0.0968 0.1425 0.0624 0.0774 0.0824 0.06100.0940 0.0882 0.0429 0.1911 0.1506 0.0832 0.0227 0.1064 0.26230.0522 0.0393 0.1818 0.2545 0.1310 0.1640 0.2056 0.1909 0.25880.1345 0.1430 0.0378 0.0871 0.0500 0.1002 0.0925 0.1586 0.11550.0090 0.0126 0.0092 0.0060 0.0078 0.0059 0.0078 0.0116 0.00500.1260 0.1670 0.2251 0.1793 0.0348 0.1503 0.1852 0.1698 0.09780.3619 0.2450 0.1516 0.1002 0.0451 0.1837 0.3501 0.3644 0.15110.0690 0.0508 0.0858 0.0789 0.0707 0.1295 0.1680 0.2718 0.22730.1828 0.1328 0.0670 0.0909 0.0880 0.0700 0.2668 0.2494 0.3220%%样本输出参数1,0,0 1,0,01,0,00,1,00,1,00,1,00,0,10,0,1 0,0,1%%测试数据%%测试输入参数0.2101 0.2593 0.25990.0950 0.1800 0.22350.1298 0.0711 0.1.1359 0.2801 0.00710.2601 0.1501 0.11020.1001 0.1298 0.06830.0753 0.1001 0.06210.0890 0.1891 0.25970.0389 0.2531 0.26020.1451 0.0875 0.11670.0128 0.0058 0.00480.1590 0.1803 0.10020.2452 0.0992 0.15210.0512 0.0802 0.22810.1319 0.1002 0.3205%%测试输出参数1,0,00,1,00,0,1

BP网络算法的实现:
网络创建

对于本实例而言,样本有15个输入参数,3个输出参数。故我们取输入层神经元n1个数为15,输出层神经元n3个数为3。而隐含层神经网络个数n2由其与输入层神经元个数关系,得到其值为31。

其中权值个数为15×31+31×3=58815\times31+31\times3=58815×31+31×3=588,阈值个数为31+3=3431+3=3431+3=34。所以遗传算法优化参数的个数为592。

神经网络的隐含层神经元的传递函数采用S型正切函数tansig(),输出层神经元的传递函数采用S型对数函数logsig()。P为输入样本矩阵,则创建网络可以用代码:

net=newff(minmax(P),[hiddennum,outputnum],{'tansig','logsig'},'trainlm');

网络训练和测试

网络训练是不断修正权值和阈值的过程,使误差越来越小。训练函数为train()。通过以下代码进行网络参数设置和调用函数。代码如下:

%% 设置网络参数:训练次数为1000,训练目标为0.01,学习速率为0.1net.trainParam.epochs=1000;net.trainParam.goal=0.01;LP.lr=0.1;net.trainParam.show=NaN;

网络训练之后,再对网络进行测试。P_test为测试数据。测试代码如下:

Y=sim(net,P_test);

遗传算法的实现:

实例使用谢菲尔德工具箱,实现种群初始化,适应度函数,选择、交叉、变异和重插来优化BP神经网络中的权值和阈值。其中参数有:种群大小为40,遗传迭代次数为50,变量二进制位数为10,交叉概率设置为0.7,变异概率设置为0.01,代沟设置为0.95。

MATLAB程序实现:

案例将神经网络算法中预测样本所得到的误差值的范数座位遗传算法中的目标函数。误差越小则表示网络的预测精度越高,在遗传算法部分得到的该个体的适应度值也越大。

神经网络算法代码:

function err=Bpfun(x,P,T,hiddennum,P_test,T_test)%% 训练&测试BP网络%% 输入% x:一个个体的初始权值和阈值% P:训练样本输入% T:训练样本输出% hiddennum:隐含层神经元数% P_test:测试样本输入% T_test:测试样本期望输出%% 输出% err:预测样本的预测误差的范数inputnum=size(P,1); % 输入层神经元个数outputnum=size(T,1);% 输出层神经元个数%% 新建BP网络net=newff(minmax(P),[hiddennum,outputnum],{'tansig','logsig'},'trainlm');%% 设置网络参数:训练次数为1000,训练目标为0.01,学习速率为0.1net.trainParam.epochs=1000;net.trainParam.goal=0.01;LP.lr=0.1;net.trainParam.show=NaN;% 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,T);%% 测试网络Y=sim(net,P_test);err=norm(Y-T_test);

遗传算法主函数:

%% 加载神经网络的训练样本 测试样本每列一个样本 输入P 输出T%样本数据就是前面问题描述中列出的数据load data% 初始隐层神经元个数hiddennum=31;% 输入向量的最大值和最小值threshold=[0 1;0 1;0 1;0 1;0 1;0 1;0 1;0 1;0 1;0 1;0 1;0 1;0 1;0 1;0 1];inputnum=size(P,1); % 输入层神经元个数outputnum=size(T,1);% 输出层神经元个数w1num=inputnum*hiddennum; % 输入层到隐层的权值个数w2num=outputnum*hiddennum;% 隐层到输出层的权值个数N=w1num+hiddennum+w2num+outputnum; %待优化的变量的个数%% 定义遗传算法参数NIND=40; %个体数目MAXGEN=50;%最大遗传代数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<MAXGENfprintf('%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 onxlabel('遗传代数')ylabel('误差的变化')title('进化过程')bestX=trace(1:end-1,end);bestErr=trace(end,end);fprintf(['最优初始权值阈值:\nX=',num2str(bestX'),'\n最小误差err=',num2str(bestErr),'\n'])

最终结果:

最小误差范值err=0.05185。误差进化图如下:

需要源码请在文章下留言

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。