需要高手帮我将程序改进,将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 编辑]

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