BP算法例子.docx
《BP算法例子.docx》由会员分享,可在线阅读,更多相关《BP算法例子.docx(8页珍藏版)》请在冰豆网上搜索。
BP算法例子
//---------------------------------------------------------------------------------------//
// BP算法例子:
用一个五层的神经网络去逼近函数 //
// f(x1,x2)=pow(x1-1,4)+2*pow(x2,2) //
// 作者:
MaxMatrix //
// 2004.5.9调通运行于VC++6.0 //
//--------------------------------------------------------------------------------------//
#include
#include
#include
#include
#include
//---------------------------------------------------------------------
#defineRANDOMrand()/32767.0 //0~1随机数生成函数
constintLayer_Max=5;//神经网络的层数
constdoublePI=3.1415927;//圆周率
constintLayer_number[Layer_Max]={2,4,4,2,1};//神经网络各层的神经元个数
constintNeural_Max=4;//神经网络各层最大神经元个数
constintInMax=21;//样本输入的个数
ofstreamOut_W_File("All_W.txt",ios:
:
out);
ofstreamOut_Error("Error.txt",ios:
:
out);
//定义类BP
classBP
{
public:
BP();//BP类的构造函数
voidBP_Print();//打印权系数
doubleF(doublex);//神经元的激发函数
doubleY(doublex1,doublex2);//要逼近的函数
//
doubleNetWorkOut(intx1,intx2);//网络输出,他的输入为
//第input个样本
voidAllLayer_D(intx1,intx2);//求所有神经元的输出误差微分
voidChange_W(); //改变权系数
voidTrain(); //训练函数
voidAfter_Train_Out();//经过训练后,21样本的神经网络输出
doubleCost(doubleout,doubleExp);//代价函数
private:
doubleW[Layer_Max][Neural_Max][Neural_Max];//保存权系数
//规定W[i][j][k]表示网络第i层的第j个神经元连接到
//第i-1层第k个神经元的权系数
doubleInput_Net[2][InMax];//21个样本输入,约定Input_Net[0][i]
//表示第i个样本的输入x1
//而Input_Net[1][i]表示第i个样本的输入x2
doubleOut_Exp[InMax][InMax];//期望输出
doubleLayer_Node[Layer_Max][Neural_Max];//保存各神经元的输出
//规定Layer_Node[i][j]表示第i层的第j个神经元的输出
doubleD[Layer_Max][Neural_Max];//保存各神经元的误差微分
//规定D[i][j]表示第i层第j个神经元的误差微分
doubleStudy_Speed;//学习速度
doublee;//误差
};
//构造函数,用来初始化权系数,输入,期望输出和学习速度
BP:
:
BP()
{
srand(time(NULL));//播种,以便产生随即数
for(inti=1;i{
for(intj=0;j {
for(intk=0;k {
W[i][j][k]=RANDOM;//随机初始化权系数
}
// Q[i][j]=RANDOM;//初始化各神经元的阀值
}
}
//输入归和输出归一化
for(intl=0;l{
Input_Net[0][l]=l*0.05;//把0~1分成20等分,表示x1
Input_Net[1][l]=1-l*0.05;//表示x2
}
for(i=0;i{
for(intj=0;j {
Out_Exp[i][j]=Y(Input_Net[0][i],Input_Net[1][j]);//期望输出
Out_Exp[i][j]=Out_Exp[i][j]/3.000000;//期望输出归一化
}
}
Study_Speed=0.5;//初始化学习速度
e=0.0001;//误差精度
}//end
//激发函数F()
doubleBP:
:
F(doublex)
{
return(1.0/(1+exp(-x)));
}//end
//要逼近的函数Y()
//输入:
两个浮点数
//输出:
一个浮点数
doubleBP:
:
Y(doublex1,doublex2)
{
doubletemp;
temp=pow(x1-1,4)+2*pow(x2,2);
returntemp;
}//end
//--------------------------------------------------------
//代价函数
doubleBP:
:
Cost(doubleOut,doubleExp)
{
return(pow(Out-Exp,2));
}//end
//网络输出函数
//输入为:
第input个样本
doubleBP:
:
NetWorkOut(intx1,intx2)
{
inti,j,k;
doubleN_node[Layer_Max][Neural_Max];
//约定N_node[i][j]表示网络第i层的第j个神经元的总输入
//第0层的神经元为输入,不用权系数和阀值,即输进什么即输出什么
N_node[0][0]=Input_Net[0][x1];
Layer_Node[0][0]=Input_Net[0][x1];
N_node[0][1]=Input_Net[1][x2];
Layer_Node[0][1]=Input_Net[1][x2];
for(i=1;i{
for(j=0;j { //神经元个数
N_node[i][j]=0.0;
for(k=0;k { //表示与第i层第j个神经元连接的上一层的
//神经元个数
//求上一层神经元对第i层第j个神经元的输入之和
N_node[i][j]+=Layer_Node[i-1][k]*W[i][j][k];
}
N_node[i][j]=N_node[i][j]-W[i][j][k];//减去阀值
//求Layer_Node[i][j],即第i层第j个神经元的输出
Layer_Node[i][j]=F(N_node[i][j]);
}
}
returnLayer_Node[Layer_Max-1][0];//最后一层的输出
}//end
//求所有神经元的输出误差微分函数
//输入为:
第input个样本
//计算误差微分并保存在D[][]数组中
voidBP:
:
AllLayer_D(intx1,intx2)
{
inti,j,k;
doubletemp;
D[Layer_Max-1][0]=Layer_Node[Layer_Max-1][0]*
(1-Layer_Node[Layer_Max-1][0])*
(Layer_Node[Layer_Max-1][0]-Out_Exp[x1][x2]);
for(i=Layer_Max-1;i>0;i--)
{
for(j=0;j {
temp=0;
for(k=0;k {
temp=temp+W[i][k][j]*D[i][k];
}
D[i-1][j]=Layer_Node[i-1][j]*(1-Layer_Node[i-1][j])
*temp;
}
}
}//end
//修改权系数和阀值
voidBP:
:
Change_W()
{
inti,j,k;
for(i=1;i{
for(j=0;j {
for(k=0;k {
//修改权系数
W[i][j][k]=W[i][j][k]-Study_Speed*
D[i][j]*Layer_Node[i-1][k];
}
W[i][j][k]=W[i][j][k]+