欢迎来到智能优化算法的世界
博客主页:卿云阁欢迎关注点赞收藏⭐️留言
本文由卿云阁原创!
本阶段属于筑基阶段之一,希望各位仙友顺利完成突破
首发时间:2021年1月7日
✉️希望可以和大家一起完成进阶之路!
作者水平很有限,如果发现错误,请留言轰炸哦!万分感谢!
目录
0️⃣基本介绍
1️⃣代码部分
2️⃣结果
0️⃣✨✨✨基本介绍✨✨✨
BP神经网络作为目前运用最广泛的神经网络模型之一,具有结构简单、较强的非线性映射能力、良好的自学习能力、可高精度逼近任意函数等优点。BP神经网络算法采用梯度下降算法,从训练数据中开展学习,以输出误差平方最小为目标,采用误差反向传播,以训练网络节点权值和偏置值。当BP神经网络的结构(层数、每层节点个数)较复杂时,这一算法会表现出学习速度慢、易陷入局部极小值、稳定性差等不足。另一个广泛使用的机器学习算法为粒子群优化算法,这类算法通过群体智能开展学习,具有较好的全局寻优能力。提出基于粒子群优化的BP神经网络算法,将粒子群优化算法引入BP神经网络模型中,以加快传统BP神经网络算法的收敛速度。
1️⃣✨✨✨代码部分✨✨✨
data.m:
for i=1:2000 input(i,:)=10*rand(1,2)-5; output(i)=input(i,1)^2+input(i,2)^2; end output=output'; save data input output
PSO.m:
%% 该代码为基于PSO和BP网络的预测 %% 清空环境 clc clear %读取数据 load data input output %节点个数 inputnum=2; hiddennum=5; outputnum=1; %训练数据和预测数据 input_train=input(1:1900,:)'; input_test=input(1901:2000,:)'; output_train=output(1:1900)'; output_test=output(1901:2000)'; %选连样本输入输出数据归一化 [inputn,inputps]=mapminmax(input_train); [outputn,outputps]=mapminmax(output_train); %构建网络 net=newff(inputn,outputn,hiddennum); % 参数初始化 %粒子群算法中的两个参数 c1 = 1.49445; c2 = 1.49445; maxgen=2; % 进化次数 sizepop=20; %种群规模 Vmax=1; Vmin=-1; popmax=5; popmin=-5; for i=1:sizepop pop(i,:)=5*rands(1,21); V(i,:)=rands(1,21); fitness(i)=fun(pop(i,:),inputnum,hiddennum,outputnum,net,inputn,outputn); end % 个体极值和群体极值 [bestfitness bestindex]=min(fitness); zbest=pop(bestindex,:); %全局最佳 gbest=pop; %个体最佳 fitnessgbest=fitness; %个体最佳适应度值 fitnesszbest=bestfitness; %全局最佳适应度值 %% 迭代寻优 for i=1:maxgen i for j=1:sizepop %速度更新 V(j,:) = V(j,:) + c1*rand*(gbest(j,:) - pop(j,:)) + c2*rand*(zbest - pop(j,:)); V(j,find(V(j,:)>Vmax))=Vmax; V(j,find(V(j,:)
popmax))=popmax; pop(j,find(pop(j,:) 0.95 pop(j,pos)=5*rands(1,1); end %适应度值 fitness(j)=fun(pop(j,:),inputnum,hiddennum,outputnum,net,inputn,outputn); end for j=1:sizepop %个体最优更新 if fitness(j) < fitnessgbest(j) gbest(j,:) = pop(j,:); fitnessgbest(j) = fitness(j); end %群体最优更新 if fitness(j) < fitnesszbest zbest = pop(j,:); fitnesszbest = fitness(j); end end yy(i)=fitnesszbest; end %% 结果分析 plot(yy) title(['适应度曲线 ' '终止代数=' num2str(maxgen)]); xlabel('进化代数');ylabel('适应度'); x=zbest; %% 把最优初始阀值权值赋予网络预测 % %用遗传算法优化的BP网络进行值预测 w1=x(1:inputnum*hiddennum); B1=x(inputnum*hiddennum+1:inputnum*hiddennum+hiddennum); w2=x(inputnum*hiddennum+hiddennum+1:inputnum*hiddennum+hiddennum+hiddennum*outputnum); B2=x(inputnum*hiddennum+hiddennum+hiddennum*outputnum+1:inputnum*hiddennum+hiddennum+hiddennum*outputnum+outputnum); net.iw{1,1}=reshape(w1,hiddennum,inputnum); net.lw{2,1}=reshape(w2,outputnum,hiddennum); net.b{1}=reshape(B1,hiddennum,1); net.b{2}=B2; %% BP网络训练 %网络进化参数 net.trainParam.epochs=100; net.trainParam.lr=0.1; %net.trainParam.goal=0.00001; %网络训练 [net,per2]=train(net,inputn,outputn); %% BP网络预测 %数据归一化 inputn_test=mapminmax('apply',input_test,inputps); an=sim(net,inputn_test); test_simu=mapminmax('reverse',an,outputps); error=test_simu-output_test; figure(2) plot(error) fum.m
function error = fun(x,inputnum,hiddennum,outputnum,net,inputn,outputn) %该函数用来计算适应度值 %x input 个体 %inputnum input 输入层节点数 %outputnum input 隐含层节点数 %net input 网络 %inputn input 训练输入数据 %outputn input 训练输出数据 %error output 个体适应度值 %提取 w1=x(1:inputnum*hiddennum); B1=x(inputnum*hiddennum+1:inputnum*hiddennum+hiddennum); w2=x(inputnum*hiddennum+hiddennum+1:inputnum*hiddennum+hiddennum+hiddennum*outputnum); B2=x(inputnum*hiddennum+hiddennum+hiddennum*outputnum+1:inputnum*hiddennum+hiddennum+hiddennum*outputnum+outputnum); %网络权值赋值 net.iw{1,1}=reshape(w1,hiddennum,inputnum); net.lw{2,1}=reshape(w2,outputnum,hiddennum); net.b{1}=reshape(B1,hiddennum,1); net.b{2}=B2; %网络训练 an=sim(net,inputn); error=sum(abs(an-outputn));
2️⃣✨✨✨结果✨✨✨