您好,欢迎访问三七文档
Rbf神经网络算法之JAVA实现packagecom.mfsoft.ai.algorithm.imp;publicclassRbfNetextendsObject{intinNum;//输入接点数inthideNum;//隐含接点数intoutNum;//输出接点数doublec[][];//重心doubled[];//距离(歪)intepochs;doublex[];//输入向量doublex1[];//隐含接点状态值doublex2[];//输出接点状态值doubleo1[];doubleo2[];doublew[][];//隐含接点权值doublew1[][];//输出接点权值doublerate_w;//权值学习率(输入层-隐含层)doublerate_w1;//权值学习率(隐含层-输出层)doublerate_b1;//隐含层阀值学习率doublerate_b2;//输出层阀值学习率doubleb1[];//隐含接点阀值doubleb2[];//输出接点阀值doublepp[];doubleqq[];doubleyd[];doublee;doublein_rate;//输入归一化比例系数publicRbfNet(intinNum,inthideNum,intoutNum,doublep[][]){in_rate=1.0;//输入归一化系数/*doublepmax=0.0;for(intisamp=0;isampp.length;isamp++){for(inti=0;iinNum;i++){if(Math.abs(p[isamp])pmax)pmax=Math.abs(p[isamp]);}}//endforisampin_rate=pmax;for(intisamp=0;isampp.length;isamp++){for(inti=0;iinNum;i++)p[isamp]=p[isamp]/in_rate;}//endforisamp*/LbgNetlbg=newLbgNet(p,hideNum);c=lbg.getc();d=lbg.getd();this.epochs=500;this.inNum=inNum;this.hideNum=hideNum;this.outNum=outNum;x=newdouble[inNum];//输入向量x1=newdouble[hideNum];//隐含接点状态值x2=newdouble[outNum];//输出接点状态值o1=newdouble[hideNum];o2=newdouble[outNum];w=newdouble[inNum][hideNum];//隐含接点权值w1=newdouble[hideNum][outNum];//输出接点权值b1=newdouble[hideNum];//隐含接点阀值b2=newdouble[outNum];//输出接点阀值pp=newdouble[hideNum];qq=newdouble[outNum];yd=newdouble[outNum];rate_w=0.05;//权值学习率(输入层-隐含层)rate_w1=0.05;//权值学习率(隐含层-输出层)rate_b1=0.05;//隐含层阀值学习率rate_b2=0.05;//输出层阀值学习率e=0.0;for(inti=0;iinNum;i++)for(intj=0;jhideNum;j++)w[j]=1.0;for(inti=0;ihideNum;i++)for(intj=0;joutNum;j++)w1[j]=1.0;}/**********************************//*****RBF神经控制器算法训练函数*****/publicvoidtrain(doublep[][],doublet[][],intsamplenum){e=0.0;for(intisamp=0;isampsamplenum;isamp++)//循环训练一次样本{for(inti=0;iinNum;i++)//构造每个样本的输入和输出标准//x=p[isamp]/in_rate;x=p[isamp];for(inti=0;ioutNum;i++)yd=t[isamp];for(intj=0;jhideNum;j++){o1[j]=0.0;for(inti=0;iinNum;i++)o1[j]=o1[j]+(w[j]*x-c[j])*(w[j]*x-c[j]);x1[j]=Math.exp(-o1[j]/(2*d[j]*d[j]));}for(intk=0;koutNum;k++){o2[k]=0.0;for(intj=0;jhideNum;j++)o2[k]=o2[k]+w1[j][k]*x1[j];x2[k]=o2[k];//System.out.println(String.valueOf(x2[k]));}//System.out.println(ok1);for(intk=0;koutNum;k++){qq[k]=(yd[k]-x2[k])*x2[k];e+=Math.abs(yd[k]-x2[k])*Math.abs(yd[k]-x2[k]);//计算均方差//System.out.println(String.valueOf(e));for(intj=0;jhideNum;j++)w1[j][k]=w1[j][k]+rate_w1*qq[k]*x1[j];//System.out.println(String.valueOf(x2[0]));}}//endisamp样本循环e=Math.sqrt(e);}//endtrain/***************************************//*****RBF神经控制器算法模拟计算函数*****/publicdouble[]sim(doublepsim[]){for(inti=0;iinNum;i++)//x=psim/in_rate;x=psim;for(intj=0;jhideNum;j++){o1[j]=0.0;for(inti=0;iinNum;i++)o1[j]=o1[j]+(w[j]*x-c[j])*(w[j]*x-c[j]);x1[j]=Math.exp(-o1[j]/(2*d[j]*d[j]));}for(intk=0;koutNum;k++){o2[k]=0.0;for(intj=0;jhideNum;j++)o2[k]=o2[k]+w1[j][k]*x1[j];x2[k]=o2[k];}returnx2;}//endsim}//endRBFclass**说明:同一数学方法的c版神经网络可以精确收敛,但是这个java就是不收敛*不明白呜呜我觉得是过中的数据类型转换了,精度改变所以影响收敛或者其他!*我觉得java不太适合做计算型的代码效率不太高!!个人觉得~~而且我java跟c差不多所以没什么特别!*学着玩玩!!不能理解个中数学原理只知道数学方法!!*//**说明此算法是基于BP型反馈神经网络10个输入神经元,5个隐藏神经元,3个输出神经元teachers[][]数组为教师数组是输出的期望值inputsarr[]数值为输入值,为测试方便,先把要输入的放在数组里面*/importjava.lang.Math;importjava.util.*;publicclassSjwlsf{staticintIN_MUN=10;//输入层神经元数目staticintHideN=5;//隐层神经元数目,前馈网络隐藏层staticintOutN=3;//输出层神经元数模,各个命令的开关阀staticintN=5;staticdoubleWeight_In_Hide[][]=newdouble[HideN][IN_MUN];//输入层至隐层权值staticdoubleV_Hide_Out[][]=newdouble[OutN][HideN];//隐层至输出层权值staticdoubleYU_HN[]=newdouble[HideN];//隐层的阈值staticdoubleYU_ON[]=newdouble[OutN];//输出层的阈值staticdoubleX[]=newdouble[HideN];//隐层的输入,各个隐藏层的神经单元的内积staticdoubleY[]=newdouble[OutN];//输出层的输入,各个输出层的神经单元的内积staticdoubleH[]=newdouble[HideN];//隐层的输出,s型函数之后的输出值staticdoubleO[]=newdouble[OutN];//输出层的输出,s型函数之后的输出值staticdoublealpha;//动量因子,改进型bp算法使用staticdoubleerr_m[]=newdouble[N];//第m个样本的总误差staticdoublea;//输出层至隐层学习效率staticdoubleb;//隐层至输入层学习效率staticdoubled_err[]=newdouble[OutN];//δk隐藏层到输出层的误差staticdoublee_err[]=newdouble[HideN];//δj输入层到隐藏层的误差staticdoubleold_W[][]=newdouble[HideN][IN_MUN];//新旧权值更新量交替--改进型Bp算法staticdoubleold_V[][]=newdouble[OutN][HideN];staticdoubleteach[]=newdouble[OutN];//教师样本staticdoubleinput[]=newdouble[IN_MUN];//学生样本staticdoubleteachers[][]={{0.1f,0.1f,0.1f},{0.1f,0.1f,0.9f},{0.1f,0.9f,0.1f},{0.1f,0.9f,0.9f},{0.9f,0.1f,0.1f},{0.9f,0.1f,0.9f},{0.9f,0.9f,0.1f},{0.9f,0.9f,0.9f}};staticdoubleinputsarr[]={1f,0f,0f,1f,1f,0f,0f,1f,1f,0f};//学生标本/**获取教师样本方法*/publicbooleanget_teach(inttm){if(tm0&&tm9){for(inti=0;iOutN;i++)teach[i]=teachers[tm][i];returntrue;}elsereturnfalse;}/**学生样本初始化*/publicbooleanget_pup(){for(inti=0;iIN_MUN;i++)input[i]=inputsarr[i];returntrue;}/**初始化权、阈值子程序*/publicbooleaninitial(){/*初始化输入层到隐层的权值,随机模拟0.5~-0.5*/for(intx=0;xHideN;x++){for(intq=0;qIN_MUN;q++){Weight_In_Hide[x][q]=(double)(Math.random()-0.5);}}/*初始化隐层到输出层的权值,随机模拟0.5~-0.5*/for(intxx=0;xxOutN;xx++){for(intqq=0;qqHideN;qq++){V_Hide_Out[xx][qq]=(double)(Math.random()-0.5);}}/*隐层阈值初始化*/for(intz=0;zHideN;z++)
本文标题:Java版神经网络
链接地址:https://www.777doc.com/doc-4483898 .html