gen_subset.c

来自「vc的源代码程序的基于最小特征向量的元素的集合方法的程序源代码」· C语言 代码 · 共 229 行

C
229
字号
#include <stdio.h>#include <math.h>#define no_fea 6#define datafile "monk3.data"#define no_ex 122#define no_class 2/* make sure class values are starting from 0 */FILE *fp;int asked_no,subset[no_fea],data_ar[no_ex][no_fea],class[no_ex];int mark[no_ex],min_fea_val[no_fea],fea_arity[no_fea],max_fea_val[no_fea];float info;main(){ struct node{  int num;  int beg_num;  int max_num;  struct node *next,*pre; };  int i,j,x,final_asked_no;  struct node *p,*start,*last,*temp_p;  float incon_cal();  int min_subset[no_fea];  float min_info;    /* read data from datafile to data_ar & class */  fp=fopen(datafile,"r");  i=0;  while(!feof(fp) && i<no_ex) {    for(x=0;x<no_fea;x++)       fscanf(fp,"%d",&data_ar[i][x]);    if(!feof(fp))      fscanf(fp,"%d",&class[i]);    i++;  }  /* find min_fea_val[] and fea_arity[] */  /* initialize min_fea_val[] and fea_arity[] */  for(i=0;i<no_fea;i++) {    fea_arity[i]=0;min_fea_val[i]=no_fea+1;max_fea_val[i]=0;  }  for(i=0;i<no_ex;i++) { /* for all patterns */    for(j=0;j<no_fea;j++) {      if(data_ar[i][j]<min_fea_val[j])        min_fea_val[j]=data_ar[i][j];      if(data_ar[i][j]>max_fea_val[j])        max_fea_val[j]=data_ar[i][j];    }  }  for(i=0;i<no_fea;i++)    fea_arity[i]=max_fea_val[i]-min_fea_val[i]+1;        /* Initialize the mark for all patterns to zero signifying not yet searched*/  for(i=0;i<no_ex;i++)    mark[i]=0;  /* initialize min_info and min_subset and final_asked_no */  min_info=100.0;/* an arbitrarily high value */  for(i=0;i<asked_no;i++)    min_subset[i]=-1;  final_asked_no=0;  /* for all subsets exhaustively */  for(asked_no=1;asked_no<=no_fea;asked_no++) {  /*   printf("asked_no=%d\n",asked_no); */  /* generate the start node which contains no info. */    p=(struct node *)malloc(sizeof(struct node));    start=p;p->pre=NULL;p->num=-1;  /* allocate for asked_no of features */    for(i=0;i<asked_no;i++) {      temp_p=p;      p=(struct node *)malloc(sizeof(struct node));      p->pre=temp_p;temp_p->next=p;p->beg_num=i;p->num=i;      p->max_num=no_fea-asked_no+i;    }  /* generate the last node which contains no info. */    temp_p=p;    p=(struct node *)malloc(sizeof(struct node));    p->pre=temp_p;temp_p->next=p;p->num=-1;    last=p;p->next=NULL;p=last->pre;    /*  output the first subset  */    temp_p=start->next;i=0;    while(temp_p->next!=NULL) {      subset[i]=temp_p->num;i++;temp_p=temp_p->next;    }    for(i=0;i<asked_no;i++)      printf("%d  ",subset[i]);    printf("\n");        /* call incon_cal */    info=incon_cal();    /* compare with min_info and replace if satisfy */    if(info<min_info) {      for(i=0;i<asked_no;i++) 	min_subset[i]=subset[i];      min_info=info;      final_asked_no=asked_no;    }    /* generate exhaustively */    while(p!=start) {      if(p->num<p->max_num) {        p->num++;x=p->num;        while(p->next!=last) {          p=p->next;          p->num=++x;        }        /*  output the nest subset  */        temp_p=start->next;i=0;        while(temp_p->next!=NULL) {          subset[i]=temp_p->num;i++;temp_p=temp_p->next;        }               /* call incon_cal */        info=incon_cal();        /* comapare with min_info and replace if satisfy */        if(info<min_info) {          for(i=0;i<asked_no;i++)             min_subset[i]=subset[i];          min_info=info;          final_asked_no=asked_no;        }        for(i=0;i<asked_no;i++)          printf("%d  ",subset[i]);        printf("\n");      }      else        p=p->pre;    }  } printf("min_info=%f\n",min_info); printf("The subset is :- "); for(j=0;j<final_asked_no;j++)   printf("%d  ",min_subset[j]+1); printf("\n");}/* inconsistency calculation for each subset *//* it is log base 2 of sum of all exceptions for a subset */float incon_cal(){ int i,j; int pattern[no_fea];/*used for searching a pattern given a subset of features*/ int class_val[no_class];/*used for counting the no. of patterns in different			   classes */ int checked,match,max_class,except,sum_class; float info1; /* initialize info to zero */ info=0.0; /* initialize pattern */ for(i=0;i<asked_no;i++)   pattern[i]=0; checked=0; while(checked==0) {   i=0;   while(mark[i]==1)/* skip those patterns which are already searched */     i++;      /* check whether all patterns are considered */   if(i>=no_ex) {     checked=1;     break;   }   for(j=0;j<asked_no;j++)/* find a pattern which is not yet searched */     pattern[j]=data_ar[i][subset[j]];      /* initialize class_val */   for(j=0;j<no_class;j++)     class_val[j]=0;   for(;i<no_ex;i++) {     match=1;     if(mark[i]==0)       for(j=0;j<asked_no && match==1;j++)          if(data_ar[i][subset[j]]!=pattern[j])           match=0;          if(match==1) {       mark[i]=1;       class_val[class[i]]++;     }   }   /* update info */   max_class=0;sum_class=0;   for(j=0;j<no_class;j++) {     sum_class+=class_val[j];     if(class_val[j]>max_class)        max_class=class_val[j];   }   except=sum_class-max_class;   info+=except; }/* while loop for all patterns */ /* info calculation both theory and exceptions */ info1=1.0; for(j=0;j<asked_no;j++)    info1*=fea_arity[subset[j]]; if(info>0.0)   info=log(info)/log(2.0); info+=log(info1)/log(2.0); return info;}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?