改进粒子群算法优化BP神经网络---回归+分类两种案例

今天采用改进的粒子群算法(LPSO)优化算法优化BP神经网络。本文选用的LPSO算法是之前作者写过的一篇文章:基于改进莱维飞行和混沌映射(10种混沌映射随意切换)的粒子群优化算法,附matlab代码

文章一次性讲解两种案例,回归分类。回归案例中,作者选用了一个经典的股票数据。分类案例中,选用的是公用的UCI数据集。

BP神经网络初始的权值阈值都是随机生成的,因此不一定是最佳的。采用智能算法优化BP神经网络的权值阈值,使得输入与输出有更加完美的映射关系,以此来提升BP神经网络模型的精度。本文采用LPSO算法对BP神经网络的权值阈值进行优化,并应用于实际的回归和分类案例中。

01 股票预测案例

案例虽然介绍的是股票预测,但是LPSO-BP预测模型是通用的,大家根据自己的数据直接替换即可。数据替换十分简单,代码注释中都写的非常清楚了。

股票数据特征有:开盘价,盘中最高价,盘中最低价,收盘价等。预测值为股票价格。股票数据整理代码已写好,想换成自己数据的童鞋不需要理解此代码,替换数据即可。下面直接上标准BP的预测结果和LPSO-BP的预测结果。

标准BP模型预测结果

6fa1b3ebafadb7a170810c6e03c3d895.png

可以看到标准BP神经网络的预测效果不是很理想,无法跟踪真实值偏差较大

LPSO-BP预测结果

可以看到LPSO-BP神经网络的预测值可以紧密跟随真实值,效果很好。

e503e6e1248bea10c3cd534fb48745aa.png

将真实值,BP预测值和LPSO-BP预测值放在一起,效果更加明显。99ac421b072fe2ccf4e81d5e133f2e10.png

接下来是一个LPSO优化前后的BP神经网络误差对比图。

9a394682607be3c2c7e8388e3c43ead1.png

LPSO-BP的迭代曲线,以预测值和真实值的MSE为目标函数。

abc69dabc42ef04f3a7b641c1df133dd.png

LPSO-BP预测模型的评价:可以看到,LPSO-BP方法在股票预测案例中可以很好地进行股票价格预测。

02 分类案例

接下来是LPSO-BP的分类案例,采用的数据是UCI数据集中的Balancescale.mat数据,该数据一共分为三类。接下来看结果。

标准BP模型分类结果

混淆矩阵结果图:

简单说一下这个图该怎么理解。请大家横着看,每行的数据加起来是100%,每行的数据个数加起来就是测试集中第一类数据的真实个数。以第一行为例,测试集中一共有12个数据是属于第一类的,而12个数据中,有8个预测正确,有1个预测成了第2类,3个预测成了第三类。其他行均这样理解。

d2415a67adf17ab9082f2c41cf426f80.png

下面这个图是另一种结果展现方式,在一些论文中会用这种方式展示结果。

245bb09052c5d026ed7185f1e664db60.png

LPSO-BP分类结果:

44cf9f279aba97781481e7ba9bd33835.png

9718d0ae9c0e49f7340a21a99fcac9c1.png

242ad698e408893c39a6b19f0a2c34f7.png

03 代码展示

%% 初始化
clear
close all
clc
warning off
addpath(genpath(pwd));
% rng(0)
load Balancescale.mat 
data = Balancescale;
data=data(randperm(size(data,1)),:);    %此行代码用于打乱原始样本,使训练集测试集随机被抽取,有助于更新预测结果。
input=data(:,2:end);
output1 =data(:,1);
for i=1:size(data,1)
    switch output1(i)
        case 1
            output(i,1)=1;
        case 2
            output(i,2)=1;
        case 3
            output(i,3)=1;
        case 4
            output(i,4)=1;
        case 5
            output(i,5)=1;
        case 6
            output(i,6)=1;
        case 7
            output(i,7)=1;
    end
end
%% 划分训练集和测试集
m=fix(size(data,1)*0.7);    %训练的样本数目
%训练集
input_train=input(1:m,:)';
output_train=output(1:m,:)';
% 测试集
input_test=input(m+1:end,:)';
output_test=output(m+1:end,:)';


