• 【FNN分类】基于粒子群结合引力搜索算法优化前向反馈神经网络实现数据分类附matlab代码


    1 内容介绍

    引力搜索算法(GSA)是一种基于引力定律和质量相互作用的新型启发式优化方法。实践证明,该算法具有较好的全局最优搜索能力,但在最后一次迭代中存在搜索速度较慢的问题。这项工作提出了粒子群优化 (PSO) 和 GSA 的混合体来解决上述问题。在本文中,GSA 和 PSOGSA 被用作前馈神经网络 (FNN) 的新训练方法,以研究这些算法在减少陷入局部最小值和当前进化学习算法收敛速度慢的问题方面的效率。将结果与标准的基于 PSO 的 FNN 学习算法进行比较。还研究了使用 PSO、GSA 和 PSOGSA 训练的 FNN 的准确度。实验结果表明,在收敛速度和避免局部最小值方面,PSOGSA 在训练 FNN 方面优于 PSO 和 GSA。还证明了用 PSOGSA 训练的 FNN 比用 GSA 训练的 FNN 具有更好的准确性。​

    2 仿真代码

    %% -------------------------------------------------------------------------

    clc

    clear all

    close all

    %% Data set preparation/

     load iris.txt

     x=sortrows(iris,2);

     H2=x(1:150,1);

     H3=x(1:150,2);

     H4=x(1:150,3);

     H5=x(1:150,4);

     T=x(1:150,5);

     H2=H2';

     [xf,PS] = mapminmax(H2);

     I2(:,1)=xf;

     H3=H3';

     [xf,PS2] = mapminmax(H3);

     I2(:,2)=xf;

     H4=H4';

     [xf,PS3] = mapminmax(H4);

     I2(:,3)=xf;

     H5=H5';

     [xf,PS4] = mapminmax(H5);

     I2(:,4)=xf;

     Thelp=T;

     T=T';

     [yf,PS5]= mapminmax(T);

     T=yf;

     T=T';

     %% /FNN initial parameters//

    HiddenNodes=15;       %Number of hidden codes

    Dim=8*HiddenNodes+3;  %Dimension of masses in GSA

    TrainingNO=150;       %Number of training samples

    %% GSA/

    %Configurations and initializations

    noP = 30;             %Number of masses

    Max_iteration  = 500;  %Maximum number of iteration

    w=2;              %Inirtia weight

    wMax=0.9;         %Max inirtia weight

    wMin=0.5;         %Min inirtia weight

    CurrentFitness =zeros(noP,1);

    G0=1; %Gravitational constant

    CurrentPosition = rand(noP,Dim); %Postition vector

    Velocity = .3*randn(noP,Dim) ; %Velocity vector

    acceleration=zeros(noP,Dim); %Acceleration vector

    mass(noP)=0; %Mass vector

    force=zeros(noP,Dim);%Force vector

    %Vectores for saving the location and MSE of the best mass

    gBestScore=inf;

    gBest=zeros(1,Dim);

    ConvergenceCurve=zeros(1,Max_iteration); %Convergence vector

    %Main loop

    Iteration = 0 ;                 

    while  ( Iteration < Max_iteration )

        Iteration = Iteration + 1;  

        G=G0*exp(-20*Iteration/Max_iteration); %Equation (3.3)

        force=zeros(noP,Dim);

        mass(noP)=0;

        acceleration=zeros(noP,Dim);

    %Calculate MSEs

     for i = 1:noP

            for ww=1:(7*HiddenNodes)

                Weights(ww)=CurrentPosition(i,ww);

            end

            for bb=7*HiddenNodes+1:Dim

                Biases(bb-(7*HiddenNodes))=CurrentPosition(i,bb);

            end              

            fitness=0;

            for pp=1:TrainingNO

                actualvalue=My_FNN(4,HiddenNodes,3,Weights,Biases,I2(pp,1),I2(pp,2), I2(pp,3),I2(pp,4));

                if(T(pp)==-1)

                    fitness=fitness+(1-actualvalue(1))^2;

                    fitness=fitness+(0-actualvalue(2))^2;

                    fitness=fitness+(0-actualvalue(3))^2;

                end

                if(T(pp)==0)

                    fitness=fitness+(0-actualvalue(1))^2;

                    fitness=fitness+(1-actualvalue(2))^2;

                    fitness=fitness+(0-actualvalue(3))^2;   

                end

                if(T(pp)==1)

                    fitness=fitness+(0-actualvalue(1))^2;

                    fitness=fitness+(0-actualvalue(2))^2;

                    fitness=fitness+(1-actualvalue(3))^2;              

                end

            end

            fitness=fitness/TrainingNO; %Equation (5.4)

            CurrentFitness(i) = fitness;     

            

            if(gBestScore>fitness)

                gBestScore=fitness;

                gBest=CurrentPosition(i,:);

            end  

    end

    best=min(CurrentFitness);%Equation (3.10)

    worst=max(CurrentFitness);%Equation (3.11)

    for i=1:noP

        mass(i)=(CurrentFitness(i)-0.99*worst)/(best-worst);%Equation (3.9) 

    end

    for i=1:noP

        mass(i)=mass(i)*5/sum(mass);%Equation (3.14)  

        

    end

    %Calculate froces

    for i=1:noP

        for j=1:Dim

            for k=1:noP

                if(CurrentPosition(k,j)~=CurrentPosition(i,j))

                    %Equation (3.5)

                    force(i,j)=force(i,j)+ rand()*G*mass(k)*mass(i)*(CurrentPosition(k,j)-CurrentPosition(i,j))/abs(CurrentPosition(k,j)-CurrentPosition(i,j));

                    

                end

            end

        end

    end

    %Calculate a

    for i=1:noP

           for j=1:Dim

                if(mass(i)~=0)

                    acceleration(i,j)=force(i,j)/mass(i);%Equation (3.6)

                end

           end

    end

    %Update inertia weight

    w=wMin-Iteration*(wMax-wMin)/Max_iteration;

    %Calculate V

    for i=1:noP

            for j=1:Dim

                %Equation (4.1)

                Velocity(i,j)=w*Velocity(i,j)+rand()*acceleration(i,j) + rand()*(gBest(j)-CurrentPosition(i,j));

            end

    end

    %Calculate X                                   

                

    CurrentPosition = CurrentPosition + Velocity ; %Equation (4.2)

    ConvergenceCurve(1,Iteration)=gBestScore; 

    disp(['PSOGSA is training FNN (Iteration = ', num2str(Iteration),' ,MSE = ', num2str(gBestScore),')'])        

    end

    %% ///Calculate the classification//

            Rrate=0;

            Weights=gBest(1:7*HiddenNodes);

            Biases=gBest(7*HiddenNodes+1:Dim);

             for pp=1:TrainingNO

                actualvalue=My_FNN(4,HiddenNodes,3,Weights,Biases,I2(pp,1),I2(pp,2), I2(pp,3),I2(pp,4));

                if(T(pp)==-1)

                    if (round(actualvalue(1))==1 && round(actualvalue(2))==0 && round(actualvalue(3))==0)

                        Rrate=Rrate+1;

                    end

                end

                if(T(pp)==0)

                    if (round(actualvalue(1))==0 && round(actualvalue(2))==1 && round(actualvalue(3))==0)

                        Rrate=Rrate+1;

                    end  

                end

                if(T(pp)==1)

                    if (round(actualvalue(1))==0 && round(actualvalue(2))==0 && round(actualvalue(3))==1)

                        Rrate=Rrate+1;

                    end              

                end

            end

            

    ClassificationRate=(Rrate/TrainingNO)*100;

    disp(['Classification rate = ', num2str(ClassificationRate)]);

    %% Draw the convergence curve

    hold on;      

    semilogy(ConvergenceCurve);

    title(['Classification rate : ', num2str(ClassificationRate), '%']); 

    xlabel('Iteration');

    ylabel('MSE');

    box on

    grid on

    axis tight

    hold off;

    3 运行结果

    4 参考文献

    [1] Mirjalili S A ,  Hashim S ,  Sardroudi H M . Training feedforward neural networks using hybrid particle swarm optimization and gravitational search algorithm[J]. Applied Mathematics & Computation, 2012, 218(22):11125-11137.

    博主简介:擅长智能优化算法、神经网络预测、信号处理、元胞自动机、图像处理、路径规划、无人机等多种领域的Matlab仿真,相关matlab代码问题可私信交流。

    部分理论引用网络文献,若有侵权联系博主删除。

  • 相关阅读:
    程序开机自启动(基于linux)
    c语言实现三子棋
    kubeadm init失败
    npm run build 报错:error TS7026: JSX element implicitly has type
    C语言从入门到进阶(15万字总结)
    枚举和注解05:注解
    持续集成部署-k8s-配置与存储-配置管理:ConfigMap 的热更新
    Java的环境配置
    从零开始搭建一个GIS开发小框架(五)——GMap.Net组件WPF版本使用体验
    UIStackView嵌套的Label多行文字动态高度
  • 原文地址:https://blog.csdn.net/matlab_dingdang/article/details/126299856