Matlab神经网络工具箱
2010-7-21
今天学的是BP神经网络,首先看的是一个关于非线性函数逼近的例子,最后得出一个心得:在使用newff函数生成一个新的网络时,神经元的层数和每一层的神经元数会对结果造成不小的影响,一般都采用[n,1]的建立方法,其中n为隐层的神经元数,1为输出层的神经元数。
然后是做了一个识别系统,算是一个较大的神经网络,具体的代码解释和分析如下:
[alphabet,targets]=prprob;
[R,Q]=size(alphabet);
[S2,Q]=size(targets);
S1=10;
[R,Q]=size(alphabet);
[S2,Q]=size(targets);
P=alphabet;
net=newff(minmax(P),[S1,S2],{'logsig','logsig'},'traingdx');
net.LW{2,1}=net.LW{2,1}*0.01;
net.b{2}=net.b{2}+0.01;
其中的proprob是matlab自带的一个生成字母表布尔值的函数。可以具体查看。
T=targets;
net.performFcn='sse';
net.trainParam.goal=0.1;
net.trainParam.show=20;
net.trainParam.epochs=5000;
net.trainParam.mc=0.95;
[net,tr]=train(net,P,T)
接下来首先进行无噪声训练。
netn.trainParam.goal=0.6;
netn.trainParam.epochs=300;
T=[targets targets targets targets];
for pass=1:10
P=[alphabet,alphabet,(alphabet+randn(R,Q)*0.1),(alphabet+randn(R,Q)*0.2) ];
[netn,tr]=train(net,P,T);
end
接下来是有噪声训练,采用随机数生成影响输入矩阵的方式。这里收敛的有点慢,在
应用于其他系统的时候值得注意。
netn.trainParam.goal=0.1;
netn.trainParam.epochs=500;
netn.trainParam.show=5;
P=alphabet;
T=targets;
[net,tr]=train(netn,P,T)
接下来还进行无噪声训练,可能是前面的逼近情况已经很了理想了,这里只用了0次循环。。。。。。
noise_range=0:.05:.5; %标准差范围
max_test=100; %噪声信号总数
network1=[];
network2=[];
T=targets;
for noiselevel=noise_range
errors1=0;
errors2=0;
for i=1:max_test
P=alphabet+randn(35,26)*noiselevel;
A=sim(net,P);
AA=compet(A);
errors1=errors1+sum(sum(abs(AA-T)))/2;
An=sim(netn,P);
AAn=compet(An);
errors2=errors2+sum(sum(abs(AAn-T)))/2;
end
network1=[network1 errors1/26/100];
network2=[network2 errors2/26/100];
end
plot(noise_range,network1*100,'--',noise_range,network2*100);
plot(noise_range,network1*100,'--',noise_range,network2*100,'+');
title('识别误差');
xlabel('噪声指标');
ylabel('不同的训练方式');
legend('无噪声训练','有噪声训练');
以上是对系统性能的分析。
这里的compet函数从help上来更像是一个滤波函数,而sum函数则是用来求一个多维矩阵中各行列的和值。
noisyJ=alphabet(:,1)+randn(35,1)*0.2;
plotchar(noisyJ);
A2=sim(net,noisyJ);
A2=compet(A2);
answer=find(compet(A2)==1);
plotchar(alphabet(:,answer));
这里面plotchar函数就是将布尔值向量转变成具体的字母图形,下上代码是对具体的情况进行识别。
noisyJ=alphabet(:,10)+randn(35,1)*0.2;
subplot(1,2,1);
plotchar(noisyJ)
A2=sim(net,noisyJ);
A2=compet(A2);
answer=find(compet(A2)==1);
subplot(1,2,2);
plotchar(alphabet(:,answer));
这段代码暴露了系统还不太成熟的一面
noisyJ=alphabet(:,23)+randn(35,1)*0.2;
subplot(1,2,1);
plotchar(noisyJ);
A2=sim(net,noisyJ);
A2=compet(A2);
answer=find(compet(A2)==1);
subplot(1,2,2);
plotchar(alphabet(:,answer));
同上,这也是一种识别出错的情况。
noisyJ=alphabet(:,4);
subplot(1,2,1);
plotchar(noisyJ);
A2=sim(net,noisyJ);
A2=compet(A2);
answer=find(compet(A2)==1);
subplot(1,2,2);
plotchar(alphabet(:,answer));
这是不加噪声干扰的情况,识别仍然出错,可见训练还远没有达到要求。。。。。
目前遇到这种问题只能通过增大训练强度来解决。。。
2010-7-22
今天学习的是自组织竞争神经网络。是一种不是基于标准答案的学习过程,而是一种基于输入数据的归类而实现的数据分析的网络。下面主要还是来看几个典型的实例:
1.模式分类
X=[0 1;0 1];
clusters=8;
points=10;
std_dev=.05;
P=nngenc(X,clusters,points,std_dev);
plot(P(1,:),P(2,:),'+r');
title('输入向量');
xlabel('P(1)');
ylabel('P(2)');
%以上是为了产生一系列自由排列的8组数据点集,每组有10个数据点
net=newc([0 1;0 1],8,.1);
w=net.IW{1};
plot(P(1,:),P(2,:),'+r');
hold on;
circle=plot(w(:,1),w(:,2),'ob')
net.trainParam.epochs=7;
net=train(net,P);
w=net.IW{1};
delete(circle);
plot(w(:,1),w(:,2),'ob');
p=[0;.2];
a=sim(net,p)
一开始之所以只有一个蓝圈,是因为网络未加训练,网络权值位于向量中心。
后来通过训练之后已经具备分类的功能,最后得出的结果是输入向量归于第4个输入类别。
2.一维自组织特征映射网络设计
angles=0:0.5*pi/99:0.5*pi;
P=[sin(angles);cos(angles)];
plot(P(1,:),P(2,:),'+r');
title('输入向量');
xlabel('P(1)');
ylabel('P(2)');
net=newsom([0 1;0 1],[10]);
cla
w=net.IW{1};
circle=plot(w(:,1),w(:,2),'ob');
title('初始网络权值');
xlabel('w(i,1)');
ylabel('w(i,2)');
net.trainParam.epochs=10;
net=train(net,P);
delete(circle);
plotsom(net.IW{1,1},https://www.doczj.com/doc/2e8470270.html,yers{1}.distances)
title('训练后的网络权值');
xlabel('w(i,1)');
ylabel('w(i,2)');
p=[0.5;0.5];
a=sim(net,p)
注意这个网络运行有一定的波动性,不是很稳定。
通过一系列的测试用例,发现目前该网络的精确性还不够强。
3.二维自组织特征映射网络设计
P=rand(2,500);
plot(P(1,:),P(2,:),'+r');
axis([-1 1 -1 1]);
title('输入向量');
xlabel('P(1)');
ylabel('P(2)');
net=newsom([0 1;0 1],[5 6]);
cla
plotsom(net.IW{1,1},https://www.doczj.com/doc/2e8470270.html,yers{1}.distances)
axis([0 1 0 1]);
title('初始网络权值');
xlabel('w(i,1)');
ylabel('w(i,2)');
net.trainParam.epochs=1;
net=train(net,P);
cla
plotsom(net.IW{1,1},https://www.doczj.com/doc/2e8470270.html,yers{1}.distances)
axis([-1 1 -1 1]);
title('训练后的网络');
xlabel('w(i,1)');
ylabel('w(i,2)');
p=[0.5;0.3];
a=sim(net,p)
由于初始矩阵具有随机性,所以每次得到的结果存在一定的差异。
4.lvq模式的分类网络设计
P=[-3 -2 -2 0 0 0 0 2 2 3;0 1 -1 2 1 -1 -2 1 -1 0];
C=[1 1 1 2 2 2 2 1 1 1];
T=ind2vec(C);
i=1;
cla
for i=1:10
if C(i)==1
plot(P(1,i),P(2,i),'+')
hold on
else
plot(P(1,i),P(2,i),'o')
hold on
end
end
title('输入向量');
xlabel('P(1)');
ylabel('P(2)');
net=newlvq(minmax(P),4,[.6 .4],.1);
hold on
W1=net.IW{1};
plot(W1(1,1),W1(1,2),'*');
title('输入/权值向量');
xlabel('P(1),W(1)');
ylabel('P(2),W(2)');
net.trainParam.epochs=150;
net.trainParam.show=Inf;
net=train(net,P,T);
W1=net.IW{1};
W2=vec2ind(net.LW{2});
i=1;
cla
for i=1:10
if C(i)==1
plot(P(1,i),P(2,i),'+')
hold on
else
plot(P(1,i),P(2,i),'o')
hold on
end
end
j=1;
for i=1:4
if W2(j)==1
plot(W1(j,1),W2(j,2),'+','markersize',15)
hold on
else
plot(W1(j,1),W2(j,2),'o','markerszie',15)
hold on
end
end
title('输入/权值向量');
xlabel('P(1),W(1)');
ylabel('P(2),W(2)');
%对网络进行检验
p=[0.2;1];
a=vec2ind(sim(net,p))
2010-7-23
今天来看看径向基函数神经网络。
相关的理论在笔记本上有选择的摘抄,先来看看几点应用:
首先是利用径向基函数网络来实现函数逼近的一个实例。
P=-1:.1:1;
T=[-0.9602 -0.5770 -0.0297 0.3771 0.6450 0.6600 0.4609 0.1336 -0.2013 -0.4344 -0.5000 -0.3930 0-.1647 0.0988 0.3072 0.3960 0.3449 0.1816 -0.0312 -0.2189 -0.3021];
plot(P,T,'+');
title('训练样本');
xlabel('输入向量P');
ylabel('输出向量T');
P=-1:.1:1;
T=[-0.9602 -0.5770 -0.0297 0.3771 0.6450 0.6600 0.4609 0.1336 -0.2013 -0.4344 -0.5000 -0.3930 0-.1647 0.0988 0.3072 0.3960 0.3449 0.1816 -0.0312 -0.2189 -0.3021];
plot(P,T,'+');
title('训练样本');
xlabel('输入向量P');
ylabel('输出向量T');
p=-3:.1:3;
a=radbas(p);
plot(p,a);
title('径向基传递函数');
xlabel('输入p');
ylabel('输出a');
a2=radbas(p -1.5);
a3=radbas(p+2);
a4=a+a2*1+a3*0.5;
plot(p,a,'b-',p,a3,'b-',p,a4,'m--');%输出层的线性神经元将三个径向基函数的权值相加
title('径向基传递函数的权值之和');
ylabel('输出a');
xlabel('输入p');
xlabel('输入');
X=-1:.01:1;
Y=sim(net,X);
hold on;
plot(X,Y);
hold off;
legend({'目标','输出'});
对于newrb函数来说,散布常数是对网络仿真影响较大的一个参数,下面来看一个关于不同散布常数的实例:
P=-1:.1:1;
T=[-0.9602 -0.5770 -0.0297 0.3771 0.6450 0.6600 0.4609 0.1336 -0.2013 -0.4344 -0.5000 -0.3930 0-.1647 0.0988 0.3072 0.3960 0.3449 0.1816 -0.0312 -0.2189 -0.3021];
plot(P,T,'+');
title('训练样本');
xlabel('输入向量P');
ylabel('输出向量T');
eg=0.02;
sc=.01;
net=newrb(P,T,eg,sc);
X=-1:.01:1;
Y=sim(net,X);
hold on;
plot(X,Y);
hold off
sc=100;
net=newrb(P,T,eg,sc);
Y=sim(net,P);
hold on;
plot(P,Y);
hold off;
sc=10;
net=newrb(P,T,eg,sc);
hold on;
plot(P,Y);
hold off;
以上是模拟散布常数过大,过小以及比较恰当时候的拟合情况。
在实际运用过程中,如果径向基神经元的散布常数选择不当,会造成网络设计中神经元数目过少或者过多,在函数逼近中就会造成过适性和不适性。
最后,径向基神经网络的一个重要作用就是进行变量分类。
P=[1 2;2 2;1 1]';
Tc=[1 2 3];
plot(P(1,:),P(2,:),'.','markersize',30)
for i=1:3
text(P(1,i)+0.1,P(2,i),sprintf('class %g',Tc(i)));
end
axis([0 3 0 3]);
title('三向量及其类别');
xlabel('P(1,:)');
ylabel('P(2,:)');
T=ind2vec(Tc);
spread=1;
net=newpnn(P,T,spread);
A=sim(net,P);
Ac=vec2ind(A);
plot(P(1,:),P(2,:),'.','markersize',30)
for i=1:3
text(P(1,i)+0.1,P(2,i),sprintf('class %g',Ac(i)));
end
axis([0 3 0 3])
title('网络测试结果');
xlabel('P(1,:)');
ylabel('P(2,:)');
p=[2;1.5];
a=sim(net,p);
ac=vec2ind(a);
hold on;
plot(P(1),P(2),'*','markersize',10,'color',[1 0 0])
text(p(1)+0.1,p(2),sprintf('class%g',ac))
hold off
title('对新向量进行分类')
xlabel('p(1,:) 与p(1)')
ylabel('p(2,:) 与p(2)')
p1=0:.05:3;
p2=p1;
[p1,p2]=meshgrid(p1,p2);
pp=[p1(:),p2(:)]';
aa=sim(net,pp);
aa=full(aa);
m=mesh(p1,p2,reshape(aa(1,:),length(p1),length(p2)));
set(m,'facecolor',[0 0.5 1],'linestyle','none');
hold on
m=mesh(p1,p2,reshape(aa(2,:),length(p1),length(p2)));
set(m,'facecolor',[0 0.1 0.5],'linestyle','none');
m=mesh(p1,p2,reshape(aa(3,:),length(p1),length(p2)));
set(m,'facecolor',[0.5 0 1],'linestyle','none');
plot3(p(1,:),p(2,:),[1 1 1]+0.1,'.','markersize',30)
plot3(p(1),p(2),1.1,'*','markersize',10,'color',[1 0 0])
hold off
view(2)
title('向量分类立体图');
xlabel('p(1,:)与p(1)');
ylabel('p(2,:)与p(2)');
最后再来看一个广义回归神经(GRNN)网络用在函数逼近上的例子:P=[1 2 3 4 5 6 7 8];
T=[0 1 2 3 2 1 2 1];
plot(P,T,'.','markersize',30);
axis([0 9 -1 4])
title('待逼近函数');
xlabel('P');
ylabel('T');
axis([0 9 -1 4])
title('待逼近函数');
xlabel('P');
ylabel('T');
spread=0.7;
net=newgrnn(P,T,spread);
A=sim(net,P);
hold on
outputline=plot(P,A,'o','markersize',10,'color',[1 0 0]);
title('检测网络')
xlabel('P');
ylabel('T和A')
p=3.5;
a=sim(net,p);
plot(p,a,'+','markersize',10,'color',[1 0 0]);
title('新输入值')
xlabel('P和p')
ylabel('T和a')
P2=0:.1:9;
A2=sim(net,P2);
plot(P2,A2,'linewidth',4,'color',[1 0 0])
title('逼近函数')
xlabel('P和P2')
ylabel('T和A2')
2010-7-24
今天学习最后一种神经网络——反馈神经网络。
什么是反馈的神经网络?
与前面的网络不同,这里的神经网络包含有延迟的输入或者输出的反馈。这样使得网络具有了记忆功能。
首先是Hopfield神经网络。
在help文档的demo里有一个很好的实例,这里就不举出来了。
那个例子个人理解可以看成是一个,最后的结果通过神经网络使得随机点最后运动与指定的点重合。
不过这个实例中的sim函数用法很特别,要注意一下。
接下来是Elman神经网络。
t=1:20;
p1=sin(t);
p2=sin(t)*2;
plot(t,p1,'r');
hold on;
plot(t,p2,'b--');
hold on;
t1=ones(1,20);
t2=ones(1,20)*2;
p=[p1 p2 p1 p2];
t=[t1 t2 t1 t2];
Pseq=con2seq(p);
Tseq=con2seq(t);
R=1;
S2=1;
S1=10;
%R S2 S1分别为输入元素的数目,输出层的神经元数,中间层的神经元数
net=newelm([-2,2],[S1,S2],{'tansig','purelin'});
net.trainParam.epochs=500;
net=train(net,Pseq,T seq);
y=sim(net,Pseq);
figure
t5=1:80;
plot(t5,cat(2,y{:}),t5,cat(2,Tseq{:}),'b--');
p3=sin(1:20)*1.6;
t3=ones(1,20)*1.6;
p4=sin(1:20)*1.2;
t4=ones(1,20)*1.2;
%产生测试输入样本
pg=[p3 p4 p3 p4];
%产生测试目标样本
tg=[t3 t4 t3 t4];
pgseq=con2seq(pg);
a=sim(net,pgseq);
figure;
plot(t5,cat(2,a{:}),t5,tg,'b--');
这是一个信号处理方面的例子,不太懂。。。。
接下来是一个具体的应用实例:
P=[.4413 .4707 .6953 .8133 .4379 .4677 .6981 .8002 .4517 .4725 .7006 .8201;.437
9 .4677 .6981 .8002 .4517 .4725 .7006 .8201 .4557 .4790 .7019 .8211;.4517 .4
725 .7006 .8201 .4557 .4790 .7019 .8211 .4601 .4911 .7101 .8298]';
T=[.4557 .4790 .7019 .8211;.4601 .4911 .7101 .8298;.4612 .4845 .7188 .8312;]';
threshold=[0 1;0 1;0 1;0 1;0 1;0 1;0 1;0 1;0 1;0 1;0 1;0 1];
a=[11 17 23];
for i=1:3
net=newelm(threshold,[a(i),4],{'tansig','purelin'});
net.trainParam.epochs=1000;
net=init(net);
net=train(net,P,T);
y=sim(net,P);
error(i,:)=y-T;
end
接着来看看双向联想记忆神经网络
前面介绍的Hopfield可以实现自联想,CNP可以实现异联想,这里的BAM则是双向联想。不过很可惜,双向联想神经网络并没有matlab实例代码。
接着还是来看一下反馈网络的一些具体的运用。
首先是关于Hopfield网络的不稳定性
T = [+1 -1; ...
-1 +1];
plot(T(1,:),T(2,:),'r*')
axis([-1.1 1.1 -1.1 1.1])
title('Hopfield Network State Space')
xlabel('a(1)');
ylabel('a(2)');
net = newhop(T);
W=net.LW{1,1};
b=net.b{1,1};
Ai=T;
[Y,Pf,Af]=sim(net,2,[],Ai);
a = {rands(2,1)};
[y,Pf,Af] = sim(net,{1 50},{},a);
record = [cell2mat(a) cell2mat(y)];
start = cell2mat(a);
hold on
plot(start(1,1),start(2,1),'bx',record(1,:),record(2,:))
plot(0,0,'ko');
P=[-1.0 -0.5 0.0 0.5 1.0;-1.0 -0.5 0.0 0.5 1.0];
color='rgbmy';
for i=1:5
a={P(:,i)};
[y,Pf,Af]=sim(net,{1 50},{},a);
record=[cell2mat(a) cell2mat(y)];
start=cell2mat(a);
plot(start(1,1),start(2,1),'kx',record(1,:),record(2,:),color(rem(i,5)+1))
drawnow
end
例子的最后会出现伪平衡点。
接着来看看三神经元的Hopfield神经网络的设计
在matlab的demo中有相关的例子。
反馈型神经网络在解决TSP问题中用的比较广泛,有空再去好好看一下~~
2010-7-25
到昨天为止,神经网络的几种主要类型就已经全部过了一遍,今天主要是看一下一些具体的实战例子。
很显然,神经网络的一大用途就是用来预测,主要还是BP网络用的比较广泛。
不过这里要提到一个利用自组织竞争函数网络来做预测的例子。
P=[.3125 .3125 0 0 .1875 0 1
0.5 .1875 .5;.45 .49 .65 .6 .5 .62 .36 .43 .42 .43;.4902 .3333 .7647 .0196 .3137
0 1 .5686 .6471 .6078;.7639 .8611 1 .8889 .5972 .8194
0 .1528 .7917 .6528;.93 .57 .96 .94 .8 .96 .53 .70 1.12 .89;.4643
0 .1876 .3214 .1876 1 .1876 .1492 .2857 .3214; .1756
0 .0588 .1765 .3529 .2353 1 .9412 .5882 .6471;3.9 6.3 3.5 3.9 5.0 3.5 6.3 4.1
5.1 5.4;.0473 .8581 .2162 .1081 .1419 0 1 1 .0405 .0405;.5 12 .03 .2 1 .2 15
0 .02 0;.1 2.4 .28 .4 1.1 .15 2.8 .22 1 .3;];
net=newc(minmax(P),3,0.1);
net=init(net);
net=train(net,P);
y=sim(net,P);
y=vec2ind(y);
以上的代码通过具体的分类(可以理解为震级)来达到预测的目的。
接着的一个例子提到了GRNN比BP和RBF存在逼近能力,分类能力和学习速率上的优势,且不会出现局部最小值点。
p=[58478 135185 5.46 0.23 16.5 0.21 1005.3 585.44;
67884 152369 5.46 0.27 18.7 0.26 1005.6 575.03;
74462 182563 6.01 0.25 21.6 0.28 1204.6 601.23;
78345 201587 6.12 0.26 25.8 0.29 1316.5 627.89;
82067 225689 6.21 0.26 30.5 0.31 1423.5 676.95;
89403 240568 6.37 0.28 34.9 0.33 1536.2 716.32;
95933 263856 6.38 0.28 39.8 0.36 1632.2 765.24;
104790 285697 6.65 0.30 42.5 0.39 1753.2 812.22;
116694 308765 6.65 0.30 46.7 0.41 1865.5 875.26]';
t=[102569 52365 46251;
124587 60821 56245;
148792 69253 67362;
162568 79856 78165;
186592 91658 90548;
205862 99635 98752;
226598 109862 102564;
245636 120556 111257;
263595 130378 120356]';
a=[1 2 3 5 7 8];
P=p;
T=t;
for i=1:6
P(a(i),:)=(p(a(i),:)-min(p(a(i),:)))/(max(p(a(i),:))-min(p(a(i),:))); end
for i=1:3
T(i,:)=(t(i,:)-min(t(i,:)))/(max(t(i,:))-min(t(i,:)));
end
P_train=[P(:,1) P(:,2) P(:,3) P(:,4) P(:,5) P(:,6) P(:,7)];
T_train=[T(:,1) T(:,2) T(:,3) T(:,4) T(:,5) T(:,6) T(:,7)];
P_test=[P(:,8) P(:,9)];
T_test=[T(:,8) T(:,9)];
for i=1:5
net=newgrnn(P_train,T_train,i/10);
temp=sim(net,P_train);
j=3*i;
y_out(j-2,:)=temp(1,:);
y_out(j-1,:)=temp(2,:);
y_out(j,:)=temp(3,:);
temp=sim(net,P_test);
y(j-2,:)=temp(1,:);
y(j-1,:)=temp(2,:);
y(j,:)=temp(3,:);
end
y1=[y_out(1,:);y_out(2,:);y_out(3,:)];
y1=[y_out(4,:);y_out(5,:);y_out(6,:)];
y2=[y_out(4,:);y_out(5,:);y_out(6,:)];
y3=[y_out(7,:);y_out(8,:);y_out(9,:)];
y4=[y_out(10,:);y_out(11,:);y_out(12,:)];
y5=[y_out(13,:);y_out(14,:);y_out(15,:)];
y6=[y(1,:);y(2,:);y(3,:)];
y7=[y(4,:);y(5,:);y(6,:)];
y8=[y(7,:);y(8,:);y(9,:)];
y9=[y(10,:);y(11,:);y(12,:)];
y10=[y(13,:);y(14,:);y(15,:)];
%计算逼近误差
for i=1:7
error1(i)=norm(y1(:,i)-T_train(:,i));
error2(i)=norm(y2(:,i)-T_train(:,i));
error3(i)=norm(y3(:,i)-T_train(:,i));
error4(i)=norm(y4(:,i)-T_train(:,i));
error5(i)=norm(y5(:,i)-T_train(:,i)); end
for i=1:2
error6(i)=norm(y6(:,i)-T_test(:,i));
error7(i)=norm(y7(:,i)-T_test(:,i));
error8(i)=norm(y8(:,i)-T_test(:,i));
error9(i)=norm(y9(:,i)-T_test(:,i));
error10(i)=norm(y10(:,i)-T_test(:,i)); end
%绘制逼近误差曲线
plot(1:7,error1,'-*');
hold on;
plot(1:7,error2,'-+');
hold on;
plot(1:7,error3,'-h');
hold on;
plot(1:7,error4,'-d');
hold on;
plot(1:7,error5,'-o');
figure;
%绘制预测误差曲线
plot(1:2,error6,'-*');
hold on;
plot(1:2,error7,'-+');
hold on;
plot(1:2,error8,'-h');
hold on;
plot(1:2,error9,'-d');
hold on;
plot(1:2,error10,'-o');
hold off;
这里主要还是要学习代码中的误差分析方法。
接着来看一个比较新的东西,神经网络模型预测控制器。
在matlab工作间中输入predcstr,就调出了相关的simulink模型。(研究催化剂的连续搅拌反应器)。通过产生随机的数据进行训练,最后进行simulink仿真的过程,这也算是神经网络较为高级的运用了。
再来看一组神经网络控制器——反馈线性化控制器
输入narmamaglev(磁悬浮系统的simulink模型)
大致上是了解了一下模型怎么使用,具体simulink模型的组成模块,要全部弄懂的话,还得花一番功夫啊。
2010-7-27
今天来学习神经网络的最后一个内容,关于图形界面的使用。
先来看一段图形界面的代码,在2010b中运行出错。
function guihd(arg)
if nargin==0
arg='Initialize';
end
switch arg
case 'Initialize'
hf=figure('Position',[200 200 600 400],'Name','GUI_hd','NumberTitle','off');
ha=axes('Position',[.4 .1 .5 .7],'Box','on');
hbSin=uicontrol(hf,'Style','pushbutton','Position',[50 140 100 30],'String','plot sin(x)','CallBack',['x=0:0.1:4*pi;' 'plot(x,sin(x));' 'axis([0 4*pi -1 1]);'
'xlabel("x");' 'ylabel("y=sin(x)");']);
hb=uicontrol(hf,'Style','pushbutton','Position',[50 100 100 30],'String','plot cos(x)','CallBack',['x=0:0.1:4*pi;' 'plot(x,cos(x));' 'axis([0 4*pi -1 1]);'
'Xlabel("x");' 'ylabel("y=cos(x)");']);
hbClose=uicontrol(hf,'Style','pushbutton','Position',[50 60 100
30],'String','Exit','CallBack','close');
case 'plot sin(x)'
case 'plot cos(x)'
case 'Exit'
Otherwise
errordlg('请确认输入参数','出错了%>_<%');
end
具体的错误原多因还不知道,于是继续往下看。
主要还是要了解图形界面中的特殊的回调函数,M文件的调用以及函数句柄的调用,就不过多的和GUI的基础问题多做纠缠,直接进入到神经网络GUI界面nntool的学习当中。
其实matlab的nntool用法很简单通过一段时间的自己摸索相信就能够熟练掌握了~~
p=p1';t=t1'; [pn,minp,maxp,tn,mint,maxt]=premnmx(p,t); % 原始数据归一化 net=newff(minmax(pn),[5,1],{'tansig','purelin'},'traingdx'); %设置网络,建立相应的BP 网络net.trainParam.show=2000; % 训练网络 net.trainParam.lr=0.01; net.trainParam.epochs=100000; net.trainParam.goal=1e-5; [net,tr]=train(net ,pn,tn); %调用TRAINGDM 算法训练BP 网络 pnew=pnew1'; pnewn=tramnmx(pnew,minp,maxp); anewn=sim(net,pnewn); anew=postmnmx(anewn,mint,maxt); %对 BP 网络进行仿真%还原数据 y=anew'; 1、 BP 网络构建 (1)生成 BP 网络 net newff ( PR,[ S1 S2...SNl],{ TF1 TF 2...TFNl }, BTF , BLF , PF ) PR :由R 维的输入样本最小最大值构成的R 2 维矩阵。 [ S1 S2...SNl] :各层的神经元个数。 {TF 1 TF 2...TFNl } :各层的神经元传递函数。 BTF :训练用函数的名称。 (2)网络训练 [ net,tr ,Y, E, Pf , Af ] train (net, P, T , Pi , Ai ,VV , TV ) (3)网络仿真 [Y, Pf , Af , E, perf ] sim(net, P, Pi , Ai ,T ) {'tansig','purelin'},'trainrp' BP 网络的训练函数 训练方法 梯度下降法 有动量的梯度下降法 自适应 lr 梯度下降法 自适应 lr 动量梯度下降法弹性梯度下降法训练函数traingd traingdm traingda traingdx trainrp Fletcher-Reeves 共轭梯度法traincgf Ploak-Ribiere 共轭梯度法traincgp
以下是用Matlab中的m语言编写的BP神经网络代码,实现的是一个正弦函数的拟合过程,包括了初始化、BP算法、绘制曲线等过程,可以将代码放到一个M文件中运行,以下是代码: defaultpoints=20; %%%%%%%%%隐含层节点数 inputpoints=1; %%%%%%%%%输入层节点数 outputpoints=1; %%%%%%%%%输出层节点数 Testerror=zeros(1,100);%%%%每个测试点的误差记录 a=zeros(1,inputpoints);%%%%输入层节点值 y=zeros(1,outputpoints);%%%样本节点输出值 w=zeros(inputpoints,defaultpoints);%%%%%输入层和隐含层权值 %初始化权重很重要,比如用rand函数初始化则效果非常不确定,不如用zeros初始化 v=zeros(defaultpoints,outputpoints);%%%%隐含层和输出层权值 bin=rand(1,defaultpoints);%%%%%隐含层输入 bout=rand(1,defaultpoints);%%%%隐含层输出 base1=0*ones(1,defaultpoints);%隐含层阈值,初始化为0 cin=rand(1,outputpoints);%%%%%%输出层输入 cout=rand(1,outputpoints);%%%%%输出层输出 base2=0*rand(1,outputpoints);%%输出层阈值 error=zeros(1,outputpoints);%%%拟合误差 errors=0;error_sum=0; %%%误差累加和 error_rate_cin=rand(defaultpoints,outputpoints);%%误差对输出层节点权值的导数 error_rate_bin=rand(inputpoints,defaultpoints);%%%误差对输入层节点权值的导数 alfa=0.5; %%%% alfa 是隐含层和输出层权值-误差变化率的系数,影响很大 belt=0.5; %%%% belt 是隐含层和输入层权值-误差变化率的系数,影响较小 gama=5; %%%% gama 是误差放大倍数,可以影响跟随速度和拟合精度,当gama大于2时误差变大,容易震荡 %%%%规律100个隐含节点,当alfa *gama =1.5时,效果好,其他值误差变大,belt基本不影响效果 %%%%规律200个隐含节点,当alfa *gama =0.7时,效果好,其他值误差变大,belt基本不影响效果,最小误差和100个隐含点一样 %%%%规律50个隐含节点,当alfa *gama =3时,效果好,其他值误差变大,belt基本不影响效果,最小误差和100个隐含点一样 trainingROUND=200;% 训练次数,有时训练几十次比训练几百次上千次效果要好很多sampleNUM=361; % 样本点数 x1=zeros(sampleNUM,inputpoints); %样本输入矩阵 y1=zeros(sampleNUM,outputpoints); %样本输出矩阵 x2=zeros(sampleNUM,inputpoints); %测试输入矩阵
BP神经网络模型 第1节基本原理简介 近年来全球性的神经网络研究热潮的再度兴起,不仅仅是因为神经科学本身取得了巨大的进展.更主要的原因在于发展新型计算机和人工智能新途径的迫切需要.迄今为止在需要人工智能解决的许多问题中,人脑远比计算机聪明的多,要开创具有智能的新一代计算机,就必须了解人脑,研究人脑神经网络系统信息处理的机制.另一方面,基于神经科学研究成果基础上发展出来的人工神经网络模型,反映了人脑功能的若干基本特性,开拓了神经网络用于计算机的新途径.它对传统的计算机结构和人工智能是一个有力的挑战,引起了各方面专家的极大关注. 目前,已发展了几十种神经网络,例如Hopficld模型,Feldmann等的连接型网络模型,Hinton等的玻尔茨曼机模型,以及Rumelhart等的多层感知机模型和Kohonen的自组织网络模型等等。在这众多神经网络模型中,应用最广泛的是多层感知机神经网络。多层感知机神经网络的研究始于50年代,但一直进展不大。直到1985年,Rumelhart等人提出了误差反向传递学习算法(即BP算),实现了Minsky的多层网络
设想,如图34-1所示。 BP 算法不仅有输入层节点、输出层节点,还可有1个或多个隐含层节点。对于输入信号,要先向前传播到隐含层节点,经作用函数后,再把隐节点的输出信号传播到输出节点,最后给出输出结果。节点的作用的激励函数通常选取S 型函数,如 Q x e x f /11)(-+= 式中Q 为调整激励函数形式的Sigmoid 参数。该算法的学习过程由正向传播和反向传播组成。在正向传播过程中,输入信息从输入层经隐含层逐层处理,并 传向输出层。每一层神经元的状态只影响下一层神经
%%%清除空间 clc clear all ; close all ; %%%训练数据预测数据提取以及归一化 %%%下载四类数据 load data1 c1 load data2 c2 load data3 c3 load data4 c4 %%%%四个特征信号矩阵合成一个矩阵data ( 1:500 , : ) = data1 ( 1:500 , :) ; data ( 501:1000 , : ) = data2 ( 1:500 , : ) ; data ( 1001:1500 , : ) = data3 ( 1:500 , : ) ; data ( 1501:2000 , : ) = data4 ( 1:500 , : ) ; %%%%%%从1到2000间的随机排序 k = rand ( 1 , 2000 ) ; [ m , n ] = sort ( k ) ; %%m为数值,n为标号
%%%%%%%%%%%输入输出数据 input = data ( : , 2:25 ) ; output1 = data ( : , 1) ; %%%%%%把输出从1维变到4维 for i = 1 : 1 :2000 switch output1( i ) case 1 output( i , :) = [ 1 0 0 0 ] ; case 2 output( i , :) = [ 0 1 0 0 ] ; case 3 output( i , :) = [ 0 0 1 0 ] ; case 4 output( i , :) = [ 0 0 0 1 ] ; end end %%%%随机抽取1500个样本作为训练样本,500个样本作为预测样本 input_train = input ( n( 1:1500 , : ) )’ ; output_train = output ( n( 1:1500 , : ) )’ ; input_test = input ( n( 1501:2000 , : ) )’ ;
神经网络的设计实例(MATLAB编程) 例1 采用动量梯度下降算法训练BP 网络。训练样本定义如下: 输入矢量为 p =[-1 -2 3 1 -1 1 5 -3] 目标矢量为t = [-1 -1 1 1] 解:本例的MATLAB 程序如下: close all clear echo on clc % NEWFF——生成一个新的前向神经网络% TRAIN——对BP 神经网络进行训练 % SIM——对BP 神经网络进行仿真pause % 敲任意键开始 clc % 定义训练样本 P=[-1, -2, 3, 1; -1, 1, 5, -3]; % P 为输入矢量T=[-1, -1, 1, 1]; % T 为目标矢量
clc % 创建一个新的前向神经网络 net=newff(minmax(P),[3,1],{'tansig','purelin'},'traingdm') % 当前输入层权值和阈值 inputWeights=net.IW{1,1} inputbias=net.b{1} % 当前网络层权值和阈值 layerWeights=net.LW{2,1} layerbias=net.b{2} pause clc % 设置训练参数 net.trainParam.show = 50; net.trainParam.lr = 0.05; net.trainParam.mc = 0.9; net.trainParam.epochs = 1000; net.trainParam.goal = 1e-3; pause clc % 调用TRAINGDM 算法训练BP 网络 [net,tr]=train(net,P,T);
Matlab训练好的BP神经网络如何保存和读取方法(附实例说明) 看到论坛里很多朋友都在提问如何存储和调用已经训练好的神经网络。 本人前几天也遇到了这样的问题,在论坛中看了大家的回复,虽然都提到了关键的两个函数“save”和“load”,但或多或少都简洁了些,让人摸不着头脑(呵呵,当然也可能是本人太菜)。通过不断调试,大致弄明白这两个函数对神经网络的存储。下面附上实例给大家做个说明,希望对跟我有一样问题的朋友有所帮助。 如果只是需要在工作目录下保到当前训练好的网络,可以在命令窗口 输入:save net %net为已训练好的网络 然后在命令窗口 输入:load net %net为已保存的网络 加载net。 但一般我们都会在加载完后对网络进行进一步的操作,建议都放在M文件中进行保存网络和调用网络的操作 如下所示: %% 以函数的形式训练神经网络 functionshenjingwangluo() P=[-1,-2,3,1; -1,1,5,-3]; %P为输入矢量 T=[-1,-1,1,1,]; %T为目标矢量 net=newff(minmax(P),[3,1],{'tansig','purelin'},'traingdm') %创建一个新的前向神经网络 inputWeights=net.IW{1,1} inputbias=net.b{1} %当前输入层权值和阀值 layerWeights=net.LW{2,1} layerbias=net.b{2} net.trainParam.show=50; net.trainParam.lr=0.05; net.trainParam.mc=0.9;
基于BP神经网络模型及改进模型对全国历年车祸次数预测 一、背景 我国今年来随着经济的发展,汽车需求量不断地增加,所以全国每年的车祸次数也被越来越被关注,本文首先搜集全国历年车祸次数,接着通过这些数据利用BP神经网络模型和改进的径向基函数网络进行预测,最后根据预测结果,分析模型的优劣,从而达到深刻理解BP神经网络和径向基函数网络的原理及应用。所用到的数据即全国历年车祸次数来自中国汽车工业信息网,网址如下: https://www.doczj.com/doc/2e8470270.html,/autoinfo_cn/cszh/gljt/qt/webinfo/2006/05/124650 1820021204.htm 制作历年全国道路交通事故统计表如下所示: 二、问题研究 (一)研究方向 (1)通过数据利用BP神经网络模型预测历年全国交通事故次数并与实际值进行比较。(2)分析BP神经网络模型改变训练函数再进行仿真与之前结果进行对比。 (3)从泛化能力和稳定性等方面分析BP神经网络模型的优劣。 (4)利用径向基函数网络模型进行仿真,得到结果与采用BP神经网络模型得到的结果进行比较。
(二)相关知识 (1)人工神经网络 人工神经网络是一种应用类似于大脑神经突触联接的结构进行信息处理的数学模型。在工程与学术界也常直接简称为神经网络或类神经网络。神经网络是一种运算模型,由大量的节点(或称神经元)和之间相互联接构成。每个节点代表一种特定的输出函数,称为激励函数(activation function)。每两个节点间的连接都代表一个对于通过该连接信号的加权值,称之为权重,这相当于人工神经网络的记忆。网络的输出则依网络的连接方式,权重值和激励函数的不同而不同。而网络自身通常都是对自然界某种算法或者函数的逼近,也可能是对一种逻辑策略的表达。 人工神经网络有以下几个特征: (1)非线性非线性关系是自然界的普遍特性。大脑的智慧就是一种非线性现象。人工神经元处于激活或抑制二种不同的状态,这种行为在数学上表现为一种非线性网络关系。具有阈值的神经元构成的网络具有更好的性能,可以提高容错性和存储容量。 (2)非局限性一个神经网络通常由多个神经元广泛连接而成。一个系统的整体行为不仅取决于单个神经元的特征,而且可能主要由单元之间的相互作用、相互连接所决定。通过单元之间的大量连接模拟大脑的非局限性。联想记忆是非局限性的典型例子。 (3)非常定性人工神经网络具有自适应、自组织、自学习能力。神经网络不但处理的信息可以有各种变化,而且在处理信息的同时,非线性动力系统本身也在不断变化。经常采用迭代过程描写动力系统的演化过程。 (4)非凸性一个系统的演化方向,在一定条件下将取决于某个特定的状态函数。例如能量函数,它的极值相应于系统比较稳定的状态。非凸性是指这种函数有多个极值,故系统具有多个较稳定的平衡态,这将导致系统演化的多样性。 (2)BP神经网络模型 BP(Back Propagation)网络是1986年由Rumelhart和McCelland为首的科学家小组提出,是一种按误差逆传播算法训练的多层前馈网络,是目前应用最广泛的神经网络模型之一。BP网络能学习和存贮大量的输入-输出模式映射关系,而无需事前揭示描述这种映射关系的数学方程。它的学习规则是使用最速下降法,通过反向传播来不断调整网络的权值和阈值,使网络的误差平方和最小。BP神经网络模型拓扑结构包括输入层(input)、隐层(hide layer)和输出层(output layer)。 (3)径向基函数网络模型 径向基函数(Radial Basis Function,RBF)神经网络由三层组成,输入层节点只传递输入信号到隐层,隐层节点由像高斯函数那样的辐射状作用函数构成,而输出层节点通常是简单的线性函数。 隐层节点中的作用函数(基函数)对输入信号将在局部产生响应,也就是说,当输入信号靠近基函数的中央范围时,隐层节点将产生较大的输出,由此看出这种网络具有局部逼近能力,所以径向基函数网络也称为局部感知场网络。
用遗传算法优化BP神经网络的Matlab编程实例(转) 由于BP网络的权值优化是一个无约束优化问题,而且权值要采用实数编码,所以直接利用Matlab遗传算法工具箱。以下贴出的代码是为一个19输入变量,1个输出变量情况下的非线性回归而设计的,如果要应用于其它情况,只需改动编解码函数即可。 程序一:GA训练BP权值的主函数 function net=GABPNET(XX,YY) %-------------------------------------------------------------------------- % GABPNET.m % 使用遗传算法对BP网络权值阈值进行优化,再用BP算法训练网络 %-------------------------------------------------------------------------- %数据归一化预处理 nntwarn off XX=[1:19;2:20;3:21;4:22]'; YY=[1:4]; XX=premnmx(XX); YY=premnmx(YY); YY %创建网络 net=newff(minmax(XX),[19,25,1],{'tansig','tansig','purelin'},'tra inlm'); %下面使用遗传算法对网络进行优化 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;%种群规模 save data2 XX YY % 是将 xx,yy 二个变数的数值存入 data2 这个MAT-file,initPpp=initializega(popu,aa,'gabpEval');%初始化种群 gen=100;%遗传代数
BP神经网络matlab代码 p=[284528334488;283344884554;448845542928;455429283497;29283497 2261;... 349722616921;226169211391;692113913580;139135804451;35804451 2636;... 445126363471;263634713854;347138543556;385435562659;35562659 4335;... 265943352882;433528824084;433528821999;288219992889;19992889 2175;... 288921752510;217525103409;251034093729;340937293489;37293489 3172;... 348931724568;317245684015;]'; %====期望输出======= t=[4554292834972261692113913580445126363471385435562659... 4335288240841999288921752510340937293489317245684015... 3666]; ptest=[284528334488;283344884554;448845542928;455429283497;29283497 2261;... 349722616921;226169211391;692113913580;139135804451;35804451 2636;... 445126363471;263634713854;347138543556;385435562659;35562659 4335;... 265943352882;433528824084;433528821999;288219992889;19992889 2175;... 288921752510;217525103409;251034093729;340937293489;37293489 3172;... 348931724568;317245684015;456840153666]'; [pn,minp,maxp,tn,mint,maxt]=premnmx(p,t);%将数据归一化 NodeNum1=20;%隐层第一层节点数 NodeNum2=40;%隐层第二层节点数 TypeNum=1;%输出维数 TF1='tansig'; TF2='tansig'; TF3='tansig'; net=newff(minmax(pn),[NodeNum1,NodeNum2,TypeNum],{TF1TF2 TF3},'traingdx');
神经网络Matlab p=p1';t=t1'; [pn,minp,maxp,tn,mint,maxt]=premnmx(p,t); %原始数据归一化net=newff(minmax(pn),[5,1],{'tansig','purelin'},'traingdx');%设置网络,建立相应的BP网络 net.trainParam.show=2000; % 训练网络 net.trainParam.lr=0.01; net.trainParam.epochs=100000; net.trainParam.goal=1e-5; [net,tr]=train(net ,pn,tn); %调用TRAINGDM算法训练BP网络 pnew=pnew1'; pnewn=tramnmx(pnew,minp,maxp); anewn=sim(net,pnewn); %对BP网络进行仿真 anew=postmnmx(anewn,mint,maxt); %还原数据 y=anew'; 1、BP网络构建 (1)生成BP网络 = net newff PR S S SNl TF TF TFNl BTF BLF PF (,[1 2...],{ 1 2...},,,) R?维矩阵。 PR:由R维的输入样本最小最大值构成的2
S S SNl:各层的神经元个数。 [1 2...] TF TF TFNl:各层的神经元传递函数。 { 1 2...} BTF:训练用函数的名称。 (2)网络训练 = [,,,,,] (,,,,,,) net tr Y E Pf Af train net P T Pi Ai VV TV (3)网络仿真 = [,,,,] (,,,,) Y Pf Af E perf sim net P Pi Ai T {'tansig','purelin'},'trainrp' BP网络的训练函数 训练方法训练函数 梯度下降法traingd 有动量的梯度下降法traingdm 自适应lr梯度下降法traingda 自适应lr动量梯度下降法traingdx 弹性梯度下降法trainrp Fletcher-Reeves共轭梯度法traincgf Ploak-Ribiere共轭梯度法traincgp Powell-Beale共轭梯度法traincgb 量化共轭梯度法trainscg 拟牛顿算法trainbfg 一步正割算法trainoss Levenberg-Marquardt trainlm
基于MATLAB的BP神经网络工具箱函数 最新版本的神经网络工具箱几乎涵盖了所有的神经网络的基本常用模型,如感知器和BP网络等。对于各种不同的网络模型,神经网络工具箱集成了多种学习算法,为用户提供了极大的方便[16]。Matlab R2007神经网络工具箱中包含了许多用于BP网络分析与设计的函数,BP网络的常用函数如表3.1所示。 3.1.1BP网络创建函数 1) newff 该函数用于创建一个BP网络。调用格式为: net=newff net=newff(PR,[S1S2..SN1],{TF1TF2..TFN1},BTF,BLF,PF) 其中, net=newff;用于在对话框中创建一个BP网络。 net为创建的新BP神经网络; PR为网络输入向量取值范围的矩阵; [S1S2…SNl]表示网络隐含层和输出层神经元的个数; {TFlTF2…TFN1}表示网络隐含层和输出层的传输函数,默认为‘tansig’; BTF表示网络的训练函数,默认为‘trainlm’; BLF表示网络的权值学习函数,默认为‘learngdm’; PF表示性能数,默认为‘mse’。
2)newcf函数用于创建级联前向BP网络,newfftd函数用于创建一个存在输入延迟的前向网络。 3.1.2神经元上的传递函数 传递函数是BP网络的重要组成部分。传递函数又称为激活函数,必须是连续可微的。BP网络经常采用S型的对数或正切函数和线性函数。 1) logsig 该传递函数为S型的对数函数。调用格式为: A=logsig(N) info=logsig(code) 其中, N:Q个S维的输入列向量; A:函数返回值,位于区间(0,1)中; 2)tansig 该函数为双曲正切S型传递函数。调用格式为: A=tansig(N) info=tansig(code) 其中, N:Q个S维的输入列向量; A:函数返回值,位于区间(-1,1)之间。 3)purelin 该函数为线性传递函数。调用格式为: A=purelin(N) info=purelin(code) 其中, N:Q个S维的输入列向量; A:函数返回值,A=N。 3.1.3BP网络学习函数 1)learngd 该函数为梯度下降权值/阈值学习函数,它通过神经元的输入和误差,以及权值和阈值的学习效率,来计算权值或阈值的变化率。调用格式为: [dW,ls]=learngd(W,P,Z,N,A,T,E,gW,gA,D,LP,LS) [db,ls]=learngd(b,ones(1,Q),Z,N,A,T,E,gW,gA,D,LP,LS)
BP神经网络matlab源程序代码) %******************************% 学习程序 %******************************% %======原始数据输入======== p=[2845 2833 4488;2833 4488 4554;4488 4554 2928;4554 2928 3497;2928 3497 2261;... 3497 2261 6921;2261 6921 1391;6921 1391 3580;1391 3580 4451;3580 4451 2636;... 4451 2636 3471;2636 3471 3854;3471 3854 3556;3854 3556 2659;3556 2659 4335;... 2659 4335 2882;4335 2882 4084;4335 2882 1999;2882 1999 2889;1999 2889 2175;... 2889 2175 2510;2175 2510 3409;2510 3409 3729;3409 3729 3489;3729 3489 3172;... 3489 3172 4568;3172 4568 4015;]'; %===========期望输出======= t=[4554 2928 3497 2261 6921 1391 3580 4451 2636 3471 3854 3556 2659 ... 4335 2882 4084 1999 2889 2175 2510 3409 3729 3489 3172 4568 4015 ... 3666]; ptest=[2845 2833 4488;2833 4488 4554;4488 4554 2928;4554 2928 3497;2928 3497 2261;... 3497 2261 6921;2261 6921 1391;6921 1391 3580;1391 3580 4451;3580 4451 2636;... 4451 2636 3471;2636 3471 3854;3471 3854 3556;3854 3556 2659;3556 2659 4335;... 2659 4335 2882;4335 2882 4084;4335 2882 1999;2882 1999 2889;1999 2889 2175;... 2889 2175 2510;2175 2510 3409;2510 3409 3729;3409 3729 3489;3729 3489 3172;... 3489 3172 4568;3172 4568 4015;4568 4015 3666]'; [pn,minp,maxp,tn,mint,maxt]=premnmx(p,t); %将数据归一化 NodeNum1 =20; % 隐层第一层节点数 NodeNum2=40; % 隐层第二层节点数 TypeNum = 1; % 输出维数 TF1 = 'tansig';
bp神经网络及matlab实现 分类:算法学习2012-06-20 20:56 66399人阅读评论(28) 收藏举报网络matlab算法functionnetworkinput 本文主要内容包括:(1) 介绍神经网络基本原理,(2) https://www.doczj.com/doc/2e8470270.html,实现前向神经网络的方法,(3) Matlab实现前向神经网络的方法。 第0节、引例 本文以Fisher的Iris数据集作为神经网络程序的测试数据集。Iris数据集可以在https://www.doczj.com/doc/2e8470270.html,/wiki/Iris_flower_data_set 找到。这里简要介绍一下Iris数据集: 有一批Iris花,已知这批Iris花可分为3个品种,现需要对其进行分类。不同品种的Iris花的花萼长度、花萼宽度、花瓣长度、花瓣宽度会有差异。我们现有一批已知品种的Iris花的花萼长度、花萼宽度、花瓣长度、花瓣宽度的数据。 一种解决方法是用已有的数据训练一个神经网络用作分类器。 如果你只想用C#或Matlab快速实现神经网络来解决你手头上的问题,或者已经了解神经网络基本原理,请直接跳到第二节——神经网络实现。 第一节、神经网络基本原理 1. 人工神经元( Artificial Neuron )模型 人工神经元是神经网络的基本元素,其原理可以用下图表示:
图1. 人工神经元模型 图中x1~xn是从其他神经元传来的输入信号,wij表示表示从神经元j到神经元i的连接权值,θ表示一个阈值( threshold ),或称为偏置( bias )。则神经元i的输出与输入的关系表示为: 图中yi表示神经元i的输出,函数f称为激活函数 ( Activation Function )或转移函数( Transfer Function ) ,net称为净激活(net activation)。若将阈值看成是神经元i的一个输入x0的权重wi0,则上面的式子可以简化为: 若用X表示输入向量,用W表示权重向量,即: X = [ x0 , x1 , x2 , ....... , xn ]
用遗传算法优化BP神经网络的 Matlab编程实例 由于BP网络的权值优化是一个无约束优化问题,而且权值要采用实数编码,所以直接利用Matlab遗传算法工具箱。以下贴出的代码是为一个19输入变量,1个输出变量情况下的非线性回归而设计的,如果要应用于其它情况,只需改动编解码函数即可。 程序一:GA训练BP权值的主函数 function net=GABPNET(XX,YY) %-------------------------------------------------------------------------- % GABPNET.m % 使用遗传算法对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-6 1 1],'maxGenTerm',gen,... 'normGeomSelect',[0.09],['arithXover'],[2],'nonUnifMutatio n',[2 gen 3]); %绘收敛曲线图 figure(1) plot(trace(:,1),1./trace(:,3),'r-'); hold on plot(trace(:,1),1./trace(:,2),'b-'); xlabel('Generation'); ylabel('Sum-Squared Error'); figure(2) plot(trace(:,1),trace(:,3),'r-'); hold on plot(trace(:,1),trace(:,2),'b-'); xlabel('Generation'); ylabel('Fittness'); %下面将初步得到的权值矩阵赋给尚未开始训练的BP网络 [W1,B1,W2,B2,P,T,A1,A2,SE,val]=gadecod(x); net.LW{2,1}=W1; net.LW{3,2}=W2; net.b{2,1}=B1; net.b{3,1}=B2; XX=P; YY=T; %设置训练参数 net.trainParam.show=1; net.trainParam.lr=1; net.trainParam.epochs=50; net.trainParam.goal=0.001; %训练网络 net=train(net,XX,YY); 程序二:适应值函数 function [sol, val] = gabpEval(sol,options) % val - the fittness of this individual % sol - the individual, returned to allow for Lamarckian evolution % options - [current_generation] load data2 nntwarn off 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;%遗传算法编码长度 for i=1:S, x(i)=sol(i); end; [W1, B1, W2, B2, P, T, A1, A2, SE, val]=gadecod(x);
BP神经网络及其MATLAB实例 问题:BP神经网络预测2020年某地区客运量和货运量 公路运量主要包括公路客运量和公路货运量两方面。某个地区的公路运量主要与该地区的人数、机动车数量和公路面积有关,已知该地区20年(1999-2018)的公路运量相关数据如下: 人数/万人: 20.5522.4425.3727.1329.4530.1030.9634.0636.4238.09 39.1339.9941.9344.5947.3052.8955.7356.7659.1760.63机动车数量/万辆: 0.60.750.850.9 1.05 1.35 1.45 1.6 1.7 1.85 2.15 2.2 2.25 2.35 2.5 2.6 2.7 2.85 2.95 3.1 公路面积/单位:万平方公里: 0.090.110.110.140.200.230.230.320.320.34 0.360.360.380.490.560.590.590.670.690.79 公路客运量/万人:5126621777309145104601138712353157501830419836 21024194902043322598251073344236836405484292743462公路货运量/万吨: 1237137913851399166317141834432281328936 11099112031052411115133201676218673207242080321804影响公路客运量和公路货运量主要的三个因素是:该地区的人数、机动车数量和公路面积。 Matlab代码实现 %人数(单位:万人) numberOfPeople=[20.5522.4425.3727.1329.4530.1030.9634.0636.42 38.0939.1339.9941.9344.5947.3052.8955.7356.7659.1760.63]; %机动车数(单位:万辆) numberOfAutomobile=[0.60.750.850.91.051.351.451.61.71.852.15 2.2 2.25 2.35 2.5 2.6 2.7 2.85 2.95 3.1]; %公路面积(单位:万平方公里) roadArea=[0.090.110.110.140.200.230.230.320.320.340.360.360.38
介绍神经网络算法在机械结构优化中的应用的例子 (大家要学习的时候只需要把输入输出变量更改为你自己的数据既可以了,如果看完了还有问题的话可以加我微博“极南师兄”给我留言,与大家共同进步)。 把一个结构的8个尺寸参数设计为变量,如上图所示, 对应的质量,温差,面积作为输出。用神经网络拟合变量与输出的数学模型,首相必须要有数据来源,这里我用复合中心设计法则构造设计点,根据规则,八个变量将构造出81个设计点。然后在ansys workbench中进行81次仿真(先在proe建模并设置变量,将模型导入wokbench中进行相应的设置,那么就会自动的完成81次仿真,将结果导出来exceel文件) Matlab程序如下 P= [20 2.5 6 14.9 16.5 6 14.9 16.5 15 2.5 6 14.9 16.5 6 14.9 16.5 25 2.5 6 14.9 16.5 6 14.9 16.5 20 1 6 14.9 16.5 6 14.9 16.5 20 4 6 14.9 16.5 6 14.9 16.5 20 2.5 2 14.9 16.5 6 14.9 16.5 20 2.5 10 14.9 16.5 6 14.9 16.5 20 2.5 6 10 16.5 6 14.9 16.5 20 2.5 6 19.8 16.5 6 14.9 16.5 20 2.5 6 14.9 10 6 14.9 16.5 20 2.5 6 14.9 23 6 14.9 16.5 20 2.5 6 14.9 16.5 2 14.9 16.5 20 2.5 6 14.9 16.5 10 14.9 16.5 20 2.5 6 14.9 16.5 6 10 16.5 20 2.5 6 14.9 16.5 6 19.8 16.5 20 2.5 6 14.9 16.5 6 14.9 10 20 2.5 6 14.9 16.5 6 14.9 23 17.51238947 1.75371684 4.009911573 12.46214168 13.26610631 4.009911573 12.46214168 19.73389369 22.48761053 1.75371684 4.009911573 12.46214168 13.26610631 4.009911573 12.46214168 13.26610631 17.51238947 3.24628316 4.009911573 12.46214168 13.26610631 4.009911573
%% 清空环境变量 clc clear %% 训练数据预测数据提取及归一化 %下载四类语音信号 load data1 c1 load data2 c2 load data3 c3 load data4 c4 %四个特征信号矩阵合成一个矩阵 data(1:500,:)=c1(1:500,:); data(501:1000,:)=c2(1:500,:); data(1001:1500,:)=c3(1:500,:); data(1501:2000,:)=c4(1:500,:); %从1到2000间随机排序 k=rand(1,2000); [m,n]=sort(k); %输入输出数据 input=data(:,2:25); output1 =data(:,1); %把输出从1维变成4维 for i=1:2000 switch output1(i) case 1 output(i,:)=[1 0 0 0]; case 2 output(i,:)=[0 1 0 0]; case 3 output(i,:)=[0 0 1 0]; case 4 output(i,:)=[0 0 0 1]; end end %随机提取1500个样本为训练样本,500个样本为预测样本input_train=input(n(1:1500),:)'; output_train=output(n(1:1500),:)'; input_test=input(n(1501:2000),:)';
output_test=output(n(1501:2000),:)'; %输入数据归一化 [inputn,inputps]=mapminmax(input_train); %% 网络结构初始化 innum=24; midnum=25; outnum=4; %权值初始化 w1=rands(midnum,innum); b1=rands(midnum,1); w2=rands(midnum,outnum); b2=rands(outnum,1); w2_1=w2;w2_2=w2_1; w1_1=w1;w1_2=w1_1; b1_1=b1;b1_2=b1_1; b2_1=b2;b2_2=b2_1; %学习率 xite=0.1 alfa=0.01; %% 网络训练 for ii=1:10 E(ii)=0; for i=1:1:1500 %% 网络预测输出 x=inputn(:,i); % 隐含层输出 for j=1:1:midnum I(j)=inputn(:,i)'*w1(j,:)'+b1(j); Iout(j)=1/(1+exp(-I(j))); end % 输出层输出 yn=w2'*Iout'+b2; %% 权值阀值修正 %计算误差 e=output_train(:,i)-yn; E(ii)=E(ii)+sum(abs(e));