%% 数据归一化
[inputn,inputps]=mapminmax(input_train,0,1);
inputn_test=mapminmax('apply',input_test,inputps);
dam = fix(size(inputn,2)*0.3);%选30%的训练集作为验证集
idx = randperm(size(inputn,2),dam);
XValidation = inputn(:,idx);
inputn(:,idx) = [];
YValidation = output_train(:,idx);
output_train(:,idx) = [];


%% 获取输入层节点、输出层节点个数
inputnum=size(input_train,1);
outputnum=size(output_train,1);
disp('/')
disp('神经网络结构...')
disp(['输入层的节点数为:',num2str(inputnum)])
disp(['输出层的节点数为:',num2str(outputnum)])
disp(' ')
disp('隐含层节点的确定过程...')


%确定隐含层节点个数
%采用经验公式hiddennum=sqrt(m+n)+a,m为输入层节点个数,n为输出层节点个数,a一般取为1-10之间的整数
acc = 0;
for hiddennum=fix(sqrt(inputnum+outputnum))+1:fix(sqrt(inputnum+outputnum))+10
    net0=newff(inputn,output_train,hiddennum);
    % 网络参数
    net0.trainParam.epochs=1000;            % 训练次数,这里设置为1000次
    net0.trainParam.lr=0.01;                % 学习速率,这里设置为0.01
    net0.trainParam.goal=0.0001;           % 训练目标最小误差,这里设置为0.0001
    net0.trainParam.show=25;                % 显示频率,这里设置为每训练25次显示一次
    net0.trainParam.mc=0.001;                % 动量因子
    net0.trainParam.min_grad=1e-8;          % 最小性能梯度
    net0.trainParam.max_fail=6;             % 最高失败次数
    net0.trainParam.showWindow = false;
    net0.trainParam.showCommandLine = false; 
    % 网络训练
    [net0,tr]=train(net0,inputn,output_train);
    an0=sim(net0,XValidation);  %验证集的仿真结果
    predict_label=zeros(1,size(an0,2));
    for i=1:size(an0,2)
        predict_label(i)=find(an0(:,i)==max(an0(:,i)));
    end
    outputt=zeros(1,size(YValidation,2));
    for i=1:size(YValidation,2)
        outputt(i)=find(YValidation(:,i)==max(YValidation(:,i)));
    end
    accuracy=sum(outputt==predict_label)/length(outputt);   %计算预测的确率
    disp(['隐含层节点数为',num2str(hiddennum),'时,验证集的准确率为:',num2str(accuracy)])
    
    %更新最佳的隐含层节点
    if acc<accuracy
        acc=accuracy;
        hiddennum_best=hiddennum;
    end
end
disp(['最佳的隐含层节点数为:',num2str(hiddennum_best),',验证集相应的训练集的准确率为:',num2str(acc)])


%% 构建最佳隐含层节点的BP神经网络
disp(' ')
disp('标准的BP神经网络:')
net0=newff(inputn,output_train,hiddennum_best,{'tansig','purelin'},'trainlm');% 建立模型
%网络参数配置
net0.trainParam.epochs=1000;         % 训练次数,这里设置为1000次
net0.trainParam.lr=0.01;                   % 学习速率,这里设置为0.01
net0.trainParam.goal=0.00001;                    % 训练目标最小误差,这里设置为0.0001
net0.trainParam.show=25;                % 显示频率,这里设置为每训练25次显示一次
net0.trainParam.mc=0.01;                 % 动量因子
net0.trainParam.min_grad=1e-6;       % 最小性能梯度
net0.trainParam.max_fail=6;               % 最高失败次数
% net0.trainParam.showWindow = false;
% net0.trainParam.showCommandLine = false;            %隐藏仿真界面
%开始训练
net0=train(net0,inputn,output_train);


%预测
an0=sim(net0,inputn_test); %用训练好的模型进行仿真
predict_label=zeros(1,size(an0,2));
    for i=1:size(an0,2)
        predict_label(i)=find(an0(:,i)==max(an0(:,i)));
    end
    outputt=zeros(1,size(output_test,2));
    for i=1:size(output_test,2)
        outputt(i)=find(output_test(:,i)==max(output_test(:,i)));
    end
    accuracy=sum(outputt==predict_label)/length(outputt);   %计算预测的确率  
    disp(['准确率为:',num2str(accuracy)])
