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
/
kernel.c
< prev
next >
Wrap
C/C++ Source or Header
|
2002-06-25
|
4KB
|
176 lines
#include <math.h>
#include <stdio.h>
#include <string.h>
#include "nrutil.h"
#include "patt_rec.h"
extern int dim;
extern int degree;
extern double sigma, normalization;
extern int dim_r,dim_c, delta_g, delta_r, delta_c;
double linear_kernel(double *v1, double *v2)
{
register i;
double aux = 0.;
for (i = dim; i > 0; i--)
aux += *v1++ * *v2++;
/* fprintf(stderr, "%lf\n", aux/normalization);*/
return aux/normalization;
}
double negative_kernel(double *v1, double *v2)
{
register i;
double aux = 0., tmp;
for (i = dim; i > 0; i--) {
tmp = *v1++ - *v2++;
aux -= tmp * tmp;
}
/*
for (i=dim; i>0; i--) {
tmp = - (*v1)*(*v1) - (*v2)*(*v2) + 2*(*v1++)(*v2++);
aux += tmp;
}
*/
return (aux/normalization);
}
double poly_kernel(double *v1, double *v2)
{
register i;
double aux = 0.;
for (i = dim; i > 0; i--)
aux += *v1++ * *v2++;
/* fprintf(stderr, "%lf\n", pow((aux/normalization + 1.),(double)degree)-1.);*/
return(pow((aux/normalization + 1.),(double)degree)-1.);
}
double rbf_kernel(double *v1, double *v2)
{
register i;
double aux, res = 0.;
for (i = dim; i > 0; i--)
{
aux = *v1++ - *v2++;
res += aux * aux;
}
/* fprintf(stderr, "%lf\n", exp(-res/(2*sigma*sigma)));*/
return exp(-res / (2*sigma*sigma));
}
double mv_kernel(double *mod,double *imm)
{
register i;
double normal_imm = 0.;
double normal_mod = 0.;
double mod2[dim],imm2[dim]; /*vettori ausiliarii*/
double inter = 0.;
for(i=0; i<dim; i++){
//fprintf(stdout,"uffa %lf %lf \n",imm[i],mod[i]);
normal_imm += imm[i];
normal_mod += mod[i];
}
//fprintf(stdout,"%lf %lf\n",normal_imm,normal_mod);
for(i=0; i<dim; i++){
imm2[i] = imm[i]/normal_imm;
mod2[i] = mod[i]/normal_mod;
inter += ilmiomin(imm2[i],mod2[i]);
}
return(inter);
}
double haus_kernel(double *v1, double *v2)
{
register int big_g;
int i,j,k,ii,jj,kk,h;
int max_val, counter, tmp_counter;
int st_k;
int check=0;
int verbose, occlusion, max_noise;
int type;
int w_r, w_c;
double *data_i, *model_data;
double *data_s, *base, *startp;
byte pop[ 256 ], *grey;
double **mat_1, **mat_2;
int flag=0;
double *image_s;
long *addr,*next;
int **surface, **row_surface, **col_surface, **and,*buffer;
long tot=0;
model_data= v1; //model first
data_i = v2; //image second
w_r= dim_r;
w_c = dim_c;
counter=0;
/*PROVA DI CAMBIAMENTO CODICE*/
for (i=delta_r; i<(dim_r-delta_r); i++)
for (j=delta_c; j<(dim_c-delta_c); j++){
flag=1;
for (k=-delta_r; k<= delta_r; k++)
for(h=-delta_c; h<= delta_c; h++)
if ((fabs(model_data[i*dim_c+j]-data_i[(i+k)*dim_c+j+h]))<=delta_g){
counter++;
flag=0; k=delta_r+1; h=delta_c+1;
}
}
return((double)counter/normalization);
}
static double (*kernel_v[])() = {linear_kernel, negative_kernel,poly_kernel, rbf_kernel, mv_kernel, haus_kernel};
double kernel(int k, double *v1, double *v2)
{
switch (k)
{
case LINEAR_KERNEL:
return linear_kernel(v1, v2);
case NEGATIVE_KERNEL:
return negative_kernel(v1, v2);
case POLY_KERNEL:
return poly_kernel(v1, v2);
case RBF_KERNEL:
return rbf_kernel(v1, v2);
case MV_KERNEL:
return mv_kernel(v1, v2);
case HAUS_KERNEL:
{
return (haus_kernel(v1, v2)+haus_kernel(v2, v1))/2;
}
case HAUS_KERNEL_SIMM:
{
return (haus_kernel(v1, v2)+haus_kernel(v2, v1))/2;
}
fprintf(stderr, "Unknown kernel\n");
exit(-1);
}
return (*kernel_v[k])(v1, v2);
}