您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 项目/工程管理 > 三个输入一个输出的人工神经网络编程
三个输入一个输出的人工神经网络编程,隐含层为单隐层,为BP算法MATLAB写的:(输入输出隐层节点数都可以改的)clearallinputnums=3;%输入层节点outputnums=1;%输出层节点hidenums=7;%隐层节点maxcount=50000;%最大迭代次数samplenum=19;%一个计数器,无意义precision=0.00001;%预设精度yyy=1.3;%yyy是帮助网络加速走出平坦区alpha=0.02;%学习率设定值a=0.9;%BP优化算法的一个设定值,对上组训练的调整值按比例修改error=zeros(1,maxcount+1);%error数组初始化;目的是预分配内存空间errorp=zeros(1,samplenum);%同上v=rand(inputnums,hidenums);%1*10;v初始化为一个1*10的随机归一矩阵;v表输入层到隐层的权值deltv=zeros(inputnums,hidenums);%1*10;内存空间预分配dv=zeros(inputnums,hidenums);%1*10;w=rand(hidenums,outputnums);%10*1deltw=zeros(hidenums,outputnums);%10*1dw=zeros(hidenums,outputnums);%10*1samplelist=1:0.5:10;%样本输入值expectlist=samplelist.^(-1);%期望输出值%expectlist=exp(-samplelist);[samplelist,minp,maxp]=premnmx(samplelist);%[expectlist,mint,maxt]=premnmx(expectlist);count=1;while(count=maxcount)%结束条件1迭代20000次c=1;while(c=samplenum)fork=1:outputnumsd(k)=expectlist(c);%获得期望输出的向量endfori=1:inputnumsx(i)=samplelist(c);%获得输入的向量数据end%forward();forj=1:hidenumsnet=0.0;fori=1:inputnumsnet=net+x(i)*v(i,j);%输入层到隐层的加权和endy(j)=1/(1+exp(-net));%输出层处理f(x)=1/(1+exp(-x)),单极性sigmiod函数%y(j)=1/net;%输出层处理f(x)=1/(1+exp(-x)),单极性sigmiod函数endfork=1:outputnumsnet=0.0;forj=1:hidenumsnet=net+y(j)*w(j,k);endifcount=2&&error(count)-error(count-1)=0.0001o(k)=1/(1+exp(-net)/yyy);%平坦区加大学习率%o(k)=1/(net/yyy);%平坦区加大学习率elseo(k)=1/(1+exp(-net));%同上%elseo(k)=1/net;%同上endend%BpError(c)反馈/修改errortmp=0.0;fork=1:outputnumserrortmp=errortmp+(d(k)-o(k))^2;%第一组训练后的误差计算enderrorp(c)=0.5*errortmp;%误差E=∑(d(k)-o(k))^2*1/2%end%backward();fork=1:outputnumsyitao(k)=(d(k)-o(k))*o(k)*(1-o(k));%输出层误差偏导endforj=1:hidenumstem=0.0;fork=1:outputnumstem=tem+yitao(k)*w(j,k);%为了求隐层偏导,而计算的求和endyitay(j)=tem*y(j)*(1-y(j));%隐层偏导end%调整各层权值forj=1:hidenumsfork=1:outputnumsdeltw(j,k)=alpha*yitao(k)*y(j);%权值w的调整量deltw(已乘学习率)w(j,k)=w(j,k)+deltw(j,k)+a*dw(j,k);%权值调整,这里的dw=deltw(t-1),实际是对BP算法的一个改进措施--增加动量项目的是提高训练速度dw(j,k)=deltw(j,k);endendfori=1:inputnumsforj=1:hidenumsdeltv(i,j)=alpha*yitay(j)*x(i);%同上deltwv(i,j)=v(i,j)+deltv(i,j)+a*dv(i,j);dv(i,j)=deltv(i,j);endendc=c+1;end%第二个while结束;表示一次BP训练结束doubletmp;tmp=0.0;fori=1:samplenumtmp=tmp+errorp(i)*errorp(i);%误差求和endtmp=tmp/c;error(count)=sqrt(tmp);%误差求均方根,即精度if(error(count)precision)%求另一个结束条件break;endcount=count+1;%训练次数加1end%第一个while结束error(maxcount+1)=error(maxcount);p=1:count-1;plot(p,error(p),'-');%显示误差p=1:1:10;t=p.^(-1);%t=exp(-p);[pn,minpn,maxpn]=premnmx(p);simt=zeros(1,10);%while(a=9)fori=1:10x=pn(i);%获得输入的向量数据forj=1:hidenumsnet=0.0;net=net+x*v(1,j);%输入层到隐层的加权和y(j)=1/(1+exp(-net));%输出层处理f(x)=1/(1+exp(-x)),单极性sigmiod函数%y(j)=1/net;%输出层处理f(x)=1/(1+exp(-x)),单极性sigmiod函数endnet=0.0;fork=1:hidenumsnet=net+y(k)*w(k,1);endo=1/(1+exp(-net));simt(i)=o;end%simt=postmnmx(simt,mint,maxt);figure;plot(p,t,'*',p,simt,'-');clcclearall%%FFT采样fs=3200;N=64;%采样频率和数据点数n=0:N-1;t=n/fs;%时间序列x=0.8*sin(4.5*2*pi*50*t+pi/4)+0.3*sin(2*2*pi*50*t+pi/5);%信号y=fft(x,N);%对信号进行快速Fourier变换f=fs*(0:length(y)/2)/length(y);z=angle(y)*180/pi;mag=abs(y);fz=mag(1:length(y)/2+1)*2/N;%求得Fourier变换后的振幅figure(1)plot(f,fz);%绘出Nyquist频率之前随频率变化的振幅xlabel('频率/Hz');ylabel('振幅');title('FFT采样');gridon;%%BP神经网络初始化inputNums=1;%输入层节点outputNums=1;%输出层节点hideNums=4;%隐层节点maxcount=3000;%最大迭代次数sampleNums=N;precision=1e-9;%预设精度xxl1=0.02;xxl2=250;count=1;error=zeros(1,count);errorp=zeros(1,sampleNums);w1=rand(inputNums,hideNums/2);w2=rand(inputNums,hideNums/2);b=[1*pi*200,1*pi*120];%%BP神经网络训练while(count=maxcount)c=1;while(c=sampleNums)forj=1:hideNums/2net1(j)=cos(b(j)*t(c));net2(j)=sin(b(j)*t(c));endforj=1:hideNums/2out(j)=net1(j)*w1(j)+net2(j)*w2(j);endsc(c)=sum(out);errortmp=0.0;errortmp=errortmp+(x(c)-sc(c))^2;e(c)=x(c)-sc(c);errorp(c)=0.5*errortmp;fori=1:hideNums/2dw1(i)=xxl1*e(c)*net1(i);dw2(i)=xxl1*e(c)*net2(i);db(i)=xxl2*e(c)*t(c)*(-w1(i)*net2(i)+w2(i)*net1(i));endfork=1:hideNums/2w1(k)=w1(k)+dw1(k);w2(k)=w2(k)+dw2(k);b(k)=b(k)+db(k);endc=c+1;enddoubletmp;tmp=0.0;fori=1:sampleNumstmp=tmp+errorp(i)*errorp(i);endtmp=tmp/c;error(count)=sqrt(tmp);if(error(count)precision)break;endcount=count+1;end%%误差精度曲线figure(2)p=1:count;plot(p,error(p),'-')xlabel('迭代次数');ylabel('误差');title('BP误差曲线');%%谐波分析结果fori=1:hideNums/2Amp(i)=sqrt(w1(i)^2+w2(i)^2);Phase(i)=atan(w1(i)/w2(i))/pi*180;HFre(i)=b(i)/2/pi;endAmpPhaseHFre%%
本文标题:三个输入一个输出的人工神经网络编程
链接地址:https://www.777doc.com/doc-1650699 .html