1 简介
BP 神经网络在求解最优化问题时易陷入局部最优值,且收敛速度慢。鱼群算法借助鱼的运动规律,设定人工鱼个体,并模拟鱼群的觅食、群聚和追尾行为,通过个体的局部寻优,实现全局最优。人工鱼在不断探索周围环境状况和同伴状态之后,汇集在几个局部最优点处,而值较大的极值区域周围一般能集结较多的人工鱼,这有助于判断并获取全局极值。因此,鱼群算法作为学习方法来改进BP 神经网络是一种很好的尝试。BP 神经网络与鱼群算法结合,就是使用鱼群算法在训练中不断调整神经网络的权值和阈值,来实现输出值和目标值误差最小。以误差最小为寻优对象,以训练连接权值和阈值为优化手段,达到寻找最优神经网络结构的目的。
鱼群算法优化 BP 神经网络的流程鱼群算法是一个循环算法,在寻优过程中不断循环往复,直到找到全局最优值,其优化 BP 神经网络具体流程,如图 2 所示。
1)确定神经网络结构。BP 神经网络是一个从输入到输出高度非线性的映射,3 层的神经网络足以实现任意维度的输入层到输出层的映射,因此本文选择 3 层 BP 神经网络。其中:输入层神经元数根据问题的表达来设定;输出层神经元数根据用户需要来设定;隐含层神经元数用式(1)来确定。式中:n1 为隐含层神经元数;n 为输入层神经元数;m 为输出层神经元数;a 为[1,10]之间的常数。BP 神经网络所选用的学习算法能否收敛,很大程度上由初始值所决定。为了使每个神经元的状态值接近于零,初始权值一般取比较小的随机数。同时,为了将尽量多的样本值归入梯度最大方向,输入样本需要进行归一化。
2 部分代码
%%%%%%%%%%%%人工鱼算法优化BP神经网络(所有数据未随机抽取)%%%%%%%%%%%%%%%%%%%%%%%%% tic;%计时开始 clc;%清屏 clear all;%清除所有变量 close all; load gqpin.txt;data1=gqpin; load gqpout.txt;data2=gqpout; data1=data1'; data2=data2'; for i=1:5 data1(i,:)=(data1(i,:)-min(data1(i,:)))/(max(data1(i,:))-min(data1(i,:))); end for i=1:1 data2(i,:)=(data2(i,:)-min(data2(i,:)))/(max(data2(i,:))-min(data2(i,:))); end data11=data1'; data22=data2'; x1=data11(:,1); y1=data22; x2=data11(:,2); y2=data22; x3=data11(:,3); y3=data22; x4=data11(:,4); y4=data22; x5=data11(:,5); y5=data22; X_sample=[x1,x2,x3,x4,x5];%X(261,5) Y_sample=[y1,y2,y3,y4,y5];%Yo(261,5) input=size(X_sample,1); %输入层神经元个数 middle=100; %显示中间层神经元个数 output=size(X_sample,1); %显示输出层神经元个数261 %%%% v=rands(input,middle); %初始化连接权矩阵v(i,j):输入层与中间层的连接权 w=rands(middle,output); %初始化连接权矩阵w(j,t):中间层与输出层的连接权 th1=rands(middle,1); %初始化中间层阈值矩阵th1:中间层的阈值 th2=rands(output,1); %初始化输出层阈值矩阵th2:输出层的阈值 out_middle=zeros(middle,1); %中间层的实际输出 out_output=zeros(output,1); %输出层的实际输出 delta_output=zeros(output,1); %输出层的差值 delta_middle=zeros(middle,1); %中间层的差值 sample_bumbers=5; %样本数 max_times=3; %最大训练次数 times=0; %训练次数 eta=0.1; %学习系数eta gamma=0.1; %学习系数gamma alpha=0.3; %动量系数 sample_pointer=0; %样本数指针 error_max=0.01; %最大误差 error_global=1; %全局误差 %%%%%%人工鱼算法初始化%%%%%%%%%%% fishnum=50; %生成50条人工鱼 MAXGEN=10; %最大迭代次数 try_number=50; %最大试探次数 visual=1; %感知距离 delta=0.618; %拥挤度因子 step=0.01; %移动步长 for times=1:max_times%begin for External Loop end %计算输出层输出: Y=w'*out_middle-th2;%Y(3,1)=w'(3,8)*out_middle(8,1)*-th2(3,1),计算输出层的输入 output_error(sample_pointer)=0 for k=1:output %k=1:3 end %计算下一次的中间层和输出层之间的连接权w(i,j),阈值th2(j) pre_w=0;pre_th2=0; for k=1:output; for j=1:middle w(j,k)=w(j,k)+eta*delta_output(k)*out_middle(j)+alpha*pre_w;%out_middle(j)=y(j) pre_w=eta*delta_output(k)*out_middle(j); end th2(k)=th2(k)+eta*delta_output(k)+alpha*pre_th2; pre_th2=eta*delta_output(k); end disp('^^^^^^^^^^^^^显示结果:^^^^^^^^^^^^^^'); fprintf('总训练次数为:%d.\n',times); fprintf('运行时间为:\n'); toc;%计时结束,并输出程序的运行时间 figure(1) plot(out_output,'r--'); hold on grid on plot(Y0,'b-'); legend('模型输出','实际输出'); figure(2) plot(Y0-out_output,'-'); grid on xlabel('输入样本'),ylabel('样本输出误差'),title('E误差');
3 仿真结果
4 参考文献
[1]陈群, 左锋, 卢文科. 基于人工鱼群BP神经网络算法的压力传感器温度补偿研究[J]. 微型机与应用, 2016, 35(009):27-29.