人工神经网络作业-单层感知器
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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])));
//计算输出层误差