📄 bp.cpp
字号:
#include "stdafx.h"
#include "bpex.h"
#include "bp.h"
#include <math.h>
double sigmf(double u);
void wgtinit(double w[],int sl);
void forwardcp(int ft,int bk,double w[],double in[],double out[],double cw[]);
void Bpcal(int p);
void init()
{
wgtinit((double*)dblWeight_IN_HD,INPUT_NUMBER*HIDE_NUMBER);
wgtinit((double*)dblWeight_HD_OT,HIDE_NUMBER*OUT_NUMBER);
wgtinit(CW_HD,HIDE_NUMBER);
wgtinit(CW_OT,OUT_NUMBER);
};
double go_one_step()//for each input start learn
{
int i,p;
double Err,Errp;
for(p=0;p<SpNUM;p++){
for(i=0;i<INPUT_NUMBER;i++)
dblOut_IN[i]=X[p][i];
/*forward computation*/
forwardcp(INPUT_NUMBER,HIDE_NUMBER,(double*)dblWeight_IN_HD,dblOut_IN,dblOut_HD,CW_HD);
forwardcp(HIDE_NUMBER,OUT_NUMBER,(double*)dblWeight_HD_OT,dblOut_HD,dblOut_OT,CW_OT);
/*adjust weight*/
Bpcal(p);
}
/*compute the error*/
Err=0;
for(p=0;p<SpNUM;p++){
for(i=0;i<INPUT_NUMBER;i++)
dblOut_IN[i]=X[p][i];
/*forward computation*/
forwardcp(INPUT_NUMBER,HIDE_NUMBER,(double*)dblWeight_IN_HD,dblOut_IN,dblOut_HD,CW_HD);
forwardcp(HIDE_NUMBER,OUT_NUMBER,(double*)dblWeight_HD_OT,dblOut_HD,dblOut_OT,CW_OT);
for(i=0;i<OUT_NUMBER;i++)
OT[p][i]=dblOut_OT[i];
Errp=0;
for(i=0;i<OUT_NUMBER;i++)
{
Errp+=0.5*(T[p][i]-OT[p][i])*(T[p][i]-OT[p][i]);
}
Err+=Errp;
}
return Err;
}
double recognize( double* to_recog )
{
double result = -1;
forwardcp(INPUT_NUMBER,HIDE_NUMBER,(double*)dblWeight_IN_HD,to_recog,dblOut_HD,CW_HD);
forwardcp(HIDE_NUMBER,OUT_NUMBER,(double*)dblWeight_HD_OT,dblOut_HD,dblOut_OT,CW_OT);
for(int i=0;i<3;i++)
{
switch (i)
{
case 0:
if (dblOut_OT[i]>=0.8)
return 1;
break;
case 1:
if (dblOut_OT[i]<0.5)
//&&(dblOut_OT[i]<0.8))
result= 0.5;
break;
case 2:
if (dblOut_OT[i]>0.75)
return 0.25;
break;
}
}
return result;
}
void forwardcp(int ft,int bk,double w[],double in[],double out[],double cw[])
{int i,j;
double sum;
for(j=0;j<bk;j++){
sum=0;
for(i=0;i<ft;i++){
sum=sum+w[j*ft+i]*in[i];
}
//sum-=cw[j];
out[j]=sigmf(sum);
}
}
/************************************************/
void Bpcal(int p)//for one input(p) compute weight.
{
int i,j,k;
double ajtW;
double ntdelsum;
for(j=0;j<OUT_NUMBER;j++){
delta_OT[j]=dblOut_OT[j]*(1-dblOut_OT[j])*(T[p][j]-dblOut_OT[j]);
CW_OT[j]+=BETA*delta_OT[j];
for(i=0;i<HIDE_NUMBER;i++){
ajtW=YINO*delta_OT[j]*dblOut_HD[i];
dblWeight_HD_OT[j][i] += ajtW;
}
}
for(j=0;j<HIDE_NUMBER;j++){
ntdelsum=0;
for(k=0;k<OUT_NUMBER;k++){
ntdelsum += delta_OT[k]*dblWeight_HD_OT[k][j];
}
delta_HD[j]=dblOut_HD[j]*(1-dblOut_HD[j])*ntdelsum;
CW_HD[j] += BETA*delta_HD[j];
for(i=0;i<INPUT_NUMBER;i++){
ajtW=YINO*delta_HD[j]*dblOut_IN[i];
dblWeight_IN_HD[j][i] += ajtW;
}
}
}
void wgtinit(double w[],int sl)
{int i;
double drand48();
for(i=0;i<sl;i++){
*(w+i)=0.2*drand48();
}
}
double drand48()
{double d;
d=(double) rand()/32767.0;
return d;
}
double sigmf(double u) /*sigmoid function*/
{double su;
su=-u/U0;
su=1/(1.0+exp(su));
//if(su>0.9) su=1; else if (su<0.1) su=0;
return su;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -