home *** CD-ROM | disk | FTP | other *** search
/ ftp.disi.unige.it / 2015-02-11.ftp.disi.unige.it.tar / ftp.disi.unige.it / pub / .person / BarlaA / sw / OLD / Simo / SVM_mono / roc.c < prev    next >
C/C++ Source or Header  |  2002-06-25  |  4KB  |  143 lines

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <math.h>
  5. #include "patt_rec.h"
  6. #include "nrutil.h"
  7.  
  8. #define MAX_DELTA 10000
  9.  
  10. int    dim;
  11. int    degree;
  12. double    normalization, sigma;
  13.  
  14. int     dim_r, dim_c;
  15.  
  16. main(int argc, char *argv[])
  17. {
  18.     int        knl, i, j, k, nsv, isv, np, n_test1, n_test2, *class, *test_val;
  19.     char        *knl_t, sv_file[256], radius1_file[256], radius2_file[256], roc_file[256];
  20.     double        *x_vec, *sv, bee, *alpha, c_const, kernel(), aux,ftmp,*center,radius,Delta2,ker,ker2;
  21.     double          *alias_x, *alias_sv, *alias2_sv;
  22.     int             *index, n_tr;
  23.     double          curr_r, tmp;
  24.     double          **mat_kernel;
  25.     double          *r1, *r2, f_pos[MAX_DELTA], one_f_neg[MAX_DELTA];
  26.  
  27.     int             n_err1, n_err2,Delta = 0;
  28.         int             falsi_pos = 0;
  29.  
  30.         FILE        *fp1, *fp2, *fpp, *fradius1, *fradius2, *fout;
  31.  
  32.  
  33.     for (k = 1; k < argc; k++)
  34.         if (*argv[k] == '-')
  35.             switch (*(argv[k] + 1)) {
  36.             case 'i':
  37.               if (sscanf(argv[++k], "%s", sv_file) == NULL)
  38.                 exit(-1);
  39.               break;
  40.             case 'p':
  41.               if (sscanf(argv[++k], "%s", radius1_file) == NULL)  
  42.                 exit(-1);
  43.               break;
  44.             case 'n':
  45.               if (sscanf(argv[++k], "%s", radius2_file) == NULL) 
  46.                 exit(-1);
  47.               break;
  48.             case 'o':
  49.               if (sscanf(argv[++k], "%s", roc_file) == NULL)
  50.                 exit(-1);
  51.               break;
  52.             default:
  53.               exit(-1);
  54.             }
  55.  
  56.     fp1 = fopen(sv_file, "r");       /* SV file */
  57.     fradius1 = fopen(radius1_file, "r");
  58.     fradius2 = fopen(radius2_file, "r");
  59.     fout = fopen(roc_file,"w");
  60.     
  61.     /* reading support vector file */
  62.  
  63.     fscanf (fp1, "%d %d %d %d", &nsv, &dim, &dim_r, &dim_c);
  64.     alpha = (double *)malloc (nsv*sizeof(double));
  65.     class = (int *)malloc (nsv*sizeof(double));
  66.     sv = (double*)malloc (nsv*dim* sizeof(double));
  67.     index = (int *)malloc(nsv*sizeof(int));
  68.  
  69.     for (isv = 0; isv < nsv; isv++) {
  70.       fscanf(fp1,"%d ",&index[isv]);
  71.         fprintf(stderr,"%d \n",index[isv]);
  72.  
  73.       for (i = 0; i < dim; i++) {
  74.         fscanf(fp1, "%lf", &sv[isv*dim+i]);
  75.       }
  76.       fscanf(fp1, "%d %lf", &class[isv], &alpha[isv]);
  77.     }
  78.  
  79.     fscanf(fp1, "%lf", &radius);
  80.     fscanf(fp1, "%lf", &c_const);
  81.     fclose(fp1);
  82.     printf("radius %lf c_const %lf \n",radius,c_const);
  83.     /* reading radius file of positive examples */
  84.     fscanf(fradius1,"%d ",&n_test1);
  85.     r1 = dvector(0,n_test1-1);
  86.     for(i=0;i<n_test1;i++) {
  87.         fscanf(fradius1,"%lf ",&tmp);
  88.         r1[i]=tmp;
  89.        // printf("%lf\n",r1[i]);
  90.       }
  91.     fclose(fradius1);
  92.     /* reading radius file of negative examples */
  93.     fscanf(fradius2,"%d ",&n_test2);
  94.     r2 = dvector(0,n_test2-1);
  95.     for(i=0;i<n_test2;i++) {
  96.         fscanf(fradius2,"%lf ",&tmp);
  97.         r2[i]=tmp;
  98.        // printf("%lf\n",r2[i]);
  99.       }
  100.           fclose(fradius2);
  101.  
  102.  
  103.         Delta2 = 0.;
  104.     for (Delta=-100; Delta <= MAX_DELTA; Delta=Delta+10) {
  105.       n_err1=n_err2=0;
  106.       Delta2 = (double)Delta/1000.;
  107. //      fprintf(stderr,"Delta... %d %lf\n",Delta,Delta2);
  108.  
  109.       for (i=0; i<n_test1; i++) {
  110.       if (r1[i] < radius +  Delta2)
  111.                n_err1++;
  112.       }
  113.       for (i=0; i<n_test2; i++) {
  114.       if (r2[i] > radius + Delta2)
  115.                 n_err2++;
  116.       }
  117. //      printf("nerr1 %d nerr2 %d\n",n_err1,n_err2);
  118.       //printf("%d %d\n",n_err1,n_err2);
  119.       f_pos[Delta]=((double)n_err1)/(double)n_test1;
  120.       one_f_neg[Delta]= (1.-(double)n_err2/(double)n_test2);
  121. //      printf("pos %lf neg %lf \n",f_pos[Delta],one_f_neg[Delta]);
  122.       fprintf(fout,"%lf %lf\n",f_pos[Delta],one_f_neg[Delta]);
  123.  
  124.     }
  125.  
  126.     fclose(fout);
  127. }
  128.  
  129.  
  130.  
  131. help_message()
  132. {
  133.     fprintf(stderr, "usage: roc -i sv file (support vector file, required) \n -r radius file (input) \n -o roc file (output) \n  ");
  134.         exit(-1);
  135. }
  136.  
  137.  
  138.  
  139.  
  140.  
  141.  
  142.  
  143.