GABP程序.docx
《GABP程序.docx》由会员分享,可在线阅读,更多相关《GABP程序.docx(16页珍藏版)》请在冰豆网上搜索。
GABP程序
GA-BP程序(总19页)
例1【原创】用遗传算法优化BP神经网络的Matlab编程实例
[font=楷体][size=4][color=blue]此文章首次在simwe公开发表属于GreenSim团队原创作品,转载请注明!
[/color][/size][/font]
[font=楷体][size=4][color=#0000ff]更多原创程序,请访问GreenSim团队主页[url=
[font=楷体][size=4][color=blue][/color][/size][/font]
[font=楷体][size=4][color=blue]由于BP网络的权值优化是一个无约束优化问题,而且权值要采用实数编码,所以直接利用Matlab遗传算法工具箱。
以下贴出的代码是为一个19输入变量,1个输出变量情况下的非线性回归而设计的,如果要应用于其它情况,只需改动编解码函数即可。
[/color][/size][/font]
程序一:
GA训练BP权值的主函数
functionnet=GABPNET(XX,YY)
%--------------------------------------------------------------------------
%
% 使用遗传算法对BP网络权值阈值进行优化,再用BP算法训练网络
%--------------------------------------------------------------------------
%数据归一化预处理
nntwarn
off
XX=premnmx(XX);
YY=premnmx(YY);
%创建网络
net=newff(minmax(XX),[19,25,1],{'tansig','tansig','purelin'},'trainlm');
%下面使用遗传算法对网络进行优化
P=XX;
T=YY;
R=size(P,1);
S2=size(T,1);
S1=25;%隐含层节点数
S=R*S1+S1*S2+S1+S2;%遗传算法编码长度
aa=ones(S,1)*[-1,1];
popu=50;%种群规模
initPpp=initializega(popu,aa,'gabpEval');%初始化种群
gen=100;%遗传代数
%下面调用gaot工具箱,其中目标函数定义为gabpEval
[x,endPop,bPop,trace]=ga(aa,'gabpEval',[],initPpp,[1e-611],'maxGenTerm',gen,...
'normGeomSelect',[],['arithXover'],[2],'nonUnifMutation',[2gen3]);
%绘收敛曲线图
figure
(1)
plot(trace(:
1),1./trace(:
3),'r-');
holdon
plot(trace(:
1),1./trace(:
2),'b-');
xlabel('Generation');
ylabel('Sum-SquaredError');
figure
(2)
plot(trace(:
1),trace(:
3),'r-');
holdon
plot(trace(:
1),trace(:
2),'b-');
xlabel('Generation');
ylabel('Fittness');
%下面将初步得到的权值矩阵赋给尚未开始训练的BP网络
[W1,B1,W2,B2,P,T,A1,A2,SE,val]=gadecod(x);
{2,1}=W1;
{3,2}=W2;
{2,1}=B1;
{3,1}=B2;
XX=P;
YY=T;
%设置训练参数
%训练网络
net=train(net,XX,YY);
程序二:
适应值函数
function[sol,val]=gabpEval(sol,options)
%val-thefittnessofthisindividual
%sol-theindividual,returnedtoallowforLamarckian
evolution
%options-[current_generation]
loaddata2
nntwarnoff
XX=premnmx(XX);
YY=premnmx(YY);
P=XX;
T=YY;
R=size(P,1);
S2=size(T,1);
S1=25;%隐含层节点数
S=R*S1+S1*S2+S1+S2;%遗传算法编码长度
fori=1:
S,
x(i)=sol(i);
end;
[W1,B1,W2,B2,P,T,A1,A2,SE,val]=gadecod(x);
程序三:
编解码函数
function[W1,B1,W2,B2,P,T,A1,A2,SE,val]=gadecod(x)
loaddata2
nntwarnoff
XX=premnmx(XX);
YY=premnmx(YY);
P=XX;
T=YY;
R=size(P,1);
S2=size(T,1);
S1=25;%隐含层节点数
S=R*S1+S1*S2+S1+S2;%遗传算法编码长度
%前R*S1个编码为W1
fori=1:
S1,
fork=1:
R,
W1(i,k)=x(R*(i-1)+k);
end
end
%接着的S1*S2个编码(即第R*S1个后的编码)为W2
fori=1:
S2,
fork=1:
S1,
W2(i,k)=x(S1*(i-1)+k+R*S1);
end
end
%
接着的S1个编码(即第R*S1+S1*S2个后的编码)为B1
fori=1:
S1,
B1(i,1)=x((R*S1+S1*S2)+i);
end
%接着的S2个编码(即第R*S1+S1*S2+S1个后的编码)为B2
fori=1:
S2,
B2(i,1)=x((R*S1+S1*S2+S1)+i);
end
%计算S1与S2层的输出
A1=tansig(W1*P,B1);
A2=purelin(W2*A1,B2);
%计算误差平方和
SE=sumsqr(T-A2);
val=1/SE;%遗传算法的适应值
注意:
上面的函数需要调用gaot工具箱,请从附件里下载!
例2遗传优化BP改动的地方
看书童上传的m文件,如下
%%程序说明
%主程序:
%适应度函数:
%编解码子函数:
%使用前需安装gaot工具箱,上述三个文件需放在同一文件夹中且将该文件夹
%设置为当前工作路径
%运行程序时只需运行主程序即可
%此程序仅为示例,针对其他的问题,只需将数据修改即可,但需注意变量名
%
保持一致,尤其是全局变量修改时(在和中也要修改)
%版权归MATLAB中文论坛所有,转载请注明
%%清除环境变量
clearall
clc
warningoff
nntwarnoff
%%声明全局变量
globalp %训练集输入数据
globalt %训练集输出数据
globalR %输入神经元个数
globalS2 %输出神经元个数
globalS1 %隐层神经元个数
globalS %编码长度
S1=25;
%%导入数据
%训练数据
day=[;
;
;
;
;
;
];
%数据归一化
[dayn,minday,maxday]=premnmx(day);
%输入和输出样本
p=dayn(:
1:
8);
t=dayn(:
2:
9);
%测试数据
k=[;
;
;
;
;
;
];
%数据归一化
kn=tramnmx(k,minday,maxday);
%%BP神经网络
%网络创建
net=newff(minmax(p),[S1,7],{'tansig','purelin'},'trainlm');
%设置训练参数
%网络训练
[net,tr]=train(net,p,t);
%仿真测试
s_bp=sim(net,kn); %BP神经网络的仿真结果
%%GA-BP神经网络
R=size(p,1);
S2=size(t,1);
S=R*S1+S1*S2+S1+S2;
aa=ones(S,1)*[-1,1];
popu=50; %种群规模
initPpp=initializega(popu,aa,'gabpEval'); %初始化种群
gen=100; %遗传代数
%调用GAOT工具箱,其中目标函数定义为gabpEval
[x,endPop,bPop,trace]=ga(aa,'gabpEval',[],initPpp,[1e-611],'maxGenTerm',gen,...
'normGeomSelect',[],['arithXover'],[2],'nonUnifMutation',[2gen3]);
%绘均方误差变化曲线
figure
(1)
plot(trace(:
1),1./trace(:
3),'r-');
holdon
plot(trace(:
1),1./trace(:
2),'b-');
xlabel('Generation');
ylabel('Sum-SquaredError');
%绘制
适应度函数变化
figure
(2)
plot(trace(:
1),trace(:
3),'r-');
holdon
plot(trace(:
1),trace(:
2),'b-');
xlabel('Generation');
ylabel('Fittness');
%计算最优的权值和阈值
[W1,B1,W2,B2,val]=gadecod(x);
{1,1}=W1;
{2,1}=W2;
{1}=B1;
{2}=B2;
%利用新的权值和阈值进行训练
net=train(net,p,t);
%仿真测试
s_ga=sim(net,kn); %遗传优化后的仿真结果
另外说明下,假如我要做识别类的优化,比如用遗传神经网络识别手写体字母,那
p:
训练集输入数据
t:
训练集输出数据
R:
输入神经元个数
S2:
输出神经元个数
S1 :
隐层神经元个数
S:
编码长度
这些数据都应该是多少,我识别的是图片,训练数据和测试数据都应该是什么
附件
c:
\iknow\docshare\data\cur_work\&k=1a9440b882d673bc8fffd8438209a721&t=10(4KB)
2010-5-2218:
08,下载次数:
0
书童给的ga_bp哦
基于Matlab神经网络工具的BP网络实例(注释很详细)
神经网络,Matlab,实例,注释,工具
1.clear
2.clc
3.closeall
4.warningoff
5.%数据输入
6.huanghe_p=[370503434575490420560640558343326405446423422697598377435472451667601689541485425389382707422];
7.huanghe_t=[5157135867537205677179878104894535896395685959828495196156525999418939997587016305615201040535];
8.
9.%归一化处理
10.p=(huanghe_p-min(huanghe_p))/(max(huanghe_p)-min(huanghe_p));
11.t=(huanghe_t-min(huanghe_t))/(max(huanghe_t)-min(huanghe_t));
12.
13.%网络有关参数
14.EPOCHS=10000;
15.GOAL=;
16.LR=;
17.MAX_FAIL=100;
18.
19.%建立bp神经网络,并训练,仿真。
其中输入为p,输出为t
20.
21.%-------------------------隐层神经元确定-----------------------------
22.
23.s=3:
15;%s为常向量,表示神经元的个数
24.res=zeros(size(s));%res将要存储误差向量,这里先置零
25.
26.pn=[p(1:
5);p(6:
10);p(11:
15);p(16:
20)];
27.tn=[t(1:
5);t(6:
10);t(11:
15);t(16:
20)];
28.fori=1:
length(s)
29.%版本使用下面代码
30.%输出层的神经元个数必须等于tn的行数
31.%每层的传递函数可以自己指定
32.%创建了2层网路,隐层s(i)(任意);输出层4(由tn决定不可改,但需输入)
33.%net=newff(minmax(pn),[s(i),4],{'tansig','purelin'},'trainlm');
34.%
35.%版本使用下面的代码
36.%输出层神经元由tn决定,不需要输入,我们只需要确定输入层和隐层的神经元个数
37.%所有层的传递函数都可以自己定义
38.%创建3层网络,输入层8(任意);隐层s(i)(任意);输出层4(由tn决定,不可改,不需要输入)
39.%
40.%其实两个版本的区别在于的bp网络创建函数直接给出了t,故最后一层不需要指定了,故相同的参数时,的会多一层
41.%
=newff(pn,tn,[4,s(i)],{'tansig','tansig','purelin'},'trainlm');
43.{1,1}=zeros(size{1,1}))+;
44.{2,1}=zeros(size{2,1}))+;
45.{1,1}=zeros(size{1,1}))+;
46.{2,1}=zeros(size{2,1}));
47.=GOAL;
48.选取最优神经元数,number为使得误差最小的隐层神经元个数
49.[ttmp2,ind]=min(res);
50.no=s(ind);
51.
52.%选定隐层神经元数目后,建立网络,训练仿真。
53.%版本
54.%net=newff(minmax(pn),[no,4],{'tansig','purelin'},'trainlm');
55.%版本
=newff(pn,tn,[4,no],{'tansig','tansig','purelin'},'trainlm');
57.{1,1}=zeros(size{1,1}))+;
58.{2,1}=zeros(size{2,1}))+;
59.{1,1}=zeros(size{1,1}))+;
60.{2,1}=zeros(size{2,1}));
61.=GOAL;
62.为网络的误差向量
63.r=norm(error);%r为网络的整体误差
64.savenet%保存最好的网络
65.%预测
66.input=[p(11:
15);p(16:
20);p(21:
25);p(26:
30)];
67.yuce=sim(net,input);
68.
69.%结果反归一化
70.y_norm=[y(1,y(2,y(3,y(4,];
71.yuce_norm=[yuce(1,yuce(2,yuce(3,yuce(4,];
72.%训练数据的仿真结果
73.t_val=y_norm*(max(huanghe_t(1:
20))-min(huanghe_t(1:
20)))+min(huanghe_t(1:
20));
74.%预测数据的仿真结果
75.yuce=yuce_norm*(max(huanghe_t(1:
20))-min(huanghe_t(1:
20)))+min(huanghe_t(1:
20));
76.
77.%计算误差
78.%训练数据仿真的相对误差
79.wucha=abs(t_val-huanghe_t(1:
20))./huanghe_t(1:
20);
80.b=minmax(wucha);
81.average_wucha=mean(wucha);
82.%作图
83.figure
(1)
84.plot(1:
20,huanghe_t(1:
20),'*-',1:
20,t_val,'o:
')
85.title('训练数据仿真结果')
86.legend('原始数据','仿真结果')
87.
88.figure
(2)
89.plot(1:
20,huanghe_t(11:
30),'*-',1:
20,yuce,'o:
')
90.title('预测数据仿真结果')
91.legend('原始数据','仿真结果')
复制代码
下载KB)
2009-5-3021:
02
下载KB)