MATLAB实现PSO-BP:粒子群算法优化BP神经网络数值预测(完整代码+数据)

CSDN 2024-06-10 13:05:08 阅读 87

粒子群算法(Particle Swarm Optimization,PSO)优化BP神经网络的步骤如下:

1.读取数据,设置算法参数

2.初始化粒子群和速度:粒子代表一个BP神经网络模型,速度用于控制粒子在搜索空间中的移动。每个粒子的位置表示神经网络的权重和偏差,速度表示在某一方向上的搜索力度。

3.初始化全局最优解和个体最优解:全局最优解是整个粒子群中最优的解决方案,即最优的神经网络模型;个体最优解表示每个粒子找到的最优解。

4.计算适应度:针对每个粒子群中的粒子,根据染色体(权重和偏差)计算其适应度值。适应度函数为BP神经网络的误差。

5.更新速度和位置:根据粒子自身的最优解和群体中最优解,以及一些权重系数,更新粒子的速度和位置。具体来说,可以通过速度和位置更新公式来计算新的速度和位置。

粒子的速度更新公式如下:

粒子的位置更新公式如下:

6.更新全局最优解和个体最优解:在每次迭代后,根据适应度值更新全局最优解和个体最优解。如果某个粒子的适应度超过了全局最优解的适应度,则将其作为新的全局最优解;如果某个粒子的适应度超过了其个体最优解的适应度,则将其作为新的个体最优解。

7.重复迭代:重复执行步骤4和步骤5,直到达到停止迭代的条件。停止迭代的条件可以根据实际情况设定,例如达到最大迭代次数、适应度值达到预设的阈值或适应度值趋于稳定等。

​8.输出优化结果。

流程图如下:

数据见下表(只显示了少部分):

其中X1~X3为输入的自变量数据,y为因变量数据(需要被BP或PSOBP拟合的目标值)。

X1 X2 X3 y
0.908936 0.121612 0.564751 1.595299
0.483751 0.932318 0.774501 2.19057
0.395374 0.473973 0.044771 0.914118

MATLAB主程序如下: 

完整代码见: https://download.csdn.net/download/corn1949/88986570

