?? ann1.c
字號:
#include "stdio.h"
#include "math.h"
#include <stdlib.h>
main()
{
float data[10][65],yb[10],yc[10],yd,sb[10],sc[10],data1[64],
sd,wab[65][10],wbc[11][10],wcd[11],Vab[65][10],
Vbc[11][10],Vcd[11],Eb[10],Ec[10],Ed;
float con=5,sum,error,td,temp;
int i,j,flag,k;
FILE *fp;
float F();
float F1();
if((fp=fopen("train.txt","r"))==NULL)//read data
{printf("\n the file train.txt can not be opened");
exit(0);
}
for(i=0;i<10;i++)
for(j=0;j<65;j++)
fscanf(fp,"%f",&data[i][j]);
fclose(fp);
for(i=0;i<=64;i++)
for(j=0;j<10;j++)
{
temp=rand()%100;
temp/=100;
if(temp>0.4) temp-=1;
wab[i][j]=temp;
}
for(i=0;i<=10;i++)
for(j=0;j<10;j++)
{
temp=rand()%100;
temp/=100;
if(temp>0.4) temp-=1;
wbc[i][j]=temp;
}
for(i=0;i<=10;i++)
{
temp=rand()%100;
temp/=100;
if(temp>0.4) temp-=1;
wcd[i]=temp;
}
do
{
flag=0;//標記是否收斂
for(k=0;k<10;k++)
{
//forward calculate
for(i=0;i<10;i++)
sb[i]=0;
for(j=0;j<10;j++)
for(i=0;i<64;i++)
sb[j]=sb[j]+wab[i][j]*data[k][i];
for(i=0;i<10;i++)
sb[i]=sb[i]-1.0*wab[64][i];
for(i=0;i<10;i++)
yb[i]=F(sb[i]);//f(s)=1/(1+exp(-s))
for(i=0;i<10;i++)
sc[i]=0;
for(j=0;j<10;j++)
for(i=0;i<10;i++)
sc[j]=sc[j]+wbc[i][j]*yb[i];
for(i=0;i<10;i++)
sc[i]=sc[i]-1.0*wbc[10][i];
for(i=0;i<10;i++)
yc[i]=F(sc[i]);
sd=0;
for(i=0;i<10;i++)
sd=sd+wcd[i]*yc[i];
sd=sd-1.0*wcd[10];
yd=F(sd);
td=data[k][64];
//error=0.5*(data[k][64]-yd)*(data[k][64]-yd);
error=fabs(td-yd);
if(error>0.005)
flag=1;
//error feedback
Ed=F1(sd)*(td-yd);//f1(s)=f(s)(1-f(s))
for(i=0;i<10;i++)
Vcd[i]=con*Ed*yc[i];
Vcd[10]=con*Ed*(-1.0);
for(i=0;i<10;i++)
Ec[i]=F1(sc[i])*wcd[i]*Ed;
for(i=0;i<10;i++)
for(j=0;j<10;j++)
Vbc[i][j]=con*Ec[j]*yb[i];
for(i=0;i<10;i++)
Vbc[10][i]=con*Ec[i]*(-1.0);
for(i=0;i<10;i++)
{sum=0;
for(j=0;j<10;j++)
sum=sum+wbc[i][j]*Ec[j];
Eb[i]=F1(sb[i])*sum;
}
for(i=0;i<64;i++)
for(j=0;j<10;j++)
Vab[i][j]=con*Eb[j]*data[k][i];
for(i=0;i<10;i++)
Vab[64][i]=con*Eb[j]*(-1.0);
if(k==9&&flag==0)
goto recog;
//calculate quan zhi
for(i=0;i<=64;i++)
for(j=0;j<10;j++)
wab[i][j]=wab[i][j]+Vab[i][j];
for(i=0;i<=10;i++)
for(j=0;j<10;j++)
wbc[i][j]=wbc[i][j]+Vbc[i][j];
for(i=0;i<=10;i++)
wcd[i]=wcd[i]+Vcd[i];
printf("yd=%f td=%f error=%f\n",yd,td,error);
}
}
while(flag);
//識別
recog:
if((fp=fopen("sample.txt","r"))==NULL)//read data
{printf("\n the file sample.txt can not be opened");
exit(0);
}
for(j=0;j<64;j++)
fscanf(fp,"%f",&data1[j]);
for(i=0;i<10;i++)
sb[i]=0;
for(j=0;j<10;j++)
for(i=0;i<64;i++)
sb[j]=sb[j]+wab[i][j]*data1[i];
for(i=0;i<10;i++)
sb[i]=sb[i]-1.0*wab[64][i];
for(i=0;i<10;i++)
yb[i]=F(sb[i]);//f(s)=1/(1+exp(-s))
for(i=0;i<10;i++)
sc[i]=0;
for(j=0;j<10;j++)
for(i=0;i<10;i++)
sc[j]=sc[j]+wbc[i][j]*yb[i];
for(i=0;i<10;i++)
sc[i]=sc[i]-1.0*wbc[10][i];
for(i=0;i<10;i++)
yc[i]=F(sc[i]);
sd=0;
for(i=0;i<10;i++)
sd=sd+wcd[i]*yc[i];
sd=sd-1.0*wcd[10];
yd=F(sd);
printf("yd=%f ",yd);
}
float F(s)
float s;
{
float value;
value=1/(1+exp(-s));
return(value);
}
float F1(s)
float s;
{
float value;
value=exp(-s)/((1+exp(-s))*(1+exp(-s)));
return(value);
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -