GRNN神经网络---广义回归神经网络,主要用于函数逼近。x=-2:0.01:1y=2*x.^6+3*x.^5-3*x.^3+x.^2+1P=x(1:15:end)T=y(1:15:end)spread=[0.050.20.40.60.8];l_style={'r.-','bo--','ko-.','k*--','r^-'};fori=1:length(spread)net=newgrnn(P,T,spread(i));a=sim(net,P);plot(P,a,l_style{i})holdonendplot(P,T,'o');legend('spread=0.05','spread=0.2','spread=0.4','spread=0.6','spread=0.8','traindata');title('GRNN神经网络spread探讨')loaddata;%载入数据并将数据分成训练和预测两类p_train=p(1:10,:);p_test=p(11:13,:);t_train=t(1:10,:);t_test=t(11:13,:);%将各个矩阵转置以便适应网络结构p_train=p_train';t_train=t_train';p_test=p_test';t_test=t_test';%将数据归一化[pn,minp,maxp,tn,mint,maxt]=premnmx(p_train,t_train);p2n=tramnmx(p_test,minp,maxp);forsc=0.1:0.01:1;tic,net=newgrnn(pn,tn,sc);sctocOut=sim(net,p2n);a2=postmnmx(Out,mint,maxt);e=t_test-a2';perf=mse(e);Y=sim(net,pn);a3=postmnmx(Y,mint,maxt);ep=a3-t_train;perfp=mse(ep);holdon;figure(1);title('网络的预测误差')plot(sc,perf,'g:*');holdon;figure(2);title('网络的逼近误差')plot(sc,perfp,'r:*');end%通用感应器神经网络。P=[-0.5-0.50.3-0.1-40;-0.50.5-0.5150];%输入向量T=[11001];%期望输出plotpv(P,T);%描绘输入点图像net=newp([-401;-150],1);%生成网络,其中参数分别为输入向量的范围和神经元感应器数量holdonlinehandle=plotpc(net.iw{1},net.b{1});net.adaptparam.passes=3;fora=1:25%训练次数[net,Y,E]=adapt(net,P,T);linehandle=plotpc(net.iw{1},net.b{1},linehandle);drawnow;end%通用newlin程序%通用线性网络进行预测time=0:0.025:5;T=sin(time*4*pi);Q=length(T);P=zeros(5,Q);%P中存储信号T的前5(可变,根据需要而定)次值,作为网络输入。P(1,2:Q)=T(1,1:(Q-1));P(2,3:Q)=T(1,1:(Q-2));P(3,4:Q)=T(1,1:(Q-3));P(4,5:Q)=T(1,1:(Q-4));P(5,6:Q)=T(1,1:(Q-5));plot(time,T)%绘制信号T曲线xlabel('时间');ylabel('目标信号');title('待预测信号');net=newlind(P,T);%根据输入和期望输出直接生成线性网络a=sim(net,P);%网络测试figure(2)plot(time,a,time,T,'+')xlabel('时间');ylabel('输出-目标+');title('输出信号和目标信号');e=T-a;figure(3)plot(time,e)holdonplot([min(time)max(time)],[00],'r:')%可用plot(x,zeros(size(x)),'r:')代替holdoffxlabel('时间');ylabel('误差');title('误差信号');%通用BP神经网络P=[-1-122;0505];t=[-1-111];net=newff(minmax(P),[3,1],{'tansig','purelin'},'traingd');%输入参数依次为:'样本P范围',[各层神经元数目],{各层传递函数},'训练函数'%训练函数traingd--梯度下降法,有7个训练参数.%训练函数traingdm--有动量的梯度下降法,附加1个训练参数mc(动量因子,缺省为0.9)%训练函数traingda--有自适应lr的梯度下降法,附加3个训练参数:lr_inc(学习率增长比,缺省为1.05;%lr_dec(学习率下降比,缺省为0.7);max_perf_inc(表现函数增加最大比,缺省为1.04)%训练函数traingdx--有动量的梯度下降法中赋以自适应lr的方法,附加traingdm和traingda的4个附加参数%训练函数trainrp--弹性梯度下降法,可以消除输入数值很大或很小时的误差,附加4个训练参数:%delt_inc(权值变化增加量,缺省为1.2);delt_dec(权值变化减小量,缺省为0.5);%delta0(初始权值变化,缺省为0.07);deltamax(权值变化最大值,缺省为50.0)%适合大型网络%训练函数traincgf--Fletcher-Reeves共轭梯度法;训练函数traincgp--Polak-Ribiere共轭梯度法;%训练函数traincgb--Powell-Beale共轭梯度法%共轭梯度法占用存储空间小,附加1训练参数searchFcn(一维线性搜索方法,缺省为srchcha);缺少1个训练参数lr%训练函数trainscg--量化共轭梯度法,与其他共轭梯度法相比,节约时间.适合大型网络%附加2个训练参数:sigma(因为二次求导对权值调整的影响参数,缺省为5.0e-5);%lambda(Hessian阵不确定性调节参数,缺省为5.0e-7)%缺少1个训练参数:lr%训练函数trainbfg--BFGS拟牛顿回退法,收敛速度快,但需要更多内存,与共轭梯度法训练参数相同,适合小网络%训练函数trainoss--一步正割的BP训练法,解决了BFGS消耗内存的问题,与共轭梯度法训练参数相同%训练函数trainlm--Levenberg-Marquardt训练法,用于内存充足的中小型网络net=init(net);net.trainparam.epochs=300;%最大训练次数(前缺省为10,自trainrp后,缺省为100)net.trainparam.lr=0.05;%学习率(缺省为0.01)net.trainparam.show=50;%限时训练迭代过程(NaN表示不显示,缺省为25)net.trainparam.goal=1e-5;%训练要求精度(缺省为0)%net.trainparam.max_fail最大失败次数(缺省为5)%net.trainparam.min_grad最小梯度要求(前缺省为1e-10,自trainrp后,缺省为1e-6)%net.trainparam.time最大训练时间(缺省为inf)[net,tr]=train(net,P,t);%网络训练a=sim(net,P)%网络仿真%通用径向基函数网络——%其在逼近能力,分类能力,学习速度方面均优于BP神经网络%在径向基网络中,径向基层的散步常数是spread的选取是关键%spread越大,需要的神经元越少,但精度会相应下降,spread的缺省值为1%可以通过net=newrbe(P,T,spread)生成网络,且误差为0%可以通过net=newrb(P,T,goal,spread)生成网络,神经元由1开始增加,直到达到训练精度或神经元数目最多为止%GRNN网络,迅速生成广义回归神经网络(GRNN)P=[456];T=[1.53.66.7];net=newgrnn(P,T);%仿真验证p=4.5;v=sim(net,p)%PNN网络,概率神经网络P=[00;11;03;14;31;41;43]';Tc=[1122333];%将期望输出通过ind2vec()转换,并设计、验证网络T=ind2vec(Tc);net=newpnn(P,T);Y=sim(net,P);Yc=vec2ind(Y)%尝试用其他的输入向量验证网络P2=[14;01;52]';Y=sim(net,P2);Yc=vec2ind(Y)%应用newrb()函数构建径向基网络,对一系列数据点进行函数逼近P=-1:0.1:1;T=[-0.9602-0.5770-0.07290.37710.64050.66000.4609...0.1336-0.2013-0.4344-0.500-0.3930-0.1647-0.0988...0.30720.39600.34490.1816-0.0312-0.2189-0.3201];%绘制训练用样本的数据点plot(P,T,'r*');title('训练样本');xlabel('输入向量P');ylabel('目标向量T');%设计一个径向基函数网络,网络有两层,隐层为径向基神经元,输出层为线性神经元%绘制隐层神经元径向基传递函数的曲线p=-3:.1:3;a=radbas(p);plot(p,a)title('径向基传递函数')xlabel('输入向量p')%隐层神经元的权值、阈值与径向基函数的位置和宽度有关,只要隐层神经元数目、权值、阈值正确,可逼近任意函数%例如a2=radbas(p-1.5);a3=radbas(p+2);a4=a+a2*1.5+a3*0.5;plot(p,a,'b',p,a2,'g',p,a3,'r',p,a4,'m--')title('径向基传递函数权值之和')xlabel('输入p');ylabel('输出a');%应用newrb()函数构建径向基网络的时候,可以预先设定均方差精度eg以及散布常数sceg=0.02;sc=1;%其值的选取与最终网络的效果有很大关系,过小造成过适性,过大造成重叠性net=newrb(P,T,eg,sc);%网络测试plot(P,T,'*')xlabel('输入');X=-1:.01:1;Y=sim(net,X);holdonplot(X,Y);holdofflegend('目标','输出')%应用grnn进行函数逼近P=[12345678];T=[01232121];plot(P,T,'.','markersize',30)axis([09-14])title('待逼近函数')xlabel('P')ylabel('T')%网络设计%对于离散数据点,散布常数spread选取比输入向量之间的距离稍小一些spread=0.7;net=newgrnn(P,T,spread);%网络测试A=sim(net,P);holdonoutputline=plot(P,A,'o','markersize',10,'color',[100]);title('检测网络')xlabel('P')ylabel('T和A')%应用pnn进行变量的分类P=[12;22;11];%输入向量Tc=[123];%P对应的三个期望输出%绘制出输入向量及其相对应的类别plot(P(1,:),P(2,:),'.','markersize',30)fori=1:3text(P(1,i)+0.1,P(2,i),sprintf('class%g',Tc(i)))endaxis([0303]);title('三向量及其类别')xlabel('P(1,:)')ylabel('P(2,:)