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

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

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

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

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

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

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

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

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

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

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

​8.输出优化结果。

流程图如下:

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

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

X1X2X3y
0.9089360.1216120.5647511.595299
0.4837510.9323180.7745012.19057
0.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