diff options
Diffstat (limited to 'src/de/lmu/ifi/dbs/elki/evaluation/clustering/EvaluateClustering.java')
-rw-r--r-- | src/de/lmu/ifi/dbs/elki/evaluation/clustering/EvaluateClustering.java | 92 |
1 files changed, 45 insertions, 47 deletions
diff --git a/src/de/lmu/ifi/dbs/elki/evaluation/clustering/EvaluateClustering.java b/src/de/lmu/ifi/dbs/elki/evaluation/clustering/EvaluateClustering.java index 6db25736..2a67dbe2 100644 --- a/src/de/lmu/ifi/dbs/elki/evaluation/clustering/EvaluateClustering.java +++ b/src/de/lmu/ifi/dbs/elki/evaluation/clustering/EvaluateClustering.java @@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.evaluation.clustering; This file is part of ELKI: Environment for Developing KDD-Applications Supported by Index-Structures - Copyright (C) 2013 + Copyright (C) 2014 Ludwig-Maximilians-Universität München Lehr- und Forschungseinheit für Datenbanksysteme ELKI Development Team @@ -32,12 +32,12 @@ import de.lmu.ifi.dbs.elki.data.Clustering; import de.lmu.ifi.dbs.elki.database.Database; import de.lmu.ifi.dbs.elki.evaluation.Evaluator; import de.lmu.ifi.dbs.elki.logging.Logging; -import de.lmu.ifi.dbs.elki.result.BasicResult; +import de.lmu.ifi.dbs.elki.math.MeanVariance; +import de.lmu.ifi.dbs.elki.result.EvaluationResult; import de.lmu.ifi.dbs.elki.result.HierarchicalResult; import de.lmu.ifi.dbs.elki.result.Result; import de.lmu.ifi.dbs.elki.result.ResultUtil; -import de.lmu.ifi.dbs.elki.result.textwriter.TextWriteable; -import de.lmu.ifi.dbs.elki.result.textwriter.TextWriterStream; +import de.lmu.ifi.dbs.elki.utilities.FormatUtil; import de.lmu.ifi.dbs.elki.utilities.optionhandling.AbstractParameterizer; import de.lmu.ifi.dbs.elki.utilities.optionhandling.OptionID; import de.lmu.ifi.dbs.elki.utilities.optionhandling.parameterization.Parameterization; @@ -156,7 +156,9 @@ public class EvaluateClustering implements Evaluator { ClusterContingencyTable contmat = new ClusterContingencyTable(selfPairing, noiseSpecialHandling); contmat.process(refc, c); - db.getHierarchy().add(c, new ScoreResult(contmat)); + ScoreResult sr = new ScoreResult(contmat); + sr.addHeader(c.getLongName()); + db.getHierarchy().add(c, sr); } } @@ -184,7 +186,7 @@ public class EvaluateClustering implements Evaluator { * * @apiviz.composedOf ClusterContingencyTable */ - public static class ScoreResult extends BasicResult implements TextWriteable { + public static class ScoreResult extends EvaluationResult { /** * Cluster contingency table */ @@ -198,6 +200,43 @@ public class EvaluateClustering implements Evaluator { public ScoreResult(ClusterContingencyTable contmat) { super("Cluster-Evalation", "cluster-evaluation"); this.contmat = contmat; + + PairCounting paircount = contmat.getPaircount(); + MeasurementGroup g = newGroup("Pair counting measures"); + g.addMeasure("Jaccard", paircount.jaccard(), 0, 1, false); + g.addMeasure("F1-Measure", paircount.f1Measure(), 0, 1, false); + g.addMeasure("Precision", paircount.precision(), 0, 1, false); + g.addMeasure("Recall", paircount.recall(), 0, 1, false); + g.addMeasure("Rand", paircount.randIndex(), 0, 1, false); + g.addMeasure("ARI", paircount.adjustedRandIndex(), 0, 1, false); + g.addMeasure("FowlkesMallows", paircount.fowlkesMallows(), 0, 1, false); + + Entropy entropy = contmat.getEntropy(); + g = newGroup("Entropy based measures"); + g.addMeasure("NMI Joint", entropy.entropyNMIJoint(), 0, 1, false); + g.addMeasure("NMI Sqrt", entropy.entropyNMISqrt(), 0, 1, false); + + BCubed bcubed = contmat.getBCubed(); + g = newGroup("BCubed-based measures"); + g.addMeasure("F1-Measure", bcubed.f1Measure(), 0, 1, false); + g.addMeasure("Recall", bcubed.recall(), 0, 1, false); + g.addMeasure("Precision", bcubed.precision(), 0, 1, false); + + SetMatchingPurity setm = contmat.getSetMatching(); + g = newGroup("Set-Matching-based measures"); + g.addMeasure("F1-Measure", setm.f1Measure(), 0, 1, false); + g.addMeasure("Purity", setm.purity(), 0, 1, false); + g.addMeasure("Inverse Purity", setm.inversePurity(), 0, 1, false); + + EditDistance edit = contmat.getEdit(); + g = newGroup("Editing-distance measures"); + g.addMeasure("F1-Measure", edit.f1Measure(), 0, 1, false); + g.addMeasure("Precision", edit.editDistanceFirst(), 0, 1, false); + g.addMeasure("Recall", edit.editDistanceSecond(), 0, 1, false); + + MeanVariance gini = contmat.averageSymmetricGini(); + g = newGroup("Gini measures"); + g.addMeasure("Mean +-" + FormatUtil.NF4.format(gini.getCount() > 1. ? gini.getSampleStddev() : 0.), gini.getMean(), 0, 1, false); } /** @@ -208,47 +247,6 @@ public class EvaluateClustering implements Evaluator { public ClusterContingencyTable getContingencyTable() { return contmat; } - - @Override - public void writeToText(TextWriterStream out, String label) { - out.commentPrint("Pair-F1, "); - out.commentPrint("Pair-Precision, "); - out.commentPrint("Pair-Recall, "); - out.commentPrint("Pair-Rand, "); - out.commentPrint("Pair-AdjustedRand, "); - out.commentPrint("Pair-FowlkesMallows, "); - out.commentPrint("Pair-Jaccard, "); - out.commentPrint("Pair-Mirkin, "); - out.commentPrint("Entropy-VI, "); - out.commentPrint("Entropy-NormalizedVI, "); - out.commentPrint("Entropy-F1, "); - out.commentPrint("Edit-F1, "); - out.commentPrint("SM-InvPurity, "); - out.commentPrint("SM-Purity, "); - out.commentPrint("SM-F1, "); - out.commentPrint("BCubed-Precision, "); - out.commentPrint("BCubed-Recall, "); - out.commentPrint("BCubed-F1"); - out.flush(); - out.inlinePrint(contmat.getPaircount().f1Measure()); - out.inlinePrint(contmat.getPaircount().precision()); - out.inlinePrint(contmat.getPaircount().recall()); - out.inlinePrint(contmat.getPaircount().randIndex()); - out.inlinePrint(contmat.getPaircount().adjustedRandIndex()); - out.inlinePrint(contmat.getPaircount().fowlkesMallows()); - out.inlinePrint(contmat.getPaircount().jaccard()); - out.inlinePrint(contmat.getPaircount().mirkin()); - out.inlinePrint(contmat.getEntropy().variationOfInformation()); - out.inlinePrint(contmat.getEntropy().normalizedVariationOfInformation()); - out.inlinePrint(contmat.getEdit().f1Measure()); - out.inlinePrint(contmat.getSetMatching().inversePurity()); - out.inlinePrint(contmat.getSetMatching().purity()); - out.inlinePrint(contmat.getSetMatching().f1Measure()); - out.inlinePrint(contmat.getBCubed().precision()); - out.inlinePrint(contmat.getBCubed().recall()); - out.inlinePrint(contmat.getBCubed().f1Measure()); - out.flush(); - } } /** |