人工神经网络作业-单层感知器

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

3.5单层感知器

# include

# include

# define N 100

int sgn(double x) //符号运算函数

{

int y;

if(x>0||x==0)

y=1;

else

y=-1;

return y;

}

void main()

{

double W[4]={0.0,0.0,0.0,0.0},X[6][4]={{-1,0.8,0.5,0},{-1,0.9,0.7,0.3},{-1,1,0.8,0.5}, {-1,0,0.2,0.3},{-1,0.2,0.1,1.3},{-1,0.2,0.7,0.8}};

int err,o[6],i,j,k,num,d[6]={1,1,1,-1,-1,-1};

double n,WX;

n=1.0;

k=0;

do {

k++;

num=0;

for(i=0;i<6;i++)

{

WX=0.0;

for(j=0;j<4;j++)

WX=WX+W[j]*X[i][j];

o[i]=sgn(WX);

err=d[i]-o[i];

for(j=0;j<4;j++)

W[j]=W[j]+n*err*X[i][j];

if(err==0)

num++;

}

}while(num!=6);

printf("调整后的权值矩阵为:\n");

for(j=0;j<4;j++)

printf("%f\n",W[j]);

printf("分类结果为:\n");

for(i=0;i<6;i++)

printf("%d\n",o[i]);

}

3.6单次训练的结果

# include

# include

double Sig(double x) //单极性函数

{

double y;

y=1.0/(1.0+exp(-x));

return y;

}

void main()

{

double

x[3]={-1,1,3},V[3][3]={{0,3,-1},{0,1,2},{0,-2,0}},W[3][3]={{0,2,3},{0,1,1},{0,0,-2}};

double d[3]={0,0.95,0.05},nety[3],neto[3],Y[3],O[3],dety[3],deto[3];

double D,yita;

int i,j;

yita=1.0;

FILE *fp;

fp=fopen("out.txt","w");

fprintf(fp,"初始W矩阵:\n");

for(i=0;i<3;i++)

{

for(j=1;j<3;j++)

fprintf(fp,"%f ",W[i][j]);

fprintf(fp,"\n");

}

fprintf(fp,"初始V矩阵:\n");

for(i=0;i<3;i++)

{

for(j=1;j<3;j++)

fprintf(fp,"%f ",V[i][j]);

fprintf(fp,"\n");

}

//计算隐层的输出

fprintf(fp,"隐层的净输入:\n");

for(j=1;j<3;j++)

{

nety[j]=0.0;

for(i=0;i<3;i++)

nety[j]=nety[j]+V[i][j]*x[i];

fprintf(fp,"%f\t",nety[j]);

}

fprintf(fp,"\n");

Y[0]=-1.0;

fprintf(fp,"隐层的输出:\n");

for(i=1;i<3;i++)

Y[i]=Sig(nety[i]);

for(j=1;j<3;j++)

fprintf(fp,"%f\t",Y[j]);

fprintf(fp,"\n");

//计算输出层的输出

fprintf(fp,"输出层的净输入:\n");

for(j=1;j<3;j++)

{

neto[j]=0.0;

for(i=0;i<3;i++)

neto[j]=neto[j]+W[i][j]*Y[i];

fprintf(fp,"%f\t",neto[j]);

}

fprintf(fp,"\n");

fprintf(fp,"输出层的输出:\n");

for(i=1;i<3;i++)

O[i]=Sig(neto[i]);

for(j=1;j<3;j++)

fprintf(fp,"%f\t",O[j]);

fprintf(fp,"\n");

//计算导数

fprintf(fp,"隐层输出的一阶导数:\n");

for(i=1;i<3;i++)

fprintf(fp,"%f\t",Sig(nety[i])*(1.0-Sig(nety[i])));

fprintf(fp,"\n");

fprintf(fp,"输出层输出的一阶导数:\n");

for(i=1;i<3;i++)

fprintf(fp,"%f\t",Sig(neto[i])*(1.0-Sig(neto[i])));

//计算输出层误差

相关文档
最新文档