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