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;d max[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;dy 0)); } fprintf(stderr,"\t0;\n"); } } for (d=0;d dy) ? dx : dy ; if ( (im dy) ? dx : dy; mis[d][d2]=mi[d][d2]/(dx+dy); } } } for (d=0;d *mm) { *im=d;*jm=dd;*mm=mi[*im][*jm]; } }