C 实现的BP神经网络代码计算机二级考试
文章作者 100test 发表时间 2009:06:21 15:13:07
来源 100Test.Com百考试题网
编辑特别推荐:
全国计算机等级考试(等考)指定教材
全国计算机等级考试学习视频
全国计算机等级考试网上辅导招生
全国计算机等级考试时间及科目预告
百考试题教育全国计算机等级考试在线测试平台
全国计算机等级考试资料下载
全国计算机等级考试论坛
计算机等级考试四级应用题解析汇总
2009年下半年全国计算机二级考试报名时间从6月1日起已经开始报名。详情点击:2009年下半年全国计算机等级考试各地报名点汇总。2009年下半年全国计算机二级考试时间是2009年9月19日至23日。更多优质资料尽在百考试题论坛 百考试题在线题库。
#pragma hdrstop
#include <.stdio.h>.
#include <.iostream.h>.
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 sample[41][4]={{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,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,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 w[4][10][10],wc[4][10][10],b[4][10],bc[4][10].
double o[4][10],netin[4][10],d[4][10],differ.//单个样本的误差
double is. //全体样本均方差
int count,a.
void netout(int m, int n).//计算网络隐含层和输出层的输出
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).//调整网络阀值
void 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)
{
int i,j,k.
//隐含层各节点的的输出
for (j=1,i=2.j<.=m.j ) //m为隐含层节点个数
{
netin[i][j]=0.0.
for(k=1.k<.=3.k )//隐含层的每个节点均有三个输入变量
netin[i][j]=netin[i][j] o[i-1][k]*w[i][k][j].
netin[i][j]=netin[i][j]-b[i][j].
o[i][j]=A/(1 exp(-netin[i][j]/B)).
}
//输出层各节点的输出
for (j=1,i=3.j<.=n.j )
{
netin[i][j]=0.0.
for (k=1.k<.=m.k )
netin[i][j]=netin[i][j] o[i-1][k]*w[i][k][j].
netin[i][j]=netin[i][j]-b[i][j].
o[i][j]=A/(1 exp(-netin[i][j]/B)) .
}
}
/*计算NN网络的反向传播误差*/
void calculd(int m,int n)
{
int i,j,k.
double t.
a=count-1.
d[3][1]=(o[3][1]-sample[a][3])*(A/B)*exp(-netin[3][1]/B)/pow(1 exp(-netin[3][1]/B),2).
//隐含层的误差
for (j=1,i=2.j<.=m.j )
{
t=0.00.
for (k=1.k<.=n.k )
t=t w[i 1][j][k]*d[i 1][k].
d[i][j]=t*(A/B)*exp(-netin[i][j]/B)/pow(1 exp(-netin[i][j]/B),2).
}
}