网站设计与开发专家,网页设计论文html,wordpress 文章分页代码,网站站内优化方法今天采用改进的粒子群算法(LPSO)优化算法优化BP神经网络。本文选用的LPSO算法是之前作者写过的一篇文章#xff1a;基于改进莱维飞行和混沌映射#xff08;10种混沌映射随意切换#xff09;的粒子群优化算法#xff0c;附matlab代码 文章一次性讲解两种案例#xff0c;回归… 今天采用改进的粒子群算法(LPSO)优化算法优化BP神经网络。本文选用的LPSO算法是之前作者写过的一篇文章基于改进莱维飞行和混沌映射10种混沌映射随意切换的粒子群优化算法附matlab代码 文章一次性讲解两种案例回归与分类。回归案例中作者选用了一个经典的股票数据。分类案例中选用的是公用的UCI数据集。 BP神经网络初始的权值阈值都是随机生成的因此不一定是最佳的。采用智能算法优化BP神经网络的权值阈值使得输入与输出有更加完美的映射关系以此来提升BP神经网络模型的精度。本文采用LPSO算法对BP神经网络的权值阈值进行优化并应用于实际的回归和分类案例中。 01 股票预测案例 案例虽然介绍的是股票预测但是LPSO-BP预测模型是通用的大家根据自己的数据直接替换即可。数据替换十分简单代码注释中都写的非常清楚了。 股票数据特征有开盘价盘中最高价盘中最低价收盘价等。预测值为股票价格。股票数据整理代码已写好想换成自己数据的童鞋不需要理解此代码替换数据即可。下面直接上标准BP的预测结果和LPSO-BP的预测结果。 标准BP模型预测结果 可以看到标准BP神经网络的预测效果不是很理想无法跟踪真实值偏差较大。 LPSO-BP预测结果 可以看到LPSO-BP神经网络的预测值可以紧密跟随真实值效果很好。 将真实值BP预测值和LPSO-BP预测值放在一起效果更加明显。 接下来是一个LPSO优化前后的BP神经网络误差对比图。 LPSO-BP的迭代曲线以预测值和真实值的MSE为目标函数。 LPSO-BP预测模型的评价可以看到LPSO-BP方法在股票预测案例中可以很好地进行股票价格预测。 02 分类案例 接下来是LPSO-BP的分类案例采用的数据是UCI数据集中的Balancescale.mat数据该数据一共分为三类。接下来看结果。 标准BP模型分类结果 混淆矩阵结果图 简单说一下这个图该怎么理解。请大家横着看每行的数据加起来是100%每行的数据个数加起来就是测试集中第一类数据的真实个数。以第一行为例测试集中一共有12个数据是属于第一类的而12个数据中有8个预测正确有1个预测成了第2类3个预测成了第三类。其他行均这样理解。 下面这个图是另一种结果展现方式在一些论文中会用这种方式展示结果。 LPSO-BP分类结果 03 代码展示 %% 初始化
clear
close all
clc
warning off
addpath(genpath(pwd));
% rng(0)
load Balancescale.mat
data Balancescale;
datadata(randperm(size(data,1)),:); %此行代码用于打乱原始样本使训练集测试集随机被抽取有助于更新预测结果。
inputdata(:,2:end);
output1 data(:,1);
for i1:size(data,1)switch output1(i)case 1output(i,1)1;case 2output(i,2)1;case 3output(i,3)1;case 4output(i,4)1;case 5output(i,5)1;case 6output(i,6)1;case 7output(i,7)1;end
end
%% 划分训练集和测试集
mfix(size(data,1)*0.7); %训练的样本数目
%训练集
input_traininput(1:m,:);
output_trainoutput(1:m,:);
% 测试集
input_testinput(m1:end,:);
output_testoutput(m1:end,:);%% 数据归一化
[inputn,inputps]mapminmax(input_train,0,1);
inputn_testmapminmax(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) [];%% 获取输入层节点、输出层节点个数
inputnumsize(input_train,1);
outputnumsize(output_train,1);
disp(/)
disp(神经网络结构...)
disp([输入层的节点数为,num2str(inputnum)])
disp([输出层的节点数为,num2str(outputnum)])
disp( )
disp(隐含层节点的确定过程...)%确定隐含层节点个数
%采用经验公式hiddennumsqrt(mn)am为输入层节点个数n为输出层节点个数a一般取为1-10之间的整数
acc 0;
for hiddennumfix(sqrt(inputnumoutputnum))1:fix(sqrt(inputnumoutputnum))10net0newff(inputn,output_train,hiddennum);% 网络参数net0.trainParam.epochs1000; % 训练次数这里设置为1000次net0.trainParam.lr0.01; % 学习速率这里设置为0.01net0.trainParam.goal0.0001; % 训练目标最小误差这里设置为0.0001net0.trainParam.show25; % 显示频率这里设置为每训练25次显示一次net0.trainParam.mc0.001; % 动量因子net0.trainParam.min_grad1e-8; % 最小性能梯度net0.trainParam.max_fail6; % 最高失败次数net0.trainParam.showWindow false;net0.trainParam.showCommandLine false; % 网络训练[net0,tr]train(net0,inputn,output_train);an0sim(net0,XValidation); %验证集的仿真结果predict_labelzeros(1,size(an0,2));for i1:size(an0,2)predict_label(i)find(an0(:,i)max(an0(:,i)));endoutputtzeros(1,size(YValidation,2));for i1:size(YValidation,2)outputt(i)find(YValidation(:,i)max(YValidation(:,i)));endaccuracysum(outputtpredict_label)/length(outputt); %计算预测的确率disp([隐含层节点数为,num2str(hiddennum),时验证集的准确率为,num2str(accuracy)])%更新最佳的隐含层节点if accaccuracyaccaccuracy;hiddennum_besthiddennum;end
end
disp([最佳的隐含层节点数为,num2str(hiddennum_best),验证集相应的训练集的准确率为,num2str(acc)])%% 构建最佳隐含层节点的BP神经网络
disp( )
disp(标准的BP神经网络)
net0newff(inputn,output_train,hiddennum_best,{tansig,purelin},trainlm);% 建立模型
%网络参数配置
net0.trainParam.epochs1000; % 训练次数这里设置为1000次
net0.trainParam.lr0.01; % 学习速率这里设置为0.01
net0.trainParam.goal0.00001; % 训练目标最小误差这里设置为0.0001
net0.trainParam.show25; % 显示频率这里设置为每训练25次显示一次
net0.trainParam.mc0.01; % 动量因子
net0.trainParam.min_grad1e-6; % 最小性能梯度
net0.trainParam.max_fail6; % 最高失败次数
% net0.trainParam.showWindow false;
% net0.trainParam.showCommandLine false; %隐藏仿真界面
%开始训练
net0train(net0,inputn,output_train);%预测
an0sim(net0,inputn_test); %用训练好的模型进行仿真
predict_labelzeros(1,size(an0,2));for i1:size(an0,2)predict_label(i)find(an0(:,i)max(an0(:,i)));endoutputtzeros(1,size(output_test,2));for i1:size(output_test,2)outputt(i)find(output_test(:,i)max(output_test(:,i)));endaccuracysum(outputtpredict_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神经网络)netnewff(inputn,output_train,hiddennum_best,{tansig,purelin},trainlm);% 建立模型%网络参数配置
net.trainParam.epochs1000; % 训练次数这里设置为1000次
net.trainParam.lr0.0001; % 学习速率这里设置为0.01
net.trainParam.goal0.000001; % 训练目标最小误差这里设置为0.0001
net.trainParam.show25; % 显示频率这里设置为每训练25次显示一次
net.trainParam.mc0.01; % 动量因子
net.trainParam.min_grad1e-6; % 最小性能梯度
net.trainParam.max_fail6; % 最高失败次数
%% 初始化LPSO参数
popsize20; %初始种群规模
maxgen100; %最大进化代数
lb -1; %神经网络权值阈值的上下限
ub 1;
numm 2; %混沌系数
diminputnum*hiddennum_besthiddennum_besthiddennum_best*outputnumoutputnum; %自变量个数
[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