aboutsummaryrefslogtreecommitdiff
path: root/FEAST/MIToolbox/demonstration_algorithms/mRMR_D.m
diff options
context:
space:
mode:
Diffstat (limited to 'FEAST/MIToolbox/demonstration_algorithms/mRMR_D.m')
-rw-r--r--FEAST/MIToolbox/demonstration_algorithms/mRMR_D.m69
1 files changed, 69 insertions, 0 deletions
diff --git a/FEAST/MIToolbox/demonstration_algorithms/mRMR_D.m b/FEAST/MIToolbox/demonstration_algorithms/mRMR_D.m
new file mode 100644
index 0000000..50b14bc
--- /dev/null
+++ b/FEAST/MIToolbox/demonstration_algorithms/mRMR_D.m
@@ -0,0 +1,69 @@
+function selectedFeatures = mRMR_D(k, featureMatrix, classColumn)
+%function selectedFeatures = mRMR_D(k, featureMatrix, classColumn)
+%
+%Selects optimal features according to the mRMR-D algorithm from
+%"Feature Selection Based on Mutual Information: Criteria of Max-Dependency, Max-Relevance, and Min-Redundancy"
+%by H. Peng et al. (2005)
+%
+%Calculates the top k features
+%a dataset featureMatrix with n training examples and m features
+%with the classes held in classColumn (an n x 1 vector)
+
+noOfTraining = size(classColumn,1);
+noOfFeatures = size(featureMatrix,2);
+unselectedFeatures = ones(noOfFeatures,1);
+
+classMI = zeros(noOfFeatures,1);
+answerFeatures = zeros(k,1);
+highestMI = 0;
+highestMICounter = 0;
+currentHighestFeature = 0;
+
+featureMIMatrix = -(ones(k,noOfFeatures));
+
+%setup the mi against the class
+for n = 1 : noOfFeatures
+ classMI(n) = mi(featureMatrix(:,n),classColumn);
+ if classMI(n) > highestMI
+ highestMI = classMI(n);
+ highestMICounter = n;
+ end
+end
+
+answerFeatures(1) = highestMICounter;
+unselectedFeatures(highestMICounter) = 0;
+
+%iterate over the number of features to select
+for i = 2:k
+ score = -100;
+ currentHighestFeature = 0;
+ iMinus = i-1;
+ for j = 1 : noOfFeatures
+ if unselectedFeatures(j) == 1
+ currentMIScore = 0;
+ for m = 1 : iMinus
+ if featureMIMatrix(m,j) == -1
+ featureMIMatrix(m,j) = mi(featureMatrix(:,j),featureMatrix(:,answerFeatures(m)));
+ end
+ currentMIScore = currentMIScore + featureMIMatrix(m,j);
+ end
+ currentScore = classMI(j) - (currentMIScore/iMinus);
+
+ if (currentScore > score)
+ score = currentScore;
+ currentHighestFeature = j;
+ end
+ end
+ end
+
+ if score < 0
+ disp(['at selection ' int2str(j) ' mRMRD is negative with value ' num2str(score)]);
+ end
+
+ %now highest feature is selected in currentHighestFeature
+ %store it
+ unselectedFeatures(currentHighestFeature) = 0;
+ answerFeatures(i) = currentHighestFeature;
+end
+
+selectedFeatures = answerFeatures;