(PSO-BP)结合粒子群的神经网络算法以及matlab实现

原理:
           PSO(粒子群群算法):可以在全局范围内进行大致搜索,得到一个初始解,以便BP接力
           BP(神经网络):梯度搜素,细化能力强,可以进行更仔细的搜索。
数据:对该函数((2.1*(1-x+2*x.^2).*exp(-x.^2/2))+sin(x)+x','x')[-5,5]进行采样,得到30组训练数据,拟合该网络。

     神经网络结构设置:   该网络结构为,1-7-1结构,即输入1个神经元,中间神经元7个,输出1个神经元

       程序步骤:

            第一步:先采用抽取30组数据,包括输入和输出

           第一步:运行粒子群算法,进行随机搜索,选择一个最优的解,该解的维数为22维。

           第二步:在;粒子群的解基础上进行细化搜索

程序代码:

           

clc                         
clear                
  tic              
SamNum=30;                  
                
HiddenNum=7;          
InDim=1;                
OutDim=1;      

load train_x
load train_f

a=train_x';
d=train_f';

p=[a];  
t=[d];      
[SamIn,minp,maxp,tn,mint,maxt]=premnmx(p,t); 
         
NoiseVar=0.01;                 
Noise=NoiseVar*randn(1,SamNum);   
SamOut=tn + Noise;                 
    
   SamIn=SamIn';
   SamOut=SamOut';

MaxEpochs=60000;                       
lr=0.025;                                      
E0=0.65*10^(-6);                              

%%
%the begin of PSO
   
E0=0.001;
Max_num=500;
particlesize=200;
c1=1;
c2=1;
w=2;
vc=2;
vmax=5;
dims=InDim*HiddenNum+HiddenNum+HiddenNum*OutDim+OutDim;
x=-4+7*rand(particlesize,dims);
v=-4+5*rand(particlesize,dims);
f=zeros(particlesize,1);
 %%
 for jjj=1:particlesize
     trans_x=x(jjj,:);
    W1=zeros(InDim,HiddenNum);   
    B1=zeros(HiddenNum,1);    
    W2=zeros(HiddenNum,OutDim);           
    B2=zeros(OutDim,1);

    W1=trans_x(1,1:HiddenNum);
    B1=trans_x(1,HiddenNum+1:2*HiddenNum)'; 
    W2=trans_x(1,2*HiddenNum+1:3*HiddenNum)';           
    B2=trans_x(1,3*HiddenNum+1); 
    Hiddenout=logsig(SamIn*W1+repmat(B1',SamNum,1));
    Networkout=Hiddenout*W2+repmat(B2',SamNum,1);
    Error=Networkout-SamOut;                       
    SSE=sumsqr(Error)  
    
     f(jjj)=SSE;
 end
personalbest_x=x;
personalbest_f=f;
[groupbest_f i]=min(personalbest_f);
groupbest_x=x(i,:);
for j_Num=1:Max_num
      vc=(5/3*Max_num-j_Num)/Max_num;
    %%     
       v=w*v+c1*rand*(personalbest_x-x)+c2*rand*(repmat(groupbest_x,particlesize,1)-x);
        for kk=1:particlesize
              for  kk0=1:dims
              if v(kk,kk0)>vmax
                     v(kk,kk0)=vmax;
              else if v(kk,kk0)<-vmax
                      v(kk,kk0)=-vmax;
                  end
              end
              end
        end
        x=x+vc*v;
        %%
    for jjj=1:particlesize
                    trans_x=x(jjj,:);
                    W1=zeros(InDim,HiddenNum);   
                    B1=zeros(HiddenNum,1);    
                    W2=zeros(HiddenNum,OutDim);           
                    B2=zeros(OutDim,1);

                    W1=trans_x(1,1:HiddenNum);
                    B1=trans_x(1,HiddenNum+1:2*HiddenNum)'; 
                    W2=trans_x(1,2*HiddenNum+1:3*HiddenNum)';           
                    B2=trans_x(1,3*HiddenNum+1); 
                    Hiddenout=logsig(SamIn*W1+repmat(B1',SamNum,1));
                    Networkout=Hiddenout*W2+repmat(B2',SamNum,1);
                    Error=Networkout-SamOut;                       
                    SSE=sumsqr(Error);  
    
                   f(jjj)=SSE;
     
 end    
 %%
     for kk=1:particlesize
         if f(kk)<personalbest_f(kk)
             personalbest_f(kk)=f(kk);
             personalbest_x(kk)=x(kk);
         end
     end
     [groupbest_f0 i]=min(personalbest_f);
     
     if    groupbest_f0<groupbest_f
     groupbest_x=x(i,:);
     groupbest_f=groupbest_f0;
     end
     ddd(j_Num)=groupbest_f
end
   str=num2str(groupbest_f);
    trans_x=groupbest_x;
    W1=trans_x(1,1:HiddenNum);
    B1=trans_x(1,HiddenNum+1:2*HiddenNum)'; 
    W2=trans_x(1,2*HiddenNum+1:3*HiddenNum)';           
    B2=trans_x(1,3*HiddenNum+1); 
%the end of PSO
%%
                            
for i=1:MaxEpochs
    %%
    Hiddenout=logsig(SamIn*W1+repmat(B1',SamNum,1));
    Networkout=Hiddenout*W2+repmat(B2',SamNum,1);
    Error=Networkout-SamOut;                       
    SSE=sumsqr(Error)                          

    ErrHistory=[ SSE];

    if SSE<E0,break, end      
      dB2=zeros(OutDim,1);
      dW2=zeros(HiddenNum,OutDim);
                for jj=1:HiddenNum  
                             for k=1:SamNum
                             dW2(jj,OutDim)=dW2(jj,OutDim)+Error(k)*Hiddenout(k,jj);
                             end
                end 
               for k=1:SamNum
                                 dB2(OutDim,1)=dB2(OutDim,1)+Error(k);
                             end        
     dW1=zeros(InDim,HiddenNum);
     dB1=zeros(HiddenNum,1);
  for ii=1:InDim
       for jj=1:HiddenNum
                  
                         for k=1:SamNum
                                 dW1(ii,jj)=dW1(ii,jj)+Error(k)*W2(jj,OutDim)*Hiddenout(k,jj)*(1-Hiddenout(k,jj))*(SamIn(k,ii));
                                 dB1(jj,1)=dB1(jj,1)+Error(k)*W2(jj,OutDim)*Hiddenout(k,jj)*(1-Hiddenout(k,jj));

                         end
              end
  end

    W2=W2-lr*dW2;
    B2=B2-lr*dB2;
   
    W1=W1-lr*dW1;
    B1=B1-lr*dB1;
end

Hiddenout=logsig(SamIn*W1+repmat(B1',SamNum,1));
Networkout=Hiddenout*W2+repmat(B2',SamNum,1);
    
aa=postmnmx(Networkout,mint,maxt);             
x=a;                                   
newk=aa;                                    
          figure                           
plot(x,d,'r-o',x,newk,'b--+') 
legend('原始数据','训练后的数据');
xlabel('x');ylabel('y');
toc

      

注:在(i5,8G,win7,64位)PC上的运行时间为30s左右。鉴于PSO带有概率性,可以多跑几次,看最佳的一次效果。

      

转载于:https://www.cnblogs.com/jacksin/p/8835907.html

  • 9
    点赞
  • 0
    评论
  • 101
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

粒子群优化算法是一种新颖的仿生、群智能优化算法。该算法原理简单、需调整的参数少、收敛速度快而且易于实现,因此近年来粒子群算法引起了广大学者的关注。然而到目前为止粒子群算法的在理论分析和实践应用方面尚未成熟,仍有大量的问题需进一步研究。本文针对粒子群算法易出现“早熟”陷入局部极小值问题对标准粒子群算法进行改进并将改进的粒子群算法应用于BP神经网络中。本文的主要工作如下:本文首先介绍了粒子群算法的国内外的研究现状与发展概况,较系统地分析了粒子群优化算法的基本理论,总结常见的改进的粒子群优化算法。其次介绍了Hooke-Jeeves模式搜索法的算法分析、基本流程及应用领域。针对标准粒子群优化算法存在“早熟”问题,易陷入局部极小值的缺点,本文对标准粒子群算法进行改进。首先将原始定义的初始种群划分为两个相同的子种群,采用基于适应度支配的思想分别将每个子种群划分为两个子集,Pareto子集和N_Pareto子集;然后将两个子群中的适应度较优的两个Pareto子集合为新种群。Griewank和Rastrigin由于新种群的参数设置区别于标准粒子群算法的参数设置,新的粒子与标准种群中的粒子飞行轨迹不同,种群的探索范围扩大,从而使算法的全局搜索能力有所提高。 为平衡粒子群算法的全局寻优能力和局部寻优能力,提高粒子群算法的求解精度和效率,本文在新种群寻优过程中引入具有强收敛能力Hooke-Jeeves搜索法,提出了IMPSO算法。雅文网www.lunwendingzhi.com,并用IMPSO算法对标准基准测试函数进行实验,将得到的实验结果并与标准粒子群算法对基准函数的实验结果进行对比,仿真结果证明了该改进的粒子群算法的有效性。 最后本文研究改进的粒子群算法BP神经网络中的应用。首先介绍人工神经网络的原理及基于BP算法的多层前馈神经网络,其次用IMPSO算法训练BP神经网络并给出训练流程图。 将IMPSO算法训练的BP神经网络分别应用于齿轮热处理中硬化层深的预测以及用于柴油机的缸盖与缸壁的故障诊断中,并将预测结果、诊断结果与BP神经网络、标准粒子群优化算法训练的BP神经网络的实验结果进行对比,实验结果证明了改进的粒子群算法训练BP网络具有更强的优化性能和学习能力。 英文简介: Particle swarm optimization algorithm is a novel bionic, swarm intelligence optimization algorithm. The algorithm principle is simple, less need to adjust the parameters and convergence speed is fast and easy to implement, so in recent years, particle swarm optimization (pso) to cause the attention of many scholars. So far, however, the particle swarm algorithm are not mature in theory analysis and practice applications, there are still a lot of problems need further research. Based on particle swarm algorithm is prone to "premature" into a local minimum value problem to improve the standard particle swarm algorithm and improved particle swarm optimization (pso) algorithm was applied to BP neural network. This paper's main work is as follows: at first, this paper introduces the particle swarm algorithm in the general situation of the research status and development at home and abroad, systematically analyzes the basic theory of particle swarm optimization algorithm, summarizes the common improved particle swarm optimization algorithm
表情包
插入表情
评论将由博主筛选后显示,对所有人可见 | 还能输入1000个字符
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值