您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 管理学资料 > matlab神经网络
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=[targetstargetstargetstargets];forpass=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;fornoiselevel=noise_rangeerrors1=0;errors2=0;fori=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=[network1errors1/26/100];network2=[network2errors2/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=[01;01];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([01;01],8,.1);w=net.IW{1};plot(P(1,:),P(2,:),'+r');holdon;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([01;01],[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},net.layers{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([-11-11]);title('输入向量');xlabel('P(1)');ylabel('P(2)');net=newsom([01;01],[56]);claplotsom(net.IW{1,1},net.layers{1}.distances)axis([0101]);title('初始网络权值');xlabel('w(i,1)');ylabel('w(i,2)');net.trainParam.epochs=1;net=train(net,P);claplotsom(net.IW{1,1},net.layers{1}.distances)axis([-11-11]);title('训练后的网络');xlabel('w(i,1)');ylabel('w(i,2)');p=[0.5;0.3];a=sim(net,p)由于初始矩阵具有随机性,所以每次得到的结果存在一定的差异。4.lvq模式的分类网络设计P=[-3-2-20000223;01-121-1-21-10];C=[1112222111];T=ind2vec(C);i=1;clafori=1:10ifC(i)==1plot(P(1,i),P(2,i),'+')holdonelseplot(P(1,i),P(2,i),'o')holdonendendtitle('输入向量');xlabel('P(1)');ylabel('P(2)');net=newlvq(minmax(P),4,[.6.4],.1);holdonW1=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;clafori=1:10ifC(i)==1plot(P(1,i),P(2,i),'+')holdonelseplot(P(1,i),P(2,i),'o')holdonendendj=1;fori=1:4ifW2(j)==1plot(W1(j,1),W2(j,2),'+','markersize',15)holdonelseplot(W1(j,1),W2(j,2),'o','markerszie',15)holdonendendtitle('输入/权值向量');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.02970.37710.64500.66000.46090.1336-0.2013-0.4344-0.5000-0.39300-.16470.09880.30720.39600.34490.1816-0.0312-0.2189-0.3021];plot(P,T,'+');title('训练样本');xlab
本文标题:matlab神经网络
链接地址:https://www.777doc.com/doc-4369342 .html