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:10P=[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_rangeerrors1=0;errors2=0;for i=1:max_testP=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;endnetwork1=[network1 errors1/26/100];network2=[network2 errors2/26/100];endplot(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]);claw=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},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]);claplotsom(net.IW{1,1},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);claplotsom(net.IW{1,1},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;clafor i=1:10if C(i)==1plot(P(1,i),P(2,i),'+')hold onelseplot(P(1,i),P(2,i),'o')hold onendendtitle('输入向量');xlabel('P(1)');ylabel('P(2)');net=newlvq(minmax(P),4,[.6 .4],.1);hold onW1=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;clafor i=1:10if C(i)==1plot(P(1,i),P(2,i),'+')hold onelseplot(P(1,i),P(2,i),'o')hold onendendj=1;for i=1:4if W2(j)==1plot(W1(j,1),W2(j,2),'+','markersize',15)hold onelseplot(W1(j,1),W2(j,2),'o','markerszie',15)hold onendendtitle('输入/权值向量');xlabel('P(1),W(1)');ylabel('P(2),W(2)');%对网络进行检验p=[0.2;1];a=vec2ind(sim(net,p))2010-7-23今天来看看径向基函数神经网络。