diff options
Diffstat (limited to 'FEAST/MIToolbox/demonstration_algorithms/mRMR_D.m')
-rw-r--r-- | FEAST/MIToolbox/demonstration_algorithms/mRMR_D.m | 69 |
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; |