www.pudn.com > MutualInformationICA.zip > MIClustering.C


//####################################################################
//Mutual Information Clustering, rectangular version 
//####################################################################
//2 May 2004
//Contact: kraskov@its.caltech.edu
//####################################################################
//uses mi2r, mir_xnyn, redr
#include 
#include 
#include 
#include 
#include 

#include "miutils.h"

#define MIM 0
void maxx(double **mi, char *is, int dim, int *im, int *jm, double *mm);

int main(int argc, char **argv) {

  FILE *fin;
  int i,d,d2,im,jm,d1;
  int dx,dy,dmxy;
  int N;
  int dim;
  int K=10;
  double mm;
  char *is;
  int **noden;

  double **mis; // mi/(dx+dy) matrix
  double *clmis; // mi((X),(Y))/(dx+dy) of the combination

  double **mi; // mi matrix
  double *clmi; // mi((X),(Y)) of the combination

  int *cls[2];

  
  double **x;
  double **xx;
  double *psi,*min,*max,*scal,*scalxx;
  double t_d;
  double *red; //redundancy

  //read arguments
  double s,me;
  double addnoise=-1;
  int pdm=0;
  
  if (argc<5) {//first three arguments are necessary
    fprintf(stderr,"\nHierarchical Clustering Based on Mutual Infomation (MI)\n\n");
    fprintf(stderr,"Usage:\n%s   <# points> <# neighbours> [addnoise] [P_MI]\n\n",argv[0]);
    fprintf(stderr,"Input:\n\t\ttext file with  columns and <# points> rows\n");
    fprintf(stderr,"\t\t\tnumber of columns (number of characteristic vectors)\n");
    fprintf(stderr,"\t<# points>\tnumber of rows (length of characteristic vectors)\n");
    fprintf(stderr,"\t<# neighbours>\tnumber of the nearest neighbours for MI estimator\n");
    fprintf(stderr,"\t[addnoise]\tnoise amplitude; default 1e-8\n");
    fprintf(stderr,"\t[P_MI]\t\tprint_pairwise_MI; default do not print; to print say 1\n");
    fprintf(stderr,"\nOutput: (suitable for Matlab function dendrogram.m, just use [1 2 5])\n");
    fprintf(stderr,"\nnodeX nodeY MI(X,Y)/(dx+dy) MI(X,Y) RED(X,Y)\n");
    fprintf(stderr,"\tMI(X,Y)/(dx+dy)\tinter-cluster similarity measure for clusters\n\t\t\t\tnodeX and nodeY (used for topology)\n");
    fprintf(stderr,"\tMI(X,Y)\t\tmutual information between nodeX and nodeY\n");
    fprintf(stderr,"\tRED(X,Y)\tmutual information of the cluster (nodeXnodeY)\n\t\t\t\t(used for plotting a dendrogram)\n");
    fprintf(stderr,"\nContact: kraskov@its.caltech.edu\n");
    exit(-1);
  }
  dim=atoi(argv[2]);
  N=atoi(argv[3]);
  K=atoi(argv[4]);
  if (argc>=6) addnoise=atof(argv[5]);
  if (argc>=7) pdm=atoi(argv[6]);
  if (argc>=8) {fprintf(stderr,"Too many input arguments\n");exit(-1);}

  x=(double **)calloc(dim,sizeof(double*));
  xx=(double **)calloc(dim,sizeof(double*));
  for (d=0;dmax[d]) max[d]=x[d][i];
    }
    for (i=0;i=100) fprintf(stderr,"f%d",dx+1);
      else if (dx+1>=10) fprintf(stderr,"f0%d",dx+1);
      else fprintf(stderr,"f00%d",dx+1);
      
      for (dy=0;dy0));
      }
      fprintf(stderr,"\t0;\n");
    }
  }

  for (d=0;ddy) ? dx : dy ;
    
    if ( (imdy) ? dx : dy;
	mis[d][d2]=mi[d][d2]/(dx+dy);
      }
    }
  }
  for (d=0;d*mm) { *im=d;*jm=dd;*mm=mi[*im][*jm]; }
}