MATLAB实现PSO 您所在的位置:网站首页 基于神经网络预测 MATLAB实现PSO

MATLAB实现PSO

2024-07-07 14:54| 来源: 网络整理| 查看: 265

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

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

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

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

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

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

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

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

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

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

​8.输出优化结果。

流程图如下:

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

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

X1X2X3y0.9089360.1216120.5647511.5952990.4837510.9323180.7745012.190570.3953740.4739730.0447710.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;%速度更新参数1 c2=1.7;%速度更新参数2 InertiaMax=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); end delete(wait_hand);%执行完后删除该进度条 psobptime=toc;% 运行时间 % 显示结果 disp('粒子群算法优化得到的最优目标函数'); fitnesszbest disp('粒子群算法优化得到的最优粒子'); zbest figure; 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)'); psobptime disp('PSO-BP预测结果的各项指标'); y=T2; y1=ypsobptest; [R2_PSOBP,MSE_PSOBP,RMSE_PSOBP,MAPE_PSOBP,MAD_PSOBP]=predictorsfun(y,y1); disp('bp运行时间(s)'); bptime disp('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



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有