%% 粒子群优化BP神经网络clc;close all;clear all;%清除变量rand('seed',1000);randn('seed',1000);format long g;addpath(genpath('psotoolbox'));global inputnumber hiddenumber outputnumber input_train output_train input_test P1 P2 T1 T2 inputps outputps indexM N;% % 随机产生数据% X=rand(200,3);% y=sum(X,2);% 读取Excel数据filename='数据.xls';[adata201,bdata201,cdata201]=xlsread(filename);X=adata201(:,1:end-1);y=adata201(:,end);Inputdata=X';Outputdata=y';snumber=size(Outputdata,2);% index200=1:snumber;%顺序样本index200=randperm(snumber);%随机样本numberTest=50;%用于测试的样本个数indextrain=index200(1:end-numberTest);indextest=index200(end-numberTest+1:end);% 定义训练集P1=Inputdata(:,indextrain);T1=Outputdata(:,indextrain);% 定义测试集P2=Inputdata(:,indextest);T2=Outputdata(:,indextest);%设置训练集和测试集%% (2)训练数据归一化[input_train,inputps]=mapminmax(P1);[output_train,outputps]=mapminmax(T1);%测试数据归一化input_test=mapminmax('apply',P2,inputps);output_test=mapminmax('apply',T2,outputps);[k11,k12]=size(input_train);%计算维数inputnumber=k11;%输入维数hiddenumber=8;%隐含神经元数outputnumber=size(output_train,1);%输出维数;%输出维数S=[hiddenumber*inputnumber,outputnumber*hiddenumber,hiddenumber*1,outputnumber*1];indexM=S2indexMfun(S);N=sum(S);% 编码长度tic;[x0,ybptest]=myfun2();bptime=toc;%% 参数初始化maxgen=200;%迭代次数popsize=50;%粒子群规模c1=1.8;%速度更新参数1c2=1.7;%速度更新参数2InertiaMax=0.93;%惯性因子最大值InertiaMin=0.5;%惯性因子最小值%% 设置变量区间lb=min(x0)*ones(1,N);ub=max(x0)*ones(1,N);%% 设置速度的区间vlb=(ub-lb)*-0.05;vub=(ub-lb)*0.05;%% 常规粒子群算法[popchrom,V]=genchrom(popsize,N,lb,ub,vlb,vub,x0);Value=decodepso(popchrom,popsize);%% 个体极值与群体极值的记录[bestfitness,bestindex]=min(Value);zbest=popchrom(bestindex,:);%全局最佳值gbest=popchrom;%个体最佳记录fitnessgbest=Value;%个体最佳适应度值fitnesszbest=bestfitness;%全局最佳适应度值%% 粒子群主算法程序:寻优主程序%进度条tracemat=zeros(maxgen,2);%初始化每代的群体目标函数跟踪矩阵tic;wait_hand = waitbar(0,'PSO runing……', 'tag', 'TMWWaitbar');for i=1:maxgen waitbar(i/maxgen,wait_hand);%每循环一次更新一次进步条 w=InertiaMax-i*(InertiaMax-InertiaMin)./maxgen;%采用线性递减的动态惯性权重,w为惯性权重 for j=1:popsize %% ------更新速度开始-------- V(j,:) = w*V(j,:) + c1*rand*(gbest(j,:) - popchrom(j,:)) + c2*rand*(zbest - popchrom(j,:));%更新速度 V(j,:)=limitspeed(V(j,:),vlb,vub,N);%限制速度 %% ------更新速度结束---------- %% ----种群更新开始------------ popchrom(j,:)=popchrom(j,:)+V(j,:);%更新种群 popchrom(j,:)=limitposition(popchrom(j,:),lb,ub,N); end Value=decodepso(popchrom,popsize); for j=1:popsize %个体最优更新 if Value(j) < fitnessgbest(j)%判断第j个粒子的当前适应度与该粒子的历史适应度谁大谁小 gbest(j,:) = popchrom(j,:);%如果小,记录当前的粒子为第j个粒子的个体最优粒子 fitnessgbest(j) = Value(j);%更新个体最优适应度 end %群体最优更新 if Value(j) < fitnesszbest%判断第j个粒子的当前适应度与群体的历史适应度谁大谁小 zbest = popchrom(j,:);%如果小,记录当前的粒子为群体最优粒子 fitnesszbest = Value(j);%更新群体最优适应度 end end tracemat(i,1)=fitnesszbest;%记录 tracemat(i,2)=mean(Value);enddelete(wait_hand);%执行完后删除该进度条psobptime=toc;% 运行时间% 显示结果disp('粒子群算法优化得到的最优目标函数');fitnesszbestdisp('粒子群算法优化得到的最优粒子');zbestfigure;plot(tracemat(:,1),'r-','linewidth',1);legend({'种群最优值'},'fontname','宋体');xlabel('迭代次数','fontname','宋体');ylabel('目标函数','fontname','宋体');title('PSO-BP神经网络收敛曲线','fontname','宋体');%% 以优化得到的权值阀值寻bp神经网络x=zbest;[y,ypsobptest,net]=myfun(x);ypsobptrain=sim(net,input_train);ypsobptrain=mapminmax('reverse',ypsobptrain,outputps);%预测数据反归一化[v1,ypsobptrain]=max(ypsobptrain);ypsobptest=sim(net,input_test);ypsobptest=mapminmax('reverse',ypsobptest,outputps);%预测数据反归一化% 输出测试结果的绘图figure;plot(T2,'b-');hold on;plot(ypsobptest,'r*-');legend({'实际值','PSO-BP预测值'},'fontname','宋体');xlabel('测试样本号','fontname','宋体');ylabel('目标值','fontname','宋体');title('PSO-BP神经网络测试集预测的结果','fontname','宋体');figure;plot(ypsobptest-T2,'r*-');legend({'绝对误差'},'fontname','宋体');xlabel('测试样本号','fontname','宋体');ylabel('绝对误差','fontname','宋体');title('PSO-BP神经网络测试集预测的绝对误差','fontname','宋体');figure;plot((ypsobptest-T2)./T2*100,'r*-');legend({'相对误差'},'fontname','宋体');xlabel('测试样本号','fontname','宋体');ylabel('相对误差(%)','fontname','宋体');title('PSO-BP神经网络测试集预测的相对误差','fontname','宋体');%% 普通BP% 输出测试结果的绘图figure;plot(T2,'bo-');hold on;plot(ybptest,'r*-');legend({'实际值','BP预测值'},'fontname','宋体');xlabel('测试样本号','fontname','宋体');ylabel('目标值','fontname','宋体');title('BP神经网络测试集预测的结果','fontname','宋体');figure;plot(ybptest-T2,'r*-');legend({'绝对误差'},'fontname','宋体');xlabel('测试样本号','fontname','宋体');ylabel('绝对误差','fontname','宋体');title('BP神经网络测试集预测的绝对误差','fontname','宋体');figure;plot((ybptest-T2)./T2*100,'r*-');legend({'相对误差'},'fontname','宋体');xlabel('测试样本号','fontname','宋体');ylabel('误差(%)','fontname','宋体');title('BP神经网络测试集预测的相对误差','fontname','宋体');figure;plot(T2,'bo-');hold on;plot(ybptest,'gs-');plot(ypsobptest,'r*-');legend({'实际值','BP预测值','PSO-BP预测值'},'fontname','宋体');xlabel('测试样本号','fontname','宋体');ylabel('','fontname','宋体');title('','fontname','宋体');figure;plot((ybptest-T2)./T2*100,'gs-');hold on;plot((ypsobptest-T2)./T2*100,'r*-');legend({'BP','PSO-BP'},'fontname','宋体');xlabel('测试样本号','fontname','宋体');ylabel('误差(%)','fontname','宋体');title('','fontname','宋体');% 时间disp('PSO-BP运行时间(s)');psobptimedisp('PSO-BP预测结果的各项指标');y=T2;y1=ypsobptest;[R2_PSOBP,MSE_PSOBP,RMSE_PSOBP,MAPE_PSOBP,MAD_PSOBP]=predictorsfun(y,y1);disp('bp运行时间(s)');bptimedisp('BP预测结果的各项指标');y=T2;y1=ybptest;[R2_BP,MSE_BP,RMSE_BP,MAPE_BP,MAD_BP]=predictorsfun(y,y1);outcell={'算法','R2','MSE','RMSE','MAPE','MAD'};outcell201={'PSO-BP';'BP'};outmat=[R2_PSOBP,MSE_PSOBP,RMSE_PSOBP,MAPE_PSOBP,MAD_PSOBP; R2_BP,MSE_BP,RMSE_BP,MAPE_BP,MAD_BP];outcell=[outcell; outcell201,num2cell(outmat)]rmpath(genpath('psotoolbox'));

