神经网络算法代码java 神经网络算法代码实现( 六 )


//把所有的层的每一个节点的输出值算出来并记录在pnodey里,不包含输入点值
for(int y=0;ySidenum;y++)//层数
{
for(int r=1;rpnode[y+1]+1;r++)//本节点数,加1是为了下标好看
{
double sum=0;
for(int z=0;zpnode[y]+1;z++)//前一层的节点数
{
if(y==0)sum+= pX[KK][z]*p[y][r-1][z];
else
sum+=pnodey[y-1][z]*p[y][r-1][z];
}
pnodey[y][r]=fas(sum);
}
}
for(int j=1;j=outputnodenum;j++)
sum1+=pow(pY[KK][j]-pnodey[Sidenum-1][j],2);
return sum1;
}
/**********************************************************/
//Compute Back-Propagation-Errors
void ComputeBackPropagationErrors(int gf)//gf代表组号
{//计算所有的ddlj[][]
//for(int gf=0;gfyangbenzushu;gf++)//组数
for(int q=Sidenum-1;q=0;q--)//从最后一层开始
{
if(q==Sidenum-1)//如果是最外一层的话
{
for(int rt=0;rtpnode[q+1];rt++)//每层的节点数
ddlj[q][rt]=pnodey[q][rt+1]*(1-pnodey[q][rt+1])*(pY[gf][rt+1]-pnodey[q][rt+1]) ;
}
else
{
for(int ry=0;rypnode[q+1];ry++)
{
double sumtemp=0;
for(int fg=0;fgpnode[q+2];fg++)
sumtemp+=ddlj[q+1][fg]*p[q+1][fg][ry+1];
ddlj[q][ry] = pnodey[q][ry+1]*(1-pnodey[q][ry+1])* sumtemp;
}
}
}
//计算所有的ddp[][]
//for(int gf1=0;gf1yangbenzushu;gf1++)//组数
for(int l=0;lSidenum;l++)//层数
for(int JJ=0;JJpnode[l+1];JJ++)//每一层的节点数
for(int i=0;ipnode[l]+1;i++)//前一层的节点数
{
if(l==0)//如果是第一层的话 , y值为输入的X值
ddp[l][JJ][i]=ddlj[l][JJ]*pX[gf][i];
else
ddp[l][JJ][i]=ddlj[l][JJ]*pnodey[l-1][i];
}
}
/*************************************************************************/
void UpdatetheWeightsusingBPAlgorithm()
{
for(int cent=0;centSidenum;cent++)//层数
for(int J=0;Jpnode[cent+1];J++)//每一层的节点数
for(int i=0;ipnode[cent]+1;i++)//前一层的节点数
p[cent][J][i]+=0.2*ddp[cent][J][i];
}
/***************************************************************************/
double xunlianErrors()//定义训练误差函数
{
double error=0;
double sum=0;
double temp=0;
double temp1=0;
for(int gf1=0;gf1yangbenzushu;gf1++)//组数
{
temp= computeYl(gf1);
//temp1=zhengquelv(gf1);
//sum+=temp1;
for(int jj=1;jj=outputnodenum;jj++)
coutpnodey[Sidenum-1][jj];
error+=temp;
}
// sum=sum/yangbenzushu;
cout"用训练集所得到的正确率:"sumendl;
return error/yangbenzushu;
}
/****************************************************************************/
double jiaoyanErrors(int yangbenzushu1 )//定义校验误差函数
{
double error=0;
double sum=0;
double temp=0;
double temp1=0;
for(int gf1=0;gf1yangbenzushu1;gf1++)//组数
{
temp= computeYl(gf1);
for(int jj=1;jj=outputnodenum;jj++)
coutpnodey[Sidenum-1][jj];
//temp1=zhengquelv(gf1);
//sum+=temp1;
error+=temp;
}
//sum=sum/yangbenzushu1;
//cout"用校验集所得到的正确率:"sumendl;
return error/yangbenzushu1;
}
/********************************************************************/
double zhengquelv(int KK)
{
int count=0;
double av=0;
//for(int gf1=0;gf1yangbenzushu;gf1++)//组数
for(int jj=1;jj=outputnodenum;jj++)
{
if (pnodey[Sidenum-1][jj]0) pnodey[Sidenum-1][jj]=1;
else pnodey[Sidenum-1][jj]=0;
if(pY[KK][jj]==pnodey[Sidenum-1][jj])count++;
}
av=(double)count/outputnodenum;
return av;
}
/***********************************************************************/

推荐阅读