aboutsummaryrefslogtreecommitdiff
path: root/FEAST/MIToolbox/demonstration_algorithms/DISR_Mex.c
diff options
context:
space:
mode:
Diffstat (limited to 'FEAST/MIToolbox/demonstration_algorithms/DISR_Mex.c')
-rw-r--r--FEAST/MIToolbox/demonstration_algorithms/DISR_Mex.c199
1 files changed, 0 insertions, 199 deletions
diff --git a/FEAST/MIToolbox/demonstration_algorithms/DISR_Mex.c b/FEAST/MIToolbox/demonstration_algorithms/DISR_Mex.c
deleted file mode 100644
index 617ca81..0000000
--- a/FEAST/MIToolbox/demonstration_algorithms/DISR_Mex.c
+++ /dev/null
@@ -1,199 +0,0 @@
-/*******************************************************************************
-** Demonstration feature selection algorithm - MATLAB r2009a
-**
-** Initial Version - 13/06/2008
-** Updated - 07/07/2010
-** based on DISR.m
-**
-** Double Input Symmetrical Relevance
-** in
-** "On the Use of Variable Complementarity for Feature Selection in Cancer Classification"
-** P. Meyer and G. Bontempi (2006)
-**
-** Author - Adam Pocock
-** Demonstration code for MIToolbox
-*******************************************************************************/
-
-#include "mex.h"
-#include "MutualInformation.h"
-#include "Entropy.h"
-#include "ArrayOperations.h"
-
-void DISRCalculation(int k, int noOfSamples, int noOfFeatures,double *featureMatrix, double *classColumn, double *outputFeatures)
-{
- /*holds the class MI values*/
- double *classMI = (double *)mxCalloc(noOfFeatures,sizeof(double));
-
- char *selectedFeatures = (char *)mxCalloc(noOfFeatures,sizeof(char));
-
- /*holds the intra feature MI values*/
- int sizeOfMatrix = k*noOfFeatures;
- double *featureMIMatrix = (double *)mxCalloc(sizeOfMatrix,sizeof(double));
-
- double maxMI = 0.0;
- int maxMICounter = -1;
-
- double **feature2D = (double**) mxCalloc(noOfFeatures,sizeof(double*));
-
- double score, currentScore, totalFeatureMI;
- int currentHighestFeature;
-
- double *mergedVector = (double *) mxCalloc(noOfSamples,sizeof(double));
-
- int arrayPosition;
- double mi, tripEntropy;
-
- int i,j,x;
-
- for(j = 0; j < noOfFeatures; j++)
- {
- feature2D[j] = featureMatrix + (int)j*noOfSamples;
- }
-
- for (i = 0; i < sizeOfMatrix;i++)
- {
- featureMIMatrix[i] = -1;
- }/*for featureMIMatrix - blank to -1*/
-
-
- for (i = 0; i < noOfFeatures;i++)
- {
- /*calculate mutual info
- **double calculateMutualInformation(double *firstVector, double *secondVector, int vectorLength);
- */
- classMI[i] = calculateMutualInformation(feature2D[i], classColumn, noOfSamples);
-
- if (classMI[i] > maxMI)
- {
- maxMI = classMI[i];
- maxMICounter = i;
- }/*if bigger than current maximum*/
- }/*for noOfFeatures - filling classMI*/
-
- selectedFeatures[maxMICounter] = 1;
- outputFeatures[0] = maxMICounter;
-
- /*****************************************************************************
- ** We have populated the classMI array, and selected the highest
- ** MI feature as the first output feature
- ** Now we move into the DISR algorithm
- *****************************************************************************/
-
- for (i = 1; i < k; i++)
- {
- score = 0.0;
- currentHighestFeature = 0;
- currentScore = 0.0;
- totalFeatureMI = 0.0;
-
- for (j = 0; j < noOfFeatures; j++)
- {
- /*if we haven't selected j*/
- if (selectedFeatures[j] == 0)
- {
- currentScore = 0.0;
- totalFeatureMI = 0.0;
-
- for (x = 0; x < i; x++)
- {
- arrayPosition = x*noOfFeatures + j;
- if (featureMIMatrix[arrayPosition] == -1)
- {
- /*
- **double calculateMutualInformation(double *firstVector, double *secondVector, int vectorLength);
- **double calculateJointEntropy(double *firstVector, double *secondVector, int vectorLength);
- */
-
- mergeArrays(feature2D[(int) outputFeatures[x]], feature2D[j],mergedVector,noOfSamples);
- mi = calculateMutualInformation(mergedVector, classColumn, noOfSamples);
- tripEntropy = calculateJointEntropy(mergedVector, classColumn, noOfSamples);
-
- featureMIMatrix[arrayPosition] = mi / tripEntropy;
- }/*if not already known*/
- currentScore += featureMIMatrix[arrayPosition];
- }/*for the number of already selected features*/
-
- if (currentScore > score)
- {
- score = currentScore;
- currentHighestFeature = j;
- }
- }/*if j is unselected*/
- }/*for number of features*/
-
- selectedFeatures[currentHighestFeature] = 1;
- outputFeatures[i] = currentHighestFeature;
-
- }/*for the number of features to select*/
-
- mxFree(mergedVector);
- mergedVector = NULL;
-
- for (i = 0; i < k; i++)
- {
- outputFeatures[i] += 1; /*C indexes from 0 not 1*/
- }/*for number of selected features*/
-
-}/*DISRCalculation(double[][],double[])*/
-
-/*entry point for the mex call
-**nlhs - number of outputs
-**plhs - pointer to array of outputs
-**nrhs - number of inputs
-**prhs - pointer to array of inputs
-*/
-void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
-{
- /*************************************************************
- ** this function takes 3 arguments:
- ** k = number of features to select,
- ** featureMatrix[][] = matrix of features
- ** classColumn[] = targets
- ** the arguments should all be discrete integers.
- ** and has one output:
- ** selectedFeatures[] of size k
- *************************************************************/
-
- int k, numberOfFeatures, numberOfSamples, numberOfTargets;
- double *featureMatrix, *targets, *output;
-
-
- if (nlhs != 1)
- {
- printf("Incorrect number of output arguments");
- }/*if not 1 output*/
- if (nrhs != 3)
- {
- printf("Incorrect number of input arguments");
- }/*if not 3 inputs*/
-
- /*get the number of features to select, cast out as it is a double*/
- k = (int) mxGetScalar(prhs[0]);
-
- numberOfFeatures = mxGetN(prhs[1]);
- numberOfSamples = mxGetM(prhs[1]);
-
- numberOfTargets = mxGetM(prhs[2]);
-
- if (numberOfTargets != numberOfSamples)
- {
- printf("Number of targets must match number of samples\n");
- printf("Number of targets = %d, Number of Samples = %d, Number of Features = %d\n",numberOfTargets,numberOfSamples,numberOfFeatures);
-
- plhs[0] = mxCreateDoubleMatrix(0,0,mxREAL);
- }/*if size mismatch*/
- else
- {
-
- featureMatrix = mxGetPr(prhs[1]);
- targets = mxGetPr(prhs[2]);
-
- plhs[0] = mxCreateDoubleMatrix(k,1,mxREAL);
- output = (double *)mxGetPr(plhs[0]);
-
- /*void DISRCalculation(int k, int noOfSamples, int noOfFeatures,double *featureMatrix, double *classColumn, double *outputFeatures)*/
- DISRCalculation(k,numberOfSamples,numberOfFeatures,featureMatrix,targets,output);
- }
-
- return;
-}/*mexFunction()*/