感知器算法(C语言)模式识别几何分类发(线性可分时)感知器算法(3维C语言实现)

来源:互联网 发布:大数据工信部人才证书 编辑:程序博客网 时间:2024/05/21 03:25
#include<stdio.h>#include<time.h>#define C 1void main(){ //s[]用于记录各点坐标乘积; //arrey[]用于存放将输入点变换后的点 int i,j,k,N1,N2,x[10][3],s[4],d[10],arrey[10][5],w[5]; int count=1; printf("感知器算法(两类别三维问题)\n"); printf("\n请输入第一类坐标点数N1:"); scanf("%d",&N1); printf("请输入第一类各点的坐标:\n"); for( i=0; i<N1 ; i++) {  scanf("%d,%d,%d",&x[i][0],&x[i][1],&x[i][2]); } printf("\n请输入第二类坐标点数N2:"); scanf("%d",&N2); printf("请输入第二类各点的坐标:\n"); for( i=0; i<N2 ; i++) {  scanf("%d,%d,%d",&x[i+N1][0],&x[i+N1][1],&x[i+N1][2]); } printf("\n输入的第一类点为:\n"); for( j=0 ; j< N1 ; j++) {  arrey[j][0]=1;  arrey[j][1]=x[j][0];  arrey[j][2]=x[j][1];  arrey[j][3]=x[j][2];  arrey[j][4]=1;  printf("(%d,%d,%d,%d)\n",arrey[j][1],arrey[j][2],arrey[j][3],arrey[j][4]); } printf("\n输入的第二类点为:\n"); for( j=N1 ; j<(N1+N2) ; j++) {  arrey[j][0]=2;  arrey[j][1]=(-1)*x[j][0];  arrey[j][2]=(-1)*x[j][1];  arrey[j][3]=(-1)*x[j][2];  arrey[j][4]=-1;  printf("(%d,%d,%d,%d)\n",arrey[j][1],arrey[j][2],arrey[j][3],arrey[j][4]); } printf("\n取参数C为:%d\n",C); printf("初始向量 w(1)=:");  // //初始值:主要是w[1]到w[4] // w[0]=1;w[1]=-1;w[2]=-2;w[3]=-2;w[4]=0;  printf("(%d,%d,%d,%d)\n\n",w[1],w[2],w[3],w[4]); printf("迭代过程如下:\n\n"); do {  for( i=0 ; i<(N1+N2) ; i++)  {   for( j=0; j<4 ; j++)   {    s[j]=arrey[i][j+1]*w[j+1];       }      printf("w(%d)*x(%d)=(%d,%d,%d,%d)*(%d,%d,%d,%d)t",count,count,w[1],w[2],w[3],w[4],arrey[i][1],arrey[i][2],arrey[i][3],arrey[i][4]);      d[i]=s[0]+s[1]+s[2]+s[3];      printf("=%d\n",d[i]);   //   //如果d[i]<=0, 则要惩罚   //   if(d[i]<=0)   {    for(k=0; k<4 ; k++)    {     w[k+1]=C*arrey[i][k+1]+w[k+1];    }    printf("w(%d)*x(%d)=%d<=0,要惩罚,惩罚后向量 w(%d)=:(",count,count,d[i],count+1);        printf("%d,%d,%d,%d",w[1],w[2],w[3],w[4]);    //for( k=0; k<4 ;k++)    //{    // printf("%d",w[k+1]);    //}    printf(")\n");   }   else   {    printf("w(%d)*x(%d)=%d>0,向量 w(%d)=:(",count,count,d[i],count+1);    printf("%d,%d,%d,%d",w[1],w[2],w[3],w[4]);    //for( k=0; k<4 ;k++)    //{    // printf("%d",w[k+1]);    //}    printf(")\n");   }      printf("\n");   count++;  }    k=0;  for(j=(N1+N2-1); j>=0 ;j--)  {   if(d[j]>0)   {    k++;   }  }  if(k<N1+N2)  {   printf("未能收敛,继续迭代\n\n");  } }while(k<N1+N2); printf("\n优化后的向量 w(%d)=:(",count); printf("%d,%d,%d,%d",w[1],w[2],w[3],w[4]); //for( k=0; k<4 ;k++) //{ // printf("%d",w[k+1]); //} printf(")\n");}