pso神经网络用python_【求】改进一个BP神经网络,用PSO算法
需要高手帮我将程序改进,将BP中的梯度下降法用PSO(粒子群算法)改进!万分感谢。可加我QQ675424730目前的程序(包括数据)clcclearp=[8 110 20 1.0 2.0;9 150 30 5.0 0.09 150 30 5.0 3.0;9 50 3 1.0 2.09 50 3 1.0 0.0;6 50 3 1.0 0.07 70 10 2.0 1.0;8 90 20 3.0 1.
需要高手帮我将程序改进,将BP中的梯度下降法用PSO(粒子群算法)改进!
万分感谢。可加我QQ675424730
目前的程序(包括数据)
clc
clear
p=[
8 110 20 1.0 2.0;9 150 30 5.0 0.0
9 150 30 5.0 3.0;9 50 3 1.0 2.0
9 50 3 1.0 0.0;6 50 3 1.0 0.0
7 70 10 2.0 1.0;8 90 20 3.0 1.5
6 50 3 5.0 0.0;7 70 10 3.0 1.0
9 150 30 1.0 3.0;6 50 3 1.0 3.0
7 70 10 2.0 1.5;8 90 20 3.0 1.0
8 70 10 2.0 1.0;7 90 20 3.0 1.5
6 150 30 5.0 3.0;6 150 3 1.0 3.0
7 90 10 2.0 1.5;8 70 20 3.0 1.0
6 50 30 1.0 0.0;7 70 20 2.0 1.0
8 90 10 3.0 1.5;9 150 5 5.0 3.0
6 70 5 5.0 3.0;8 70 1 1.0 0.0
6 50 3 3.0 3.0;9 150 2 2.0 0.0
7 90 3 3.0 1.0;9 90 10 1.0 0.0
5 90 20 2.0 2.0;5 50 30 3.0 0.0
5 70 3 1.0 0.0;5 150 10 2.0 1.0
5 50 20 3.0 3.0;9 150 2 2.0 2.0
6 50 2 3.0 0.0;7 50 2 2.0 0.0
8 50 2 3.0 1.0;6 70 2 5.0 1.0
7 90 2 1.0 0.0;9 50 2 2.0 1.0
9 150 3 0.5 1.5;9 150 3 0.5 1.0
6 50 3 0.5 1.0;7 50 10 0.5 1.5;
8 50 20 0.5 3.0;6 70 3 0.5 3.0
7 90 10 0.5 1.5;9 50 30 0.5 1.0
];
%训练目标向量t
p=p';
t=[
74;95;110;91;77;107;90;68;112;108
75;115;83;66;80;100;137;100;83;74
71;77;92;105;114;91;117;92;114;86
100;73;114;145;86;95;105;76;88;125
90;83;86;98;107;76;67;83;86;68
];
t=t';
%测试样本P_testp
p_test=[
6 70 3 0.5 0.0;7 150 10 0.5 1.0
8 90 20 0.5 1.5;8 70 10 0.5 3.0
5 150 3 5.0 0.0;5 150 2 0.5 0.0
5 50 20 1.0 0.0;5 50 2 0.5 0.0
7 50 20 2.0 0.0;9 150 30 3.0 0.0];
p_test=p_test';
%测试目标t1
t1=[117;93;67;81;135;126;75;98;84;91];
%训练样本归一化
t1=t1';
[pn,ps]=mapminmax(p);
[tn,ts]=mapminmax(t);
%创建网络参数,可以根据自己要求修改
%net=newff(pn,tn,6);
%net=newff(pn,tn,[1,1],{'tansig','logsig'});
%net=newff(minmax(p),[5,1],{'tansig','logsig'},'trainlm');
net=newff(minmax(p),[6,1],{'tansig','purelin'});
net.trainparam.show=20;
net.trainparam.mc=0.01;
net.trainparam.lr=0.05;
net.trainparam.epochs=5000;
net.trainparam.goal=0.001;
%网络初始化
net=init(net);
%训练网络
net=train(net,pn,tn);
%测试样本归一化
pn_test=mapminmax('apply',p_test,ps);
%网络仿真
an=sim(net,pn_test);
%反归一化
[t2]= mapminmax('reverse',an,ts);
%mse指标
E = abs(t1 - t2);
MSE=mse(E);
%作图表示实测值和仿真值
figure(1);
X=1:10;
plot(X,t2,'r*',X,t1,'bo',X,E,'y-');
legend('预测输出','期望输出','误差曲线');
title('SMT焊膏厚度输出');
ylabel('厚度');
xlabel('样本');
算法设计和实现:
(1)先初始化BP网络结构,设定网络的输入层、隐含层、输出层的神经元个数。
(2)初始化粒子群及每个粒子的速度:
①粒子位置、速度向量的维数(dimSize为粒子种群规模,即粒子个数)
dimSize=输入层至隐含层的连接权值个数+隐含层至输出层的连接权值个数+隐含层的阈值个数+输出层的阈值个数
②在初始化粒子群及每个粒子速度时,先初始化一二维矩阵x,前面dimSize列表示粒子位置的各维,后面dimSize列表示粒子速度的各维,最后一列表示粒子的适应度。
③初始化每一个粒子的个体极值和全局最优值。
(3)计算每个粒子的适应度:
①先输入一个粒子,对每一个样本而言,都可以按BP网络的前向计算方法计算出一个网络的输出值,再按(式3-23)计算出其误差;同样的方法,计算出所有样本的误差;再按(式3-24)计算出所有样本的均方差,即该粒子的适应度。
②返回到①步骤,继续输入其它粒子,直至计算出所有粒子的适应度:
(a)为了计算方便,把初始化粒子矩阵中从1到IN*HN列的各元素赋给输入层到隐含层的权值矩阵IN*HN+1到IN*HN+HN*ON列各元素分别赋给隐含层到输出层的权值矩阵,IN*HN+HN*ON+1到IN*HN+HN*ON+HN列各元素分别赋给隐含层的阈值,IN*HN+HN*ON+HN+1到IN*HN+HN*ON+HN+ON的各元素分别赋给输出层的阈值。其中,IN为输入层神经元个数,HN为隐含层神经元个数,ON为输出层神经元个数。
(b)在使用BP算法的前向传播计算时,隐含层使用Sig-moid函数,输出层的计算使用线性Pureline函数。因为在BP网络模型中,当网络的最后一层采用曲线函数时,输出被限制在一个很小的范围内,如果采用线性函数,则输出可为任意值。因此,在MATLAB中设计BP网络,最后一层采用线性函数。即:f(x)=x。
(4)比较适应度,确定每个粒子的个体极值点和全局最优极值点:
若Present
若Present
其中,Present为当前粒子的适应度,Pbest为粒子的个体极值,gbest为全局最优值。
(5)更新每个粒子的位置和速度:
根据(式3-21)、(式3-22)更新粒子的速度和位置,并且考虑更新后的速度和位置是否在限定的范围内。
考虑速度:
若vij(t+1)>vmax,则vij(t+1)=vmax;
若vij(t+1)
否则vij(t+1)不变。
考虑位置:
若xij(t+1)>xmax,则xij(t+1)=xmax;
若xij(t+1)
否则xij(t+1)不变。
其中,vmax、xmax、xmin都是常数,由用户设定。
(6)采用在线性能准则或离线性能准则计算出算法的误差。
本论文采用离线性能准则来评价网络的性能,公式如下:
其中,iter为算法当前迭代次数,fun(gbesti)为第i次迭代的全局最优值的适应度。
(7)比较次数是否达到最大迭代次数或式(5)的值满足精度。若满足预设精度,算法收敛,最后一次迭代的全局最优值gbest中每一维的权值和阈值就是我们所求的;否则返回(2),算法继续迭代。
[本帖最后由 Carey_sjtu 于 2010-6-15 20:15 编辑]
更多推荐
所有评论(0)