程序结果如下:

粒子群算法优化得到的最优目标函数

fitnesszbest =

        0.0369346431877225

粒子群算法优化得到的最优粒子

zbest =

  1 至 6 列

          -1.8822583836864          1.93590619139128      -0.00660025411353624         -1.56631053293057          2.38629652024333          1.00149061140052

  7 至 12 列

        -0.842085071302779        -0.928150447416021          1.96023347351274          1.23849087829245          1.12688642373663          2.27169333454338

  13 至 18 列

         0.312866503182535          2.28300815779148         -1.54401944900391         -2.19687784241278        -0.348196354068112          1.09320255587459

  19 至 24 列

          -2.6325648761068          1.19038033815092         -1.13748162180164         0.433916080442113          2.36907189925301          1.00195285827249

  25 至 30 列

        0.0610201397551746         0.336735182827607        -0.130176051349205         0.180771464483866         0.232207420333308       -0.0333882579538714

  31 至 36 列

      -0.00391313555670224        -0.827288544752633          2.83382006014957          -2.0484411685392          1.14144886498958         0.301230053772504

  37 至 41 列

          1.24640540602824          1.35900337347637         -1.93586694722239         -3.05365723741299        -0.615452378736378

PSO-BP运行时间(s)

psobptime =

               129.7314617

PSO-BP预测结果的各项指标

bp运行时间(s)

bptime =

                 4.8595654

BP预测结果的各项指标

outcell =

    '算法'      'R2'                   'MSE'                    'RMSE'                  'MAPE'                'MAD'              

    'PSO-BP'    [0.970275232204773]    [0.00322857821203166]    [0.0568205791243952]    [2.11697106146321]    [0.0405419302583362]

    'BP'        [ 0.91336042298868]    [ 0.0274288132081395]    [ 0.165616464181975]    [6.95199901835048]    [ 0.125924433518992]

>>

完整代码见: https://download.csdn.net/download/corn1949/88986570



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。