%% 标准BP神经网络作图
% 画方框图
figure
confMat = confusionmat(outputt,predict_label);  %output_test是真实值标签
zjyanseplotConfMat(confMat.');  
xlabel('Predicted label')
ylabel('Real label')
% 作图
figure
scatter(1:length(predict_label),predict_label,'r*')
hold on
scatter(1:length(predict_label),outputt,'g^')
legend('预测类别','真实类别','NorthWest')
title({'BP神经网络的预测效果',['测试集正确率 = ',num2str(accuracy*100),' %']})
xlabel('预测样本编号')
ylabel('分类结果')
box on
set(gca,'fontsize',12)
%% LPSO优化算法寻最优权值阈值
disp(' ')
disp('LPSO优化BP神经网络:')


net=newff(inputn,output_train,hiddennum_best,{'tansig','purelin'},'trainlm');% 建立模型


%网络参数配置
net.trainParam.epochs=1000;         % 训练次数,这里设置为1000次
net.trainParam.lr=0.0001;                   % 学习速率,这里设置为0.01
net.trainParam.goal=0.000001;                    % 训练目标最小误差,这里设置为0.0001
net.trainParam.show=25;                % 显示频率,这里设置为每训练25次显示一次
net.trainParam.mc=0.01;                 % 动量因子
net.trainParam.min_grad=1e-6;       % 最小性能梯度
net.trainParam.max_fail=6;               % 最高失败次数
%% 初始化LPSO参数
popsize=20;   %初始种群规模
maxgen=100;   %最大进化代数
lb = -1;  %神经网络权值阈值的上下限
ub = 1;
numm = 2; %混沌系数
dim=inputnum*hiddennum_best+hiddennum_best+hiddennum_best*outputnum+outputnum;    %自变量个数
[Best_score,Best_pos,LPSO_curve]=LPSOforBP(numm,popsize,maxgen,lb,ub,dim,inputnum,hiddennum_best,outputnum,net,inputn,output_train,inputn_test,output_test);

代码中注释非常详细,有对神经网络构建的注释,有对LPSO-BP代码的注释,简单易懂。

代码附带UCI常用的数据集及其解释。大家可以自行尝试别的数据进行分类。附带LPSO在CEC2005函数的测试代码。

一次性获取两种案例代码。完整代码获取方式,点击下方卡片回复关键词。

关键词 :

LPSOBP

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
粒子算法(PSO)是一种基于群体智能的优化算法,它模拟了鸟群或鱼群等生物群体的行为,通过粒子的迭代更新来寻找最优解。BP神经网络是一种常见的人工神经网络,用于解决回归分类等问题。将PSO算法BP神经网络相结合可以提高BP神经网络的训练速度和精度,这就是PSO-BP算法。 在MATLAB中实现PSO-BP算法回归预测案例,首先需要定义BP神经网络的结构,包括输入层、隐藏层和输出层的神经元数量。然后,利用PSO算法初始化一组粒子,并在每次迭代中根据粒子的位置和速度更新神经网络的权重和偏置。通过优化后的神经网络对训练数据进行训练,并对测试数据进行回归预测。 以下是一个简单的MATLAB代码实现案例: ```matlab % 定义BP神经网络结构 inputSize = 4; hiddenSize = 6; outputSize = 1; % 初始化PSO算法参数 options = optimoptions(@particleswarm, 'SwarmSize', 100, 'MaxIterations', 100); % 定义适应度函数 fitnessFunc = @(x) pso_bp_fitness(x, inputSize, hiddenSize, outputSize, trainData, trainLabel); % 使用PSO算法优化权重和偏置 [optimizedParams, ~] = particleswarm(fitnessFunc, inputSize * hiddenSize + hiddenSize + hiddenSize * outputSize + outputSize, [], [], options); % 训练BP神经网络 net = trainBP(inputSize, hiddenSize, outputSize, optimizedParams, trainData, trainLabel); % 测试数据回归预测 predictedLabels = net(testData); ``` 在上述代码中,pso_bp_fitness是适应度函数,用于计算每个粒子的适应度值;trainBP是训练BP神经网络的函数,接受优化后的参数和训练数据,并返回训练好的神经网络;predictedLabels是通过训练好的神经网络对测试数据进行回归预测得到的结果。通过这样的方式,可以利用PSO-BP算法进行回归预测任务的优化和实现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

今天吃饺子

不想刀我的可以选择爱我

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值