/** * */ package ie.dcu.eval; import ie.dcu.matrix.ByteMatrix; /** * An evaluator that computes several standard statistical measure using a * confusion matrix. * * @author Kevin McGuinness */ public class ConfusionMatrixEvaluator extends AbstractEvaluator { public static final String ACCURACY = "Accuracy"; public static final String PRECISION = "Precision"; public static final String RECALL = "Recall"; public static final String F_MEASURE = "F-Measure"; public static final String JACCARD = "Jaccard"; public ConfusionMatrixEvaluator() { name = "Confusion Matrix Evaluator"; description = "Computes standard measures using a confusion matrix"; vendor = "Kevin McGuinness"; // Add measures addMeasure(ACCURACY); addMeasure(PRECISION); addMeasure(RECALL); addMeasure(F_MEASURE); addMeasure(JACCARD); } public void run(ByteMatrix a, ByteMatrix b) { // Check preconditions check(a, b); // Confusion matrix (confused? :-P) int[][] c = new int[2][2]; // Zero matrix for (int i = 0; i < 2; i++) { for (int j = 0; j < 2; j++) { c[i][j] = 0; } } // Compute confusion for (int i = 0; i < a.size; i++) { // Indices into confusion matrix int idx1 = a.values[i] == FG ? 0 : 1; int idx2 = b.values[i] == FG ? 0 : 1; // Increment confusion c[idx1][idx2]++; } // Compute measures and set results BinaryClassifierEvaluation ev = new BinaryClassifierEvaluation(c); // Set results setResult(ACCURACY, ev.getAccuracy()); setResult(PRECISION, ev.getPrecision()); setResult(RECALL, ev.getRecall()); setResult(F_MEASURE, ev.getFMeasure()); setResult(JACCARD, ev.getJaccardIndex()); } }