1、BP神经网络的C语言汇总2#include stdio.h#include stdlib.h#include time.h#include math.h/*inpoints 为输入神经元个数,可改变outpoints为输出神经元个数defaultpoints为隐层神经元个数datagrough为样本数据个数*以下数据定义可以修改*/#define A 0#define a 1#define b 1#define c 1#define ALFA 0.85 #define BETA 0.2 /学习率01#define Total 20000#define inpoints 9#define out
2、points 5#define defaultpoints 28#define datagrough 44#define forecastdata 4/*定义所需变量*/double InpointDatadatagroughinpoints,OutpointDatadatagroughoutpoints; /* 输入输出数据 */double InpointData_MAXinpoints,InpointData_MINinpoints; /* 每个因素最大数据 */double OutpointData_MAXoutpoints,OutpointData_MINoutpoints; /*
3、每个因素最小数据 */double wdefaultpointsinpoints,limendefaultpoints,voutpointsdefaultpoints; /* 连接权值、阈值 */double dlta_wdefaultpointsinpoints,dlta_limendefaultpoints,dlta_voutpointsdefaultpoints; /* 连接权、阈值修正值 */double defaultOutpointdefaultpoints,Outpoint_dpoutpoints,Outpoint_epdatagrough;/*读数据文件*/void ReadD
4、ata() FILE *fp1,*fp2; int i,j; if(fp1=fopen(D:data训练输入.txt,r)=NULL) printf(1can not open the filen); exit(0); for(i=0;idatagrough;i+) for(j=0;jinpoints;j+) fscanf(fp1,%lf,&InpointDataij); fclose(fp1); if(fp2=fopen(D:data训练输出.txt,r)=NULL) printf(2can not open the filen); exit(0); for(i=0;idatagrough;
5、i+) for(j=0;joutpoints;j+) fscanf(fp2,%lf,&OutpointDataij); fclose(fp2);/*/*归一化*/void unitary() int i,j; int k=0; for(j=0;jinpoints;j+) /找出每列的最大、最小值存放在数组InpointData_MAXj、InpointData_MINj中 InpointData_MAXj=InpointData0j; InpointData_MINj=InpointData0j; for(i=0;idatagrough;i+) if(InpointData_MAXjInpoi
6、ntDataij) InpointData_MINj=InpointDataij; for(j=0;joutpoints;j+) /找出每列的最大、最小值存放在数组OutpointData_MAXj、OutpointData_MINj中 OutpointData_MAXj=OutpointData0j; OutpointData_MINj=OutpointData0j; for(i=0;idatagrough;i+) if(OutpointData_MAXjOutpointDataij) OutpointData_MINj=OutpointDataij; /*将数据归一处理,处理之后的数据全部
7、在0,1之间*/ for(j=0;jinpoints;j+) for(i=0;idatagrough;i+) if(InpointData_MAXj=0) InpointDataij=0; else InpointDataij=(InpointDataij-InpointData_MINj+A)/(InpointData_MAXj-InpointData_MINj+A); for(j=0;joutpoints;j+) for(i=0;idatagrough;i+) if(OutpointData_MAXj=0) OutpointDataij=0; else OutpointDataij=(Ou
8、tpointDataij-OutpointData_MINj+A)/(OutpointData_MAXj-OutpointData_MINj+A);/*/*初始化,随机赋初值*/void Initialization() int i,j; srand(unsigned)time(NULL); /头文件名 #include for(i=0;idefaultpoints;i+) /给输入层到隐层的连接权赋随机值LianJie_wij,这些值在0,1 for(j=0;jinpoints;j+) wij=(rand()*2.0/RAND_MAX-1)/2; dlta_wij=0; for(i=0;id
9、efaultpoints;i+) limeni=(rand()*2.0/RAND_MAX-1)/2; dlta_limeni=0; for(i=0;ioutpoints;i+) /给隐层到输出层的连接权赋初值 for(j=0;jdefaultpoints;j+) vij=(rand()*2.0/RAND_MAX-1)/2; dlta_vij=0; /*求单样本的计算输出误差*/void out_sub1(int t) int i,j; double defaultInpointdefaultpoints; double Outpoint_youtpoints; Outpoint_ept=0;
10、for(i=0;idefaultpoints;i+) double sum=0; for(j=0;jinpoints;j+) sum+=wij*InpointDatatj; defaultInpointi=sum+limeni; defaultOutpointi=1/(a+b*exp(-1*c*defaultInpointi);/求Oi for(j=0;joutpoints;j+)/求Yi Outpoint_yj=0; for(i=0;idefaultpoints;i+) Outpoint_yj+=vji*defaultOutpointi; Outpoint_dpj=OutpointDatat
11、j-Outpoint_yj; Outpoint_ept+=Outpoint_dpj*Outpoint_dpj/2; /*反算权值*/void out_sub2(int t) int i,j,k; double s; for(i=0;idefaultpoints;i+) s=0; for(j=0;joutpoints;j+) dlta_vji=ALFA*dlta_vji+BETA*Outpoint_dpj*defaultOutpointi; / s+=vji*Outpoint_dpj; vji+=dlta_vji; dlta_limeni=ALFA*dlta_limeni+BETA*defaul
12、tOutpointi*(1-defaultOutpointi)*s;/ limeni+=dlta_limeni; for(k=0;kinpoints;k+) dlta_wik=ALFA*dlta_wik+BETA*defaultOutpointi*(1-defaultOutpointi)*s*InpointDatatk;/ wik=wik+dlta_wik; /*/void forecast() int i,j,t,k=0; double e,e1forecastdata=0; /训练误差 double sss; double InputData_xforecastdatainpoints,t
13、pforecastdataoutpoints; double defInpoint,defOutpointdefaultpoints,yforecastdataoutpoints;/yforecastdataoutpoints为网络检验输出 FILE *fp1,*fp3; if(fp1=fopen(D:data预测输入.txt,r)=NULL) /检验数据输入 printf(3can not open the filen); exit(0); for(i=0;iforecastdata;i+) for(j=0;jinpoints;j+) fscanf(fp1,%lf,&InputData_xi
14、j); fclose(fp1); if(fp3=fopen(D:data预测输出.txt,r)=NULL) /实际检验结果输出 printf(31can not open the filen); exit(0); for(i=0;iforecastdata;i+) for(j=0;joutpoints;j+) fscanf(fp3,%lf,&tpij); fclose(fp3); for(j=0;jinpoints;j+) / 检验数据归一化 for(i=0;iforecastdata;i+) if(InpointData_MAXj=0) InputData_xij=0; else Input
15、Data_xij=(InputData_xij-InpointData_MINj+A)/(InpointData_MAXj-InpointData_MINj+A); for(j=0;joutpoints;j+) for(i=0;iforecastdata;i+) if(OutpointData_MAXj=0) tpij=0; else tpij=(tpij-OutpointData_MINj+A)/(OutpointData_MAXj-OutpointData_MINj+A); do Initialization(); /初始化连接权值wij,limeni,vki k=0; do e=0; f
16、or(t=0;tdatagrough;t+) out_sub1(t); /正向计算网络输出 out_sub2(t); /反向计算,修正权值 e+=Outpoint_ept; /计算输出误差 k+; while(k0.1); sss=0; /中间参数 for(t=0;tforecastdata;t+) e1t=0; for(i=0;idefaultpoints;i+) double sum=0; for(j=0;jinpoints;j+) sum+=wij*InputData_xtj; defInpoint=sum+limeni; defOutpointi=1/(a+b*exp(-1*c*def
17、Inpoint); for(j=0;joutpoints;j+) ytj=0; for(i=0;i0.12);/*/void main() int i,j,k; FILE *fp2; ReadData(); /读训练数据:输入和输出 unitary(); /归一化,将输入输出数据归一,结果在0,1中 forecast(); /检验误差 if(fp2=fopen(D:data计算权值.txt,w)=NULL) /文件输出训练好的权值 printf(6can not open the filen); exit(0); for(i=0;idefaultpoints;i+) for(k=0;kinpo
18、ints;k+) fprintf(fp2, %lf ,wik); fprintf(fp2,n); fprintf(fp2,n); for(i=0;idefaultpoints;i+) fprintf(fp2, %lf ,limeni); fprintf(fp2,nn); for(i=0;idefaultpoints;i+) for(j=0;joutpoints;j+) fprintf(fp2, %lf ,vji); fprintf(fp2,n); fclose(fp2); 看到学生用Matlab做了BP神经网络应用的程序,突然想起自己在上学时写了个BP的C语言版,现在真不知道当时是怎么写出来的
19、,这里放上来做一个纪念。#include#include#include#include#include#include#include#define MAXWEIGHT (float)0.3)#define SCALEWEIGHT (float)32767)#define nInputNodes 4 #define nHiddenNodes 8 #define nOutputNodes 3 #define nPatterns 15#define nIterations 5000#define ESC 27#define ERRORLEVEL 0.0001#define ITEMS 8type
20、def float *PFLOAT;typedef PFLOAT VECTOR;typedef PFLOAT *MATRIX;void VectorAllocate(VECTOR *vector,int nCols);void AllocateCols(PFLOAT matrix,int nRows,int nCols);void MatrixAllocate(MATRIX *pmatrix,int nRows,int nCols);void MatrixFree(MATRIX matrix,int nRows);MATRIX out0;MATRIX out1;MATRIX delta1;MA
21、TRIX delw1;MATRIX w1;MATRIX out2;MATRIX delta2;MATRIX delw2;MATRIX w2;MATRIX target;/VECTOR PatternID;void main() float eta =0.15, alpha=0.075; int nReportErrors=100; float ErrorLevel=ERRORLEVEL; char MonitorError=0; float error; register int h; register int i; register int j; int p, q;/ r; FILE *fp
22、Pattern, *fpWeightsOut, *fpResults, *fpError, *fpTest; MatrixAllocate(&out0, nPatterns, nInputNodes); MatrixAllocate(&out1, nPatterns, nHiddenNodes); MatrixAllocate(&out2, nPatterns, nOutputNodes); MatrixAllocate(&delta2,nPatterns, nOutputNodes); MatrixAllocate(&delw2, nOutputNodes, nHiddenNodes+1);
23、 MatrixAllocate(&w2, nOutputNodes, nHiddenNodes+1); MatrixAllocate(&delta1, nPatterns, nHiddenNodes); MatrixAllocate(&delw1, nHiddenNodes,nInputNodes+1); MatrixAllocate(&w1, nHiddenNodes,nInputNodes+1); MatrixAllocate(&target,nPatterns, nOutputNodes);/ VectorAllocate(&PatternID,nPatterns);/初始化权值- srand(unsigned)time(NULL); for(h=0;hnHiddenNodes;h+) for(i=0;i=nInputNodes;i+) float frand=rand(); w1hi=MAXWEIGHT*(1.0-2*frand/SCALEWEIGHT); delw1hi=0.0; for(j=0;jnOutputNodes;j+) for(h=0;h=nHiddenNodes;h+) float frand=rand(); w2jh=MAXWEIGH
copyright@ 2008-2023 冰点文库 网站版权所有
经营许可证编号:鄂ICP备19020893号-2