BP演算法-於師兄用java語言寫的

來源:互聯網
上載者:User

//BP神經網路演算法實現</p><p>#include <stdio.h><br />#include <math.h><br />#include <conio.h><br />#include <stdlib.h></p><p>#define nh 3/*輸入層*/<br />#define ni 4/*隱層*/<br />#define nj 1 /*輸出層*/<br />#define nk 100 /*樣本容量*/<br />#define test 70 /*測試集容量*/<br />#define nr 0.7 /*學習效率*/<br />#define EPS 0.00001</p><p>float x[nk][nh],d[nk][nj],whi[nh][ni],wij[ni][nj],thi[ni],thj[nj];<br />int h,i,j,k,ff;<br />float xmin[nh],xmax[nh],dmin[nj],dmax[nj];<br />FILE *fp1,*fp2,*fp3,*fp4; </p><p>void init(void);<br />void startleaning(void);<br />void testsample(void);<br />void readw(void);<br />void readt(void);<br />void writew(void);<br />float sigmoid(float a);<br />double ranu(void);<br />char filename1[]={"samplefile.txt"};</p><p>void init(void)<br />{<br />int min,max;<br />if(fp1==0)<br />{<br />system("cls");<br />printf("Can not find the learning sample file!/n");<br />exit(0);<br />}<br />for(k=0;k<nk;k++)<br />{<br />for(h=0;h<nh;h++)<br />fscanf(fp1,"%f,",&x[k][h]); //神經網路輸入<br />for(j=0;j<nj;j++)<br />fscanf(fp1,"%f,",&d[k][j]); //神經網路輸出<br />}<br />for(h=0;h<nh;h++)<br />{<br />min=1;<br />max=1;<br />for(k=0;k<nk;k++)<br />{<br />if(x[k][h]<x[min][h]) min=k;<br />if(x[k][h]>x[max][h]) max=k;<br />}<br />xmin[h]=x[min][h];<br />xmax[h]=x[max][h];<br />for(k=0;k<nk;k++) /*神經網路輸入歸一化*/<br />x[k][h]=(x[k][h]-xmin[h])/(xmax[h]-xmin[h]);<br />/*x[k][h]=x[k][h]/xmax[h];*/<br />}<br />for(j=0;j<nj;j++)<br />{<br />min=1;max=1;<br />for(k=0;k<nk;k++)<br />{<br />if(d[k][j]<d[min][j])<br />min=k;<br />if(d[k][j]>d[max][j])<br />max=k;<br />}<br />dmin[j]=d[min][j];<br />dmax[j]=d[max][j];<br />for(k=0;k<nk;k++)/*神經網路輸出歸一化*/<br />d[k][j]=(d[k][j]-dmin[j])/(dmax[j]-dmin[j]);<br />/*d[k][j]=d[k][j]/dmax[j];*/<br />}<br />}<br />/*----------------------------------------------------*/<br />void startlearning(void)<br />{<br />long int nt,n;<br />float t,error[nk],gerror,xj[nj],xi[ni],yj[nj],yi[ni],pxi[ni],pxj[nj];<br />float u0=0,u1=0,u2=0,u3=0;<br />float v0,v1,v2,v3;</p><p>for(i=0;i<ni;i++)<br />{<br />for(h=0;h<nh;h++)<br />whi[h][i]=-0.8+1.6*ranu();<br />for(j=0;j<nj;j++)<br />wij[i][j]=-0.8+1.6*ranu();</p><p>thi[i]=-0.5+ranu();<br />}<br />for(j=0;j<nj;j++)<br />thj[j]=-0.5+ranu();<br />fp2=fopen("w.txt","w+");/*權值、閾值初始化*/</p><p>/*學習開始*/<br />printf("/t/nPlease enter the learning times:/n");<br />scanf("%ld",&nt);<br />for(n=0;n<nt;n++)/*學習次數*/<br />{<br />gerror=0;<br />for(k=0;k<nk;k++)/*單樣本迴圈*/<br />{<br />for(i=0;i<ni;i++)<br />{<br />t=0;<br />for(h=0;h<nh;h++)<br />t+=whi[h][i]*x[k][h];<br />xi[i]=t+thi[i];<br />yi[i]=sigmoid(xi[i]); /*隱層輸出*/<br />}<br />for(j=0;j<nj;j++)<br />{<br />t=0;<br />for(i=0;i<ni;i++)<br />t+=wij[i][j]*yi[i];<br />xj[j]=t+thj[j];<br />yj[j]=sigmoid(xj[j]);<br />} /*輸出層輸出*/</p><p>for(j=0;j<nj;j++)/*輸出層單樣本點誤差變動率*/<br />pxj[j]=yj[j]*(1-yj[j])*(yj[j]-d[k][j]);<br />for(i=0;i<ni;i++)/*隱層單樣本點誤差變動率*/<br />{<br />t=0;<br />for(j=0;j<nj;j++)<br />t+=pxj[j]*wij[i][j];<br />pxi[i]=yi[i]*(1-yi[i])*t;<br />}<br />for(j=0;j<nj;j++)<br />{<br />// thj[j]=thj[j]-nr*pxj[j];<br />v0=thj[j];<br />thj[j]=thj[j]-0.7*nr*pxj[j]+0.3*u0;<br />// thj[j]=thj[j]-nr*pxj[j];<br />u0=thj[j]-v0;<br />for(i=0;i<ni;i++)<br />{<br />v1=wij[i][j];<br />wij[i][j]=wij[i][j]-0.7*nr*pxj[j]*yi[i]+0.3*u1;<br />u1=wij[i][j]-v1;<br />//wij[i][j]=wij[i][j]-nr*pxj[j]*yi[i]; /*隱層到輸出層權值修正,其中nr為步長*/<br />}<br />}<br />for(i=0;i<ni;i++)<br />{<br />v2=thi[i];<br />thi[i]=thi[i]-0.7*nr*pxi[i]+0.3*u2;<br />u2=thi[i]-v2;<br />// thi[i]=thi[i]-nr*pxi[i];<br />for(h=0;h<nh;h++)<br />{<br />v3=whi[h][i];<br />whi[h][i]=whi[h][i]-0.7*nr*pxi[i]*x[k][h]+0.3*u3;<br />u3=whi[h][i]-v3;<br />//whi[h][i]=whi[h][i]-nr*pxi[i]*x[k][h]; /*輸入層到隱層權值修正,其中nr為步長*/<br />}<br />}<br />t=0;<br />for(j=0;j<nj;j++)<br />t+=(yj[j]-d[k][j])*(yj[j]-d[k][j])/2.0;<br />error[k]=t;<br />gerror+=error[k];/*全域誤差 g(lobal)error*/<br />}<br />/*單樣本迴圈結束*/ </p><p>if(gerror<EPS)<br />break;<br />}<br />/* 學習迴圈結束*/<br />printf("%f,%f,%f,%f,%f,%f",thi[0],thj[0],wij[0][0],wij[0][1],whi[1][0],whi[0][1]);<br />writew();<br />printf("/t/nGlobal error=%f/n",gerror);<br />printf("/t/nAre you satisfied with the global error?/n");<br />printf("Press any key to choose a next task!/n");<br />getch();<br />}<br />/*-------------------------------------------------*/<br />void testsample(void)<br />{<br />float tx[nh],t,xj[nj],xi[ni],yj[nj],yi[ni];<br />if(fp2==0)<br />{<br />// clrscr();<br />printf("/t/ncan not find the weight file:w.txt/n");<br />exit(0);<br />}<br />readw(); </p><p>for(ff=0;ff<test;ff++) /*測試樣本預測、結果儲存*/<br />{<br />for(h=0;h<nh;h++)<br />fscanf(fp3,"%f,",&tx[h]);<br />for(h=0;h<nh;h++)<br />tx[h]=(tx[h]-xmin[h])/(xmax[h]-xmin[h]); /*歸一化處理*/<br />for(i=0;i<ni;i++)<br />{<br />t=0;<br />for(h=0;h<nh;h++)<br />t+=whi[h][i]*tx[h];<br />xi[i]=t+thi[i];<br />yi[i]=sigmoid(xi[i]);<br />}<br />for(j=0;j<nj;j++)<br />{<br />t=0;<br />for(i=0;i<ni;i++)<br />t+=wij[i][j]*yi[i];<br />xj[j]=t+thj[j];<br />yj[j]=sigmoid(xj[j]);<br />}<br />// printf("/t/nNetwork output:/n"); /*正向預測*/<br />for(j=0;j<nj;j++) /*儲存結果*/<br />{<br />yj[j]=yj[j]*(dmax[j]-dmin[j])+dmin[j];<br />fprintf(fp4,"%f/n",yj[j]);<br />}<br />// tx[nh-1]=yj[0];<br />//rewind(fp4);<br />// for(h=0;h<nh;h++) /*測試樣本輸入*/<br />// fscanf(fp3,"%f,",&tx[h]);<br /> }</p><p> printf("/t/nAre you satisfied with the output?/n");<br /> printf("Press any key to choose a next task!/n");<br /> getch();<br />}<br />/*----------------------------------------------*/<br />void writew(void)<br />{<br />rewind(fp2);<br />for(h=0;h<nh;h++)<br /> {<br /> for(i=0;i<ni;i++)<br /> fprintf(fp2,"%8.3f ",whi[h][i]);<br /> fprintf(fp2,"/n");<br /> }<br />fprintf(fp2,"/n"); </p><p>for(i=0;i<ni;i++)<br /> fprintf(fp2,"%8.3f ",thi[i]);<br />fprintf(fp2,"/n/n"); </p><p>for(j=0;j<nj;j++)<br /> {<br /> for(i=0;i<ni;i++)<br /> fprintf(fp2,"%8.3f ",wij[i][j]);<br /> fprintf(fp2,"/n");<br /> }<br />fprintf(fp2,"/n");<br />for(j=0;j<nj;j++)<br /> fprintf(fp2,"%8.3f ",thj[j]);<br />}<br />/*------------------------------------------------*/<br />void readw(void)<br />{<br />for(h=0;h<nh;h++)<br /> for(i=0;i<ni;i++)<br /> fscanf(fp2,"%f",&whi[h][i]);<br />for(i=0;i<ni;i++)<br /> fscanf(fp2,"%f",&thi[i]);<br />for(j=0;j<nj;j++)<br /> for(i=0;i<ni;i++)<br /> fscanf(fp2,"%f",&wij[i][j]);<br />for(j=0;j<nj;j++)<br /> fscanf(fp2,"%f",&thj[j]);<br />}<br />/*--------------------------------*/<br />float sigmoid(float a)<br />{<br />return (1.0/(1+exp(-a)));<br />}<br />/*--------------------------------*/<br />double ranu(void)<br />{<br />static double xrand=3.0;<br />double m=8589934592.0, a=30517578125.0;<br />lp: xrand=fmod(xrand*a,m); /*整除取餘*/<br /> if(xrand>1.0)<br /> return(xrand/m);<br /> else<br /> {<br /> xrand=1.0;<br /> goto lp;<br /> }<br />}<br />/*----------------------------------*/ </p><p>void main()<br />{<br />fp1=fopen("sample.txt","r");<br />fp2=fopen("w.txt","r+");<br />fp3=fopen("test.txt","r+");<br />fp4=fopen("testre.txt","r+");<br />init();<br /> while(1)<br /> {<br /> system("cls");<br /> printf("/t/n Please choose a next task.../n/n");<br /> printf("/t/n (S) to start learning./n");<br /> printf("/t/n (T) to test samples./n");<br /> printf("/t/n (R) to resume learning./n");<br /> printf("/t/n (Q) quit./n");<br /> switch(getchar())<br /> {<br /> case 's': startlearning();break;<br /> case 't': testsample();break;<br /> case 'r': startlearning();break;<br /> case 'q': exit(0);break;<br /> }<br /> }<br />fclose(fp1);<br />fclose(fp2);<br />fclose(fp3);<br />fclose(fp4);<br />getch();<br />}<br />/*----------------By ahzhming@163.com海闊天空-------------------------*/<br />

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.