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 >
Wrap
C/C++ Source or Header
|
2002-06-25
|
4KB
|
143 lines
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include "patt_rec.h"
#include "nrutil.h"
#define MAX_DELTA 10000
int dim;
int degree;
double normalization, sigma;
int dim_r, dim_c;
main(int argc, char *argv[])
{
int knl, i, j, k, nsv, isv, np, n_test1, n_test2, *class, *test_val;
char *knl_t, sv_file[256], radius1_file[256], radius2_file[256], roc_file[256];
double *x_vec, *sv, bee, *alpha, c_const, kernel(), aux,ftmp,*center,radius,Delta2,ker,ker2;
double *alias_x, *alias_sv, *alias2_sv;
int *index, n_tr;
double curr_r, tmp;
double **mat_kernel;
double *r1, *r2, f_pos[MAX_DELTA], one_f_neg[MAX_DELTA];
int n_err1, n_err2,Delta = 0;
int falsi_pos = 0;
FILE *fp1, *fp2, *fpp, *fradius1, *fradius2, *fout;
for (k = 1; k < argc; k++)
if (*argv[k] == '-')
switch (*(argv[k] + 1)) {
case 'i':
if (sscanf(argv[++k], "%s", sv_file) == NULL)
exit(-1);
break;
case 'p':
if (sscanf(argv[++k], "%s", radius1_file) == NULL)
exit(-1);
break;
case 'n':
if (sscanf(argv[++k], "%s", radius2_file) == NULL)
exit(-1);
break;
case 'o':
if (sscanf(argv[++k], "%s", roc_file) == NULL)
exit(-1);
break;
default:
exit(-1);
}
fp1 = fopen(sv_file, "r"); /* SV file */
fradius1 = fopen(radius1_file, "r");
fradius2 = fopen(radius2_file, "r");
fout = fopen(roc_file,"w");
/* reading support vector file */
fscanf (fp1, "%d %d %d %d", &nsv, &dim, &dim_r, &dim_c);
alpha = (double *)malloc (nsv*sizeof(double));
class = (int *)malloc (nsv*sizeof(double));
sv = (double*)malloc (nsv*dim* sizeof(double));
index = (int *)malloc(nsv*sizeof(int));
for (isv = 0; isv < nsv; isv++) {
fscanf(fp1,"%d ",&index[isv]);
fprintf(stderr,"%d \n",index[isv]);
for (i = 0; i < dim; i++) {
fscanf(fp1, "%lf", &sv[isv*dim+i]);
}
fscanf(fp1, "%d %lf", &class[isv], &alpha[isv]);
}
fscanf(fp1, "%lf", &radius);
fscanf(fp1, "%lf", &c_const);
fclose(fp1);
printf("radius %lf c_const %lf \n",radius,c_const);
/* reading radius file of positive examples */
fscanf(fradius1,"%d ",&n_test1);
r1 = dvector(0,n_test1-1);
for(i=0;i<n_test1;i++) {
fscanf(fradius1,"%lf ",&tmp);
r1[i]=tmp;
// printf("%lf\n",r1[i]);
}
fclose(fradius1);
/* reading radius file of negative examples */
fscanf(fradius2,"%d ",&n_test2);
r2 = dvector(0,n_test2-1);
for(i=0;i<n_test2;i++) {
fscanf(fradius2,"%lf ",&tmp);
r2[i]=tmp;
// printf("%lf\n",r2[i]);
}
fclose(fradius2);
Delta2 = 0.;
for (Delta=-100; Delta <= MAX_DELTA; Delta=Delta+10) {
n_err1=n_err2=0;
Delta2 = (double)Delta/1000.;
// fprintf(stderr,"Delta... %d %lf\n",Delta,Delta2);
for (i=0; i<n_test1; i++) {
if (r1[i] < radius + Delta2)
n_err1++;
}
for (i=0; i<n_test2; i++) {
if (r2[i] > radius + Delta2)
n_err2++;
}
// printf("nerr1 %d nerr2 %d\n",n_err1,n_err2);
//printf("%d %d\n",n_err1,n_err2);
f_pos[Delta]=((double)n_err1)/(double)n_test1;
one_f_neg[Delta]= (1.-(double)n_err2/(double)n_test2);
// printf("pos %lf neg %lf \n",f_pos[Delta],one_f_neg[Delta]);
fprintf(fout,"%lf %lf\n",f_pos[Delta],one_f_neg[Delta]);
}
fclose(fout);
}
help_message()
{
fprintf(stderr, "usage: roc -i sv file (support vector file, required) \n -r radius file (input) \n -o roc file (output) \n ");
exit(-1);
}