《2022年人工智能之神经网络代码 .pdf》由会员分享,可在线阅读,更多相关《2022年人工智能之神经网络代码 .pdf(10页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、#pragma hdrstop #include #include const A=30.0; const B=10.0; const MAX=500; /最大训练次数 const COEF=0.0035; /网络的学习效率 const BCOEF=0.001;/网络的阀值调整效率 const ERROR=0.002 ; / 网络训练中的允许误差const ACCURACY=0.0005;/网络要求精度 double sample414=0,0,0,0,5,1,4,19.020,5,3,3,14.150, 5,5,2,14.360,5,3,3,14.150,5,3,2,15.390, 5,3,
2、2,15.390,5,5,1,19.680,5,1,2,21.060, 5,3,3,14.150,5,5,4,12.680,5,5,2,14.360, 5,1,3,19.610,5,3,4,13.650,5,5,5,12.430, 5,1,4,19.020,5,1,4,19.020,5,3,5,13.390, 5,5,4,12.680,5,1,3,19.610,5,3,2,15.390, 1,3,1,11.110,1,5,2,6.521,1,1,3,10.190, 1,3,4,6.043,1,5,5,5.242,1,5,3,5.724, 1,1,4,9.766,1,3,5,5.870,1,5,
3、4,5.406, 1,1,3,10.190,1,1,5,9.545,1,3,4,6.043, 1,5,3,5.724,1,1,2,11.250,1,3,1,11.110, 1,3,3,6.380,1,5,2,6.521,1,1,1,16.000, 1,3,2,7.219,1,5,3,5.724; double w41010,wc41010,b410,bc410; double o410,netin410,d410,differ;/单个样本的误差 double is; /全体样本均方差 int count,a; void netout(int m, int n);/计算网络隐含层和输出层的输出名
4、师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 10 页 - - - - - - - - - void calculd(int m,int n); /计算网络的反向传播误差 void calcalwc(int m,int n);/计算网络权值的调整量 void calcaulbc(int m,int n); /计算网络阀值的调整量 void changew(int m,int n); /调整网络权值 void changeb(int m,int n);/调整网络阀值 voi
5、d clearwc(int m,int n);/清除网络权值变化量wc void clearbc(int m,int n);/清除网络阀值变化量bc void initialw(void);/初始化 NN 网络权值 W void initialb(void); /初始化 NN 网络阀值 void calculdiffer(void);/计算 NN 网络单个样本误差 void calculis(void);/计算 NN 网络全体样本误差 void trainNN(void);/训练 NN 网络 /* 计算 NN 网络隐含层和输出层的输出 */ void netout(int m,int n) i
6、nt i,j,k; /隐含层各节点的的输出 for (j=1,i=2;j=m;j+) /m为隐含层节点个数 netinij=0.0; for(k=1;k=3;k+)/隐含层的每个节点均有三个输入变量 netinij=netinij+oi-1k*wikj; netinij=netinij-bij; oij=A/(1+exp(-netinij/B); / 输出层各节点的输出 for (j=1,i=3;j=n;j+) 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 10 页 -
7、 - - - - - - - - netinij=0.0; for (k=1;k=m;k+) netinij=netinij+oi-1k*wikj; netinij=netinij-bij; oij=A/(1+exp(-netinij/B) /* 计算 NN 网络的反向传播误差*/ void calculd(int m,int n) int i,j,k; double t; a=count-1; d31=(o31-samplea3)*(A/B)*exp(-netin31/B)/pow(1+exp(-netin31/B),2); / 隐含层的误差 for (j=1,i=2;j=m;j+) t=0
8、.00; for (k=1;k=n;k+) t=t+wi+1jk*di+1k; dij=t*(A/B)*exp(-netinij/B)/pow(1+exp(-netinij/B),2); /* 计算网络权值W 的调整量 */ void calculwc(int m,int n) int i,j,k; / 输出层(第三层)与隐含层(第二层)之间的连接权值的调整 for (i=1,k=3;i=m;i+) for (j=1;j=n;j+) wckij=-COEF*dkj*ok-1i+0.5*wckij; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - -
9、 - - - - 名师精心整理 - - - - - - - 第 3 页,共 10 页 - - - - - - - - - / printf(n); / 隐含层与输入层之间的连接权值的调整 for (i=1,k=2;i=m;i+) for (j=1;j=m;j+) wckij=-COEF*dkj*ok-1i+0.5*wckij; / printf(n); /* 计算网络阀值的调整量*/ void calculbc(int m,int n) int j; for (j=1;j=m;j+) bc2j=BCOEF*d2j; for (j=1;j=n;j+) bc3j=BCOEF*d3j; /* 调整网
10、络权值 */ void changw(int m,int n) int i,j; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 10 页 - - - - - - - - - for (i=1;i=3;i+) for (j=1;j=m;j+) w2ij=0.9*w2ij+wc2ij; / 为了保证系统有较好的鲁棒性,计算权值时乘惯性系数0.9 printf(w2%d%d=%fn,i,j,w2ij); for (i=1;i=m;i+) for (j=1;j=n;j+) w3
11、ij=0.9*w3ij+wc3ij; printf(w3%d%d=%fn,i,j,w3ij); /* 调整网络阀值 */ void changb(int m,int n) int j; for (j=1;j=m;j+) b2j=b2j+bc2j; for (j=1;j=n;j+) b3j=b3j+bc3j; /* 清除网络权值变化量wc*/ void clearwc(void) for (int i=0;i4;i+) for (int j=0;j10;j+) for (int k=0;k10;k+) 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - -
12、- - - - - 名师精心整理 - - - - - - - 第 5 页,共 10 页 - - - - - - - - - wcijk=0.00; /* 清除网络阀值变化量*/ void clearbc(void) for (int i=0;i4;i+) for (int j=0;j10;j+) bcij=0.00; /* 初始化网络权值W*/ void initialw(void) int i,j,k,x; double weight; for (i=0;i4;i+) for (j=0;j10;j+) for (k=0;k10;k+) randomize(); x=100+random(40
13、0); weight=(double)x/5000.00; wijk=weight; /* 初始化网络阀值*/ void initialb(void) int i,j,x; double fazhi; for (i=0;i4;i+) 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 10 页 - - - - - - - - - for (j=0;j10;j+) randomize(); for (int k=0;k12;k+) x=100+random(400); fazh
14、i=(double)x/50000.00; bij=fazhi; /* 计算网络单个样本误差*/ void calculdiffer(void) a=count-1; differ=0.5*(o31-samplea3)*(o31-samplea3); void calculis(void) int i; is=0.0; for (i=0;i=19;i+) o11=samplei0; o12=samplei1; o13=samplei2; netout(8,1); is=is+(o31-samplei3)*(o31-samplei3); is=is/20; 名师资料总结 - - -精品资料欢迎下
15、载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 10 页 - - - - - - - - - /* 训练网络 */ void trainNN(void) long int time; int i,x4; initialw(); initialb(); for (time=1;time=MAX;time+) count=0; while(countERROR) calculd(8,1); calculwc(8,1); calculbc(8,1); changw(8,1); changb(8,1); netout
16、(8,1); calculdiffer(); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 8 页,共 10 页 - - - - - - - - - printf(This is %d times training NN.n,time); calculis(); printf(is=%fn,is); if (isACCURACY) break; /- #pragma argsused int main(int argc, char* argv) double result; int
17、 m,test4; char ch=y; coutPlease wait for the train of NN:endl; trainNN(); coutNow,this modular network can work for you.endl; while(ch=y | ch=Y) coutPlease input data to be tested.endl; for (m=1;mtestm; ch=getchar(); o11=test1; o12=test2; o13=test3; netout(8,1); result=o31; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 9 页,共 10 页 - - - - - - - - - printf(Final result is %f.n,result); printf(Still test?Yes or Non); ch=getchar(); return 0; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 10 页,共 10 页 - - - - - - - - -
限制150内