diff options
Diffstat (limited to 'elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation')
65 files changed, 200 insertions, 53 deletions
diff --git a/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/AutomaticEvaluation.java b/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/AutomaticEvaluation.java index 484b55c5..0763f69e 100644 --- a/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/AutomaticEvaluation.java +++ b/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/AutomaticEvaluation.java @@ -50,6 +50,7 @@ import de.lmu.ifi.dbs.elki.utilities.scaling.LinearScaling; * Evaluator that tries to auto-run a number of evaluation methods. * * @author Erich Schubert + * @since 0.5.0 * * @apiviz.landmark * diff --git a/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/Evaluator.java b/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/Evaluator.java index ad8d06db..636b4c8a 100644 --- a/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/Evaluator.java +++ b/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/Evaluator.java @@ -30,6 +30,7 @@ import de.lmu.ifi.dbs.elki.result.ResultProcessor; * evaluations, ... * * @author Erich Schubert + * @since 0.2 * * @apiviz.excludeSubtypes */ diff --git a/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/NoAutomaticEvaluation.java b/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/NoAutomaticEvaluation.java index c2fd7811..e6cd96a2 100644 --- a/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/NoAutomaticEvaluation.java +++ b/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/NoAutomaticEvaluation.java @@ -33,6 +33,7 @@ import de.lmu.ifi.dbs.elki.utilities.optionhandling.AbstractParameterizer; * evaluation to run. * * @author Erich Schubert + * @since 0.2 */ public class NoAutomaticEvaluation implements Evaluator { @Override diff --git a/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/classification/ConfusionMatrix.java b/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/classification/ConfusionMatrix.java index 78be5b52..73098bc5 100644 --- a/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/classification/ConfusionMatrix.java +++ b/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/classification/ConfusionMatrix.java @@ -32,6 +32,7 @@ import de.lmu.ifi.dbs.elki.data.ClassLabel; * can be derived from a confusion matrix. * * @author Arthur Zimek + * @since 0.7.0 */ public class ConfusionMatrix { /** diff --git a/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/classification/ConfusionMatrixEvaluationResult.java b/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/classification/ConfusionMatrixEvaluationResult.java index 87ad6df3..02d35025 100644 --- a/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/classification/ConfusionMatrixEvaluationResult.java +++ b/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/classification/ConfusionMatrixEvaluationResult.java @@ -30,10 +30,13 @@ import de.lmu.ifi.dbs.elki.result.textwriter.TextWriterStream; /** * Provides the prediction performance measures for a classifier based on the * confusion matrix. - * + * * Note: this API is non-final, and will be refactored soon. * * @author Arthur Zimek + * @since 0.7.0 + * + * @apiviz.composedOf ConfusionMatrix */ public class ConfusionMatrixEvaluationResult implements Result, TextWriteable { /** diff --git a/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/classification/holdout/AbstractHoldout.java b/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/classification/holdout/AbstractHoldout.java index cbe90475..bff2fa7f 100644 --- a/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/classification/holdout/AbstractHoldout.java +++ b/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/classification/holdout/AbstractHoldout.java @@ -36,6 +36,7 @@ import de.lmu.ifi.dbs.elki.utilities.exceptions.AbortException; * Split a data set for holdout evaluation. * * @author Erich Schubert + * @since 0.7.0 */ public abstract class AbstractHoldout implements Holdout { /** diff --git a/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/classification/holdout/DisjointCrossValidation.java b/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/classification/holdout/DisjointCrossValidation.java index c3c1df82..ecb872ac 100644 --- a/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/classification/holdout/DisjointCrossValidation.java +++ b/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/classification/holdout/DisjointCrossValidation.java @@ -38,6 +38,7 @@ import de.lmu.ifi.dbs.elki.utilities.optionhandling.parameters.IntParameter; * perform cross-validation. The test sets are guaranteed to be disjoint. * * @author Arthur Zimek + * @since 0.7.0 */ public class DisjointCrossValidation extends RandomizedHoldout { /** diff --git a/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/classification/holdout/Holdout.java b/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/classification/holdout/Holdout.java index 69de2f9e..c2656147 100644 --- a/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/classification/holdout/Holdout.java +++ b/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/classification/holdout/Holdout.java @@ -33,6 +33,7 @@ import de.lmu.ifi.dbs.elki.datasource.bundle.MultipleObjectsBundle; * pairs of training and test data sets. * * @author Erich Schubert + * @since 0.4.0 * * @apiviz.uses MultipleObjectsBundle * @apiviz.has TrainingAndTestSet diff --git a/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/classification/holdout/LeaveOneOut.java b/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/classification/holdout/LeaveOneOut.java index ae638a39..e67d4a14 100644 --- a/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/classification/holdout/LeaveOneOut.java +++ b/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/classification/holdout/LeaveOneOut.java @@ -33,6 +33,7 @@ import de.lmu.ifi.dbs.elki.datasource.bundle.MultipleObjectsBundle; * remaining instances are training instances. * * @author Arthur Zimek + * @since 0.7.0 */ public class LeaveOneOut extends AbstractHoldout { /** diff --git a/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/classification/holdout/RandomizedCrossValidation.java b/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/classification/holdout/RandomizedCrossValidation.java index 868462d9..2921fc22 100644 --- a/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/classification/holdout/RandomizedCrossValidation.java +++ b/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/classification/holdout/RandomizedCrossValidation.java @@ -38,6 +38,7 @@ import de.lmu.ifi.dbs.elki.utilities.optionhandling.parameters.IntParameter; * to perform cross-validation. The test sets are not guaranteed to be disjoint. * * @author Arthur Zimek + * @since 0.7.0 */ public class RandomizedCrossValidation extends RandomizedHoldout { /** diff --git a/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/classification/holdout/RandomizedHoldout.java b/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/classification/holdout/RandomizedHoldout.java index dd390421..aca68ed6 100644 --- a/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/classification/holdout/RandomizedHoldout.java +++ b/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/classification/holdout/RandomizedHoldout.java @@ -33,6 +33,7 @@ import de.lmu.ifi.dbs.elki.utilities.optionhandling.parameters.RandomParameter; * A holdout providing a seed for randomized operations. * * @author Arthur Zimek + * @since 0.3 */ public abstract class RandomizedHoldout extends AbstractHoldout { /** diff --git a/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/classification/holdout/StratifiedCrossValidation.java b/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/classification/holdout/StratifiedCrossValidation.java index 3e0c4b2b..60af8179 100644 --- a/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/classification/holdout/StratifiedCrossValidation.java +++ b/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/classification/holdout/StratifiedCrossValidation.java @@ -44,6 +44,7 @@ import de.lmu.ifi.dbs.elki.utilities.optionhandling.parameters.IntParameter; * deterministic. * * @author Arthur Zimek + * @since 0.7.0 */ public class StratifiedCrossValidation extends AbstractHoldout { /** diff --git a/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/classification/holdout/TrainingAndTestSet.java b/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/classification/holdout/TrainingAndTestSet.java index 7ee58663..3c1af309 100644 --- a/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/classification/holdout/TrainingAndTestSet.java +++ b/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/classification/holdout/TrainingAndTestSet.java @@ -33,6 +33,7 @@ import de.lmu.ifi.dbs.elki.datasource.bundle.MultipleObjectsBundle; * training and test set are provided in labels. * * @author Arthur Zimek + * @since 0.7.0 */ public class TrainingAndTestSet { /** diff --git a/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/clustering/BCubed.java b/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/clustering/BCubed.java index e4958527..4cf9ec0e 100644 --- a/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/clustering/BCubed.java +++ b/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/clustering/BCubed.java @@ -38,6 +38,7 @@ import de.lmu.ifi.dbs.elki.utilities.documentation.Reference; * </p> * * @author Sascha Goldhofer + * @since 0.5.0 */ @Reference(authors = "A. Bagga and B. Baldwin", // title = "Entity-based cross-document coreferencing using the Vector Space Model", // diff --git a/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/clustering/ClusterContingencyTable.java b/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/clustering/ClusterContingencyTable.java index e063b967..b269d2f9 100644 --- a/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/clustering/ClusterContingencyTable.java +++ b/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/clustering/ClusterContingencyTable.java @@ -36,6 +36,7 @@ import de.lmu.ifi.dbs.elki.utilities.BitsUtil; * Class storing the contingency table and related data on two clusterings. * * @author Erich Schubert + * @since 0.5.0 * * @apiviz.landmark * diff --git a/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/clustering/EditDistance.java b/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/clustering/EditDistance.java index 85764e2e..e07c84eb 100644 --- a/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/clustering/EditDistance.java +++ b/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/clustering/EditDistance.java @@ -36,6 +36,7 @@ import de.lmu.ifi.dbs.elki.utilities.documentation.Reference; * </p> * * @author Sascha Goldhofer + * @since 0.5.0 */ @Reference(authors = "Pantel, P. and Lin, D.", title = "Document clustering with committees", booktitle = "Proc. 25th ACM SIGIR conference on Research and development in information retrieval", url = "http://dx.doi.org/10.1145/564376.564412") public class EditDistance { diff --git a/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/clustering/Entropy.java b/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/clustering/Entropy.java index b7770f71..17e3abca 100644 --- a/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/clustering/Entropy.java +++ b/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/clustering/Entropy.java @@ -36,6 +36,7 @@ import de.lmu.ifi.dbs.elki.utilities.documentation.Reference; * </p> * * @author Sascha Goldhofer + * @since 0.5.0 */ @Reference(authors = "Meilă, M.", // title = "Comparing clusterings by the variation of information", // diff --git a/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/clustering/EvaluateClustering.java b/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/clustering/EvaluateClustering.java index a4c46191..473e713c 100644 --- a/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/clustering/EvaluateClustering.java +++ b/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/clustering/EvaluateClustering.java @@ -37,6 +37,7 @@ import de.lmu.ifi.dbs.elki.result.EvaluationResult; import de.lmu.ifi.dbs.elki.result.Result; import de.lmu.ifi.dbs.elki.result.ResultHierarchy; import de.lmu.ifi.dbs.elki.result.ResultUtil; +import de.lmu.ifi.dbs.elki.utilities.Alias; 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; @@ -48,11 +49,13 @@ import de.lmu.ifi.dbs.elki.utilities.optionhandling.parameters.ObjectParameter; * Evaluate a clustering result by comparing it to an existing cluster label. * * @author Erich Schubert + * @since 0.4.0 * * @apiviz.landmark * @apiviz.uses ClusterContingencyTable * @apiviz.has EvaluateClustering.ScoreResult oneway - - «create» */ +@Alias("de.lmu.ifi.dbs.elki.evaluation.paircounting.EvaluatePairCountingFMeasure") public class EvaluateClustering implements Evaluator { /** * Logger for debug output. @@ -313,4 +316,4 @@ public class EvaluateClustering implements Evaluator { return new EvaluateClustering(referencealg, noiseSpecialHandling, !selfPairing); } } -}
\ No newline at end of file +} diff --git a/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/clustering/LogClusterSizes.java b/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/clustering/LogClusterSizes.java index 9b4c2512..2b801cfb 100644 --- a/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/clustering/LogClusterSizes.java +++ b/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/clustering/LogClusterSizes.java @@ -42,6 +42,7 @@ import de.lmu.ifi.dbs.elki.utilities.datastructures.hierarchy.Hierarchy.Iter; * cluster sizes and the number of clusters. * * @author Erich Schubert + * @since 0.7.0 */ public class LogClusterSizes implements Evaluator { /** diff --git a/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/clustering/PairCounting.java b/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/clustering/PairCounting.java index 3025f367..26f2d5db 100644 --- a/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/clustering/PairCounting.java +++ b/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/clustering/PairCounting.java @@ -31,6 +31,7 @@ import de.lmu.ifi.dbs.elki.utilities.documentation.Reference; * Pair-counting measures. * * @author Erich Schubert + * @since 0.5.0 */ public class PairCounting { /** diff --git a/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/clustering/SetMatchingPurity.java b/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/clustering/SetMatchingPurity.java index bbef4b5f..46bddd77 100644 --- a/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/clustering/SetMatchingPurity.java +++ b/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/clustering/SetMatchingPurity.java @@ -54,6 +54,7 @@ import de.lmu.ifi.dbs.elki.utilities.documentation.Reference; * </p> * * @author Sascha Goldhofer + * @since 0.5.0 */ @Reference(authors = "Meilă, M", // title = "Comparing clusterings", // diff --git a/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/clustering/extractor/ExtractFlatClusteringFromHierarchyEvaluator.java b/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/clustering/extractor/ExtractFlatClusteringFromHierarchyEvaluator.java index 258b983d..60f22623 100644 --- a/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/clustering/extractor/ExtractFlatClusteringFromHierarchyEvaluator.java +++ b/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/clustering/extractor/ExtractFlatClusteringFromHierarchyEvaluator.java @@ -54,6 +54,7 @@ import de.lmu.ifi.dbs.elki.workflow.AlgorithmStep; * from the same clustering, this can be useful. * * @author Erich Schubert + * @since 0.7.0 */ public class ExtractFlatClusteringFromHierarchyEvaluator implements Evaluator { /** diff --git a/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/clustering/extractor/HDBSCANHierarchyExtractionEvaluator.java b/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/clustering/extractor/HDBSCANHierarchyExtractionEvaluator.java index 4fa9f44f..456d1fc6 100644 --- a/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/clustering/extractor/HDBSCANHierarchyExtractionEvaluator.java +++ b/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/clustering/extractor/HDBSCANHierarchyExtractionEvaluator.java @@ -52,6 +52,7 @@ import de.lmu.ifi.dbs.elki.workflow.AlgorithmStep; * from the same clustering, this can be useful. * * @author Erich Schubert + * @since 0.7.0 */ public class HDBSCANHierarchyExtractionEvaluator implements Evaluator { /** diff --git a/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/clustering/extractor/SimplifiedHierarchyExtractionEvaluator.java b/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/clustering/extractor/SimplifiedHierarchyExtractionEvaluator.java index 871ab121..0644a16c 100644 --- a/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/clustering/extractor/SimplifiedHierarchyExtractionEvaluator.java +++ b/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/clustering/extractor/SimplifiedHierarchyExtractionEvaluator.java @@ -52,6 +52,7 @@ import de.lmu.ifi.dbs.elki.workflow.AlgorithmStep; * from the same clustering, this can be useful. * * @author Erich Schubert + * @since 0.7.0 */ public class SimplifiedHierarchyExtractionEvaluator implements Evaluator { /** diff --git a/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/clustering/internal/EvaluateCIndex.java b/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/clustering/internal/EvaluateCIndex.java index e43d9cc5..a96dfc91 100644 --- a/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/clustering/internal/EvaluateCIndex.java +++ b/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/clustering/internal/EvaluateCIndex.java @@ -35,6 +35,7 @@ import de.lmu.ifi.dbs.elki.distance.distancefunction.DistanceFunction; import de.lmu.ifi.dbs.elki.distance.distancefunction.minkowski.EuclideanDistanceFunction; import de.lmu.ifi.dbs.elki.evaluation.Evaluator; import de.lmu.ifi.dbs.elki.logging.Logging; +import de.lmu.ifi.dbs.elki.logging.progress.FiniteProgress; import de.lmu.ifi.dbs.elki.logging.statistics.DoubleStatistic; import de.lmu.ifi.dbs.elki.logging.statistics.LongStatistic; import de.lmu.ifi.dbs.elki.logging.statistics.StringStatistic; @@ -43,7 +44,9 @@ import de.lmu.ifi.dbs.elki.result.EvaluationResult.MeasurementGroup; import de.lmu.ifi.dbs.elki.result.Result; import de.lmu.ifi.dbs.elki.result.ResultHierarchy; import de.lmu.ifi.dbs.elki.result.ResultUtil; -import de.lmu.ifi.dbs.elki.utilities.datastructures.arraylike.DoubleArray; +import de.lmu.ifi.dbs.elki.utilities.datastructures.heap.DoubleHeap; +import de.lmu.ifi.dbs.elki.utilities.datastructures.heap.DoubleMaxHeap; +import de.lmu.ifi.dbs.elki.utilities.datastructures.heap.DoubleMinHeap; import de.lmu.ifi.dbs.elki.utilities.documentation.Reference; import de.lmu.ifi.dbs.elki.utilities.optionhandling.AbstractParameterizer; import de.lmu.ifi.dbs.elki.utilities.optionhandling.OptionID; @@ -53,10 +56,13 @@ import de.lmu.ifi.dbs.elki.utilities.optionhandling.parameters.ObjectParameter; /** * Compute the C-index of a data set. + * + * Note: This requires pairwise distance computations, so it is not recommended + * to use this on larger data sets. * * Reference: * <p> - * L. J. Hubert and J.R. Levin <br /> + * L. J. Hubert and J. R. Levin <br /> * A general statistical framework for assessing categorical clustering in free * recall<br /> * Psychological Bulletin, Vol. 83(6) @@ -64,6 +70,7 @@ import de.lmu.ifi.dbs.elki.utilities.optionhandling.parameters.ObjectParameter; * * @author Stephan Baier * @author Erich Schubert + * @since 0.7.0 * * @apiviz.composedOf NoiseHandling */ @@ -115,15 +122,9 @@ public class EvaluateCIndex<O> implements Evaluator { public double evaluateClustering(Database db, Relation<? extends O> rel, DistanceQuery<O> dq, Clustering<?> c) { List<? extends Cluster<?>> clusters = c.getAllClusters(); - // theta is the sum, w the number of within group distances - double theta = 0; - int w = 0; - int ignorednoise = 0; - int isize = clusters.size() <= 1 ? rel.size() : rel.size() / (clusters.size() - 1); - DoubleArray pairDists = new DoubleArray(isize); - - for(int i = 0; i < clusters.size(); i++) { - Cluster<?> cluster = clusters.get(i); + // Count ignored noise, and within-cluster distances + int ignorednoise = 0, w = 0; + for(Cluster<?> cluster : clusters) { if(cluster.size() <= 1 || cluster.isNoise()) { switch(noiseOption){ case IGNORE_NOISE: @@ -135,41 +136,51 @@ public class EvaluateCIndex<O> implements Evaluator { break; // Treat like a cluster } } - for(DBIDIter it1 = cluster.getIDs().iter(); it1.valid(); it1.advance()) { - O obj = rel.get(it1); - // Compare object to every cluster, but only once - for(int j = i; j < clusters.size(); j++) { - Cluster<?> ocluster = clusters.get(j); - if(ocluster.size() <= 1 || ocluster.isNoise()) { - switch(noiseOption){ - case IGNORE_NOISE: - continue; // Ignore this cluster. - case TREAT_NOISE_AS_SINGLETONS: - case MERGE_NOISE: - break; // Treat like a cluster - } - } - for(DBIDIter it2 = ocluster.getIDs().iter(); it2.valid(); it2.advance()) { - if(DBIDUtil.compare(it1, it2) <= 0) { // Only once. - continue; - } - double dist = dq.distance(obj, rel.get(it2)); - pairDists.add(dist); - if(ocluster == cluster) { // Within-cluster distances. - theta += dist; - w++; - } + w += (cluster.size() * (cluster.size() - 1)) >>> 1; + } + + double theta = 0.; // Sum of within-cluster distances + double min = 0, max = 0; // Sum of larges and smallest + if(w <= (rel.size() * (rel.size() - 1L)) >>> 2) { + DoubleHeap maxDists = new DoubleMinHeap(w); // Careful: REALLY minHeap! + DoubleHeap minDists = new DoubleMaxHeap(w); // Careful: REALLY maxHeap! + + FiniteProgress prog = LOG.isVerbose() ? new FiniteProgress("Processing clusters for C-Index", clusters.size(), LOG) : null; + for(int i = 0; i < clusters.size(); i++) { + Cluster<?> cluster = clusters.get(i); + if(cluster.size() <= 1 || cluster.isNoise()) { + switch(noiseOption){ + case IGNORE_NOISE: + LOG.incrementProcessed(prog); + continue; // Ignore + case TREAT_NOISE_AS_SINGLETONS: + processSingleton(cluster, rel, dq, maxDists, minDists, w); + LOG.incrementProcessed(prog); + continue; + case MERGE_NOISE: + break; // Treat like a cluster, below } } + theta += processCluster(cluster, clusters, i, dq, maxDists, minDists, w); + LOG.incrementProcessed(prog); } - } + LOG.ensureCompleted(prog); - // Simulate best and worst cases: - pairDists.sort(); - double min = 0, max = 0; - for(int i = 0, j = pairDists.size() - 1; i < w; i++, j--) { - min += pairDists.get(i); - max += pairDists.get(j); + // Simulate best and worst cases: + assert (minDists.size() == w); + assert (maxDists.size() == w); + for(DoubleHeap.UnsortedIter it = minDists.unsortedIter(); it.valid(); it.advance()) { + min += it.get(); + } + for(DoubleHeap.UnsortedIter it = maxDists.unsortedIter(); it.valid(); it.advance()) { + max += it.get(); + } + assert (max >= min); + } + else { + // Since we have fewer cross-cluster distances than within-cluster + // distances, min=max and cIndex = 0. + theta = min = max = 0; } double cIndex = (max > min) ? (theta - min) / (max - min) : 0.; @@ -189,6 +200,52 @@ public class EvaluateCIndex<O> implements Evaluator { return cIndex; } + protected double processCluster(Cluster<?> cluster, List<? extends Cluster<?>> clusters, int i, DistanceQuery<O> dq, DoubleHeap maxDists, DoubleHeap minDists, int w) { + double theta = 0.; + for(DBIDIter it1 = cluster.getIDs().iter(); it1.valid(); it1.advance()) { + // Compare object to every cluster, but only once + for(int j = i; j < clusters.size(); j++) { + Cluster<?> ocluster = clusters.get(j); + if(ocluster.size() <= 1 || ocluster.isNoise()) { + switch(noiseOption){ + case IGNORE_NOISE: + continue; // Ignore this cluster. + case TREAT_NOISE_AS_SINGLETONS: + break; // Treat like a cluster + case MERGE_NOISE: + break; // Treat like a cluster + } + } + for(DBIDIter it2 = ocluster.getIDs().iter(); it2.valid(); it2.advance()) { + if(DBIDUtil.compare(it1, it2) <= 0) { // Only once. + continue; + } + double dist = dq.distance(it1, it2); + minDists.add(dist, w); + maxDists.add(dist, w); + if(ocluster == cluster) { // Within-cluster distances. + theta += dist; + } + } + } + } + return theta; + } + + protected void processSingleton(Cluster<?> cluster, Relation<? extends O> rel, DistanceQuery<O> dq, DoubleHeap maxDists, DoubleHeap minDists, int w) { + // All other objects are in other clusters! + for(DBIDIter it1 = cluster.getIDs().iter(); it1.valid(); it1.advance()) { + for(DBIDIter it2 = rel.iterDBIDs(); it2.valid(); it2.advance()) { + if(DBIDUtil.compare(it1, it2) <= 0) { // Only once. + continue; + } + double dist = dq.distance(it1, it2); + minDists.add(dist, w); + maxDists.add(dist, w); + } + } + } + @Override public void processNewResult(ResultHierarchy hier, Result result) { List<Clustering<?>> crs = ResultUtil.getClusteringResults(result); diff --git a/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/clustering/internal/EvaluateConcordantPairs.java b/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/clustering/internal/EvaluateConcordantPairs.java index c5d2c199..119e9006 100644 --- a/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/clustering/internal/EvaluateConcordantPairs.java +++ b/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/clustering/internal/EvaluateConcordantPairs.java @@ -73,6 +73,7 @@ import de.lmu.ifi.dbs.elki.utilities.optionhandling.parameters.ObjectParameter; * * @author Stephan Baier * @author Erich Schubert + * @since 0.7.0 * * @apiviz.composedOf NoiseHandling */ @@ -312,7 +313,7 @@ public class EvaluateConcordantPairs<O> implements Evaluator { /** * Parameter for the option, how noise should be treated. */ - public static final OptionID NOISE_ID = new OptionID("davies-bouldin.noisehandling", "option, how noise should be treated."); + public static final OptionID NOISE_ID = new OptionID("concordant-pairs.noisehandling", "Control how noise should be treated."); /** * Distance function to use. diff --git a/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/clustering/internal/EvaluateDaviesBouldin.java b/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/clustering/internal/EvaluateDaviesBouldin.java index ddeef150..d652a13a 100644 --- a/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/clustering/internal/EvaluateDaviesBouldin.java +++ b/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/clustering/internal/EvaluateDaviesBouldin.java @@ -63,6 +63,7 @@ import de.lmu.ifi.dbs.elki.utilities.optionhandling.parameters.ObjectParameter; * </p> * * @author Stephan Baier + * @since 0.7.0 * * @apiviz.composedOf NoiseHandling */ diff --git a/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/clustering/internal/EvaluatePBMIndex.java b/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/clustering/internal/EvaluatePBMIndex.java index 2c3a20e0..5a893887 100644 --- a/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/clustering/internal/EvaluatePBMIndex.java +++ b/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/clustering/internal/EvaluatePBMIndex.java @@ -67,6 +67,7 @@ import de.lmu.ifi.dbs.elki.utilities.optionhandling.parameters.ObjectParameter; * * @author Stephan Baier * @author Erich Schubert + * @since 0.7.0 * * @apiviz.composedOf NoiseHandling */ diff --git a/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/clustering/internal/EvaluateSilhouette.java b/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/clustering/internal/EvaluateSilhouette.java index b40e6086..257ff1ea 100644 --- a/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/clustering/internal/EvaluateSilhouette.java +++ b/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/clustering/internal/EvaluateSilhouette.java @@ -92,6 +92,7 @@ import de.lmu.ifi.dbs.elki.utilities.optionhandling.parameters.ObjectParameter; * TODO: keep all silhouette values, and allow visualization! * * @author Erich Schubert + * @since 0.7.0 * * @apiviz.composedOf NoiseHandling * diff --git a/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/clustering/internal/EvaluateSimplifiedSilhouette.java b/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/clustering/internal/EvaluateSimplifiedSilhouette.java index a3f7e889..7ae8193c 100644 --- a/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/clustering/internal/EvaluateSimplifiedSilhouette.java +++ b/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/clustering/internal/EvaluateSimplifiedSilhouette.java @@ -60,6 +60,7 @@ import de.lmu.ifi.dbs.elki.utilities.optionhandling.parameters.ObjectParameter; * * @author Stephan Baier * @author Erich Schubert + * @since 0.7.0 * * @apiviz.composedOf NoiseHandling */ diff --git a/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/clustering/internal/EvaluateSquaredErrors.java b/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/clustering/internal/EvaluateSquaredErrors.java index eec64fc4..0ea8cbf8 100644 --- a/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/clustering/internal/EvaluateSquaredErrors.java +++ b/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/clustering/internal/EvaluateSquaredErrors.java @@ -87,6 +87,7 @@ import de.lmu.ifi.dbs.elki.utilities.optionhandling.parameters.ObjectParameter; * by k-means. * * @author Erich Schubert + * @since 0.7.0 * * @apiviz.composedOf NoiseHandling */ diff --git a/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/clustering/internal/EvaluateVarianceRatioCriteria.java b/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/clustering/internal/EvaluateVarianceRatioCriteria.java index a48a410c..e8935593 100644 --- a/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/clustering/internal/EvaluateVarianceRatioCriteria.java +++ b/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/clustering/internal/EvaluateVarianceRatioCriteria.java @@ -65,6 +65,7 @@ import de.lmu.ifi.dbs.elki.utilities.optionhandling.parameters.Flag; * * @author Stephan Baier * @author Erich Schubert + * @since 0.7.0 * * @apiviz.composedOf NoiseHandling */ diff --git a/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/clustering/internal/NoiseHandling.java b/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/clustering/internal/NoiseHandling.java index 7145ed94..759636d8 100644 --- a/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/clustering/internal/NoiseHandling.java +++ b/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/clustering/internal/NoiseHandling.java @@ -28,6 +28,7 @@ package de.lmu.ifi.dbs.elki.evaluation.clustering.internal; * * @author Stephan Baier * @author Erich Schubert + * @since 0.7.0 */ public enum NoiseHandling { /** Merge all noise into a cluster */ diff --git a/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/clustering/pairsegments/ClusterPairSegmentAnalysis.java b/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/clustering/pairsegments/ClusterPairSegmentAnalysis.java index 08d92c28..50deb3ce 100644 --- a/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/clustering/pairsegments/ClusterPairSegmentAnalysis.java +++ b/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/clustering/pairsegments/ClusterPairSegmentAnalysis.java @@ -29,17 +29,31 @@ import de.lmu.ifi.dbs.elki.evaluation.Evaluator; import de.lmu.ifi.dbs.elki.result.Result; import de.lmu.ifi.dbs.elki.result.ResultHierarchy; import de.lmu.ifi.dbs.elki.result.ResultUtil; +import de.lmu.ifi.dbs.elki.utilities.documentation.Reference; /** * Evaluate clustering results by building segments for their pairs: shared * pairs and differences. * + * Reference: + * <p> + * Evaluation of Clusterings – Metrics and Visual Support<br /> + * Elke Achtert, Sascha Goldhofer, Hans-Peter Kriegel, Erich Schubert, Arthur + * Zimek<br /> + * In: Proc. 28th International Conference on Data Engineering (ICDE) 2012 + * </p> + * * @author Sascha Goldhofer * @author Erich Schubert + * @since 0.5.0 * * @apiviz.uses Clustering * @apiviz.uses Segments */ +@Reference(title = "Evaluation of Clusterings – Metrics and Visual Support", // +authors = "Elke Achtert, Sascha Goldhofer, Hans-Peter Kriegel, Erich Schubert, Arthur Zimek", // +booktitle = "Proc. 28th International Conference on Data Engineering (ICDE) 2012", // +url = "http://dx.doi.org/10.1109/ICDE.2012.128") public class ClusterPairSegmentAnalysis implements Evaluator { /** * Constructor. @@ -55,7 +69,7 @@ public class ClusterPairSegmentAnalysis implements Evaluator { public void processNewResult(ResultHierarchy hier, Result result) { // Get all new clusterings // TODO: handle clusterings added later, too. Can we update the result? - + List<Clustering<?>> clusterings = ResultUtil.getClusteringResults(result); // Abort if not enough clusterings to compare if(clusterings.size() < 2) { diff --git a/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/clustering/pairsegments/Segment.java b/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/clustering/pairsegments/Segment.java index 1ed31b03..4df28760 100644 --- a/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/clustering/pairsegments/Segment.java +++ b/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/clustering/pairsegments/Segment.java @@ -33,6 +33,10 @@ import de.lmu.ifi.dbs.elki.database.ids.DBIDs; * * As such, for each ring (= clustering), a cluster number (or the constant * {@link #UNCLUSTERED}) is stored. + * + * @author Sascha Goldhofer + * @author Erich Schubert + * @since 0.5.0 */ public class Segment implements Comparable<Segment> { /** diff --git a/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/clustering/pairsegments/Segments.java b/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/clustering/pairsegments/Segments.java index 8b91d5f6..5b59b17f 100644 --- a/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/clustering/pairsegments/Segments.java +++ b/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/clustering/pairsegments/Segments.java @@ -59,8 +59,8 @@ import de.lmu.ifi.dbs.elki.utilities.documentation.Reference; * a corresponding object Segment. * </p> * + * Reference: * <p> - * Reference:<br /> * Evaluation of Clusterings – Metrics and Visual Support<br /> * Elke Achtert, Sascha Goldhofer, Hans-Peter Kriegel, Erich Schubert, Arthur * Zimek<br /> @@ -68,17 +68,21 @@ import de.lmu.ifi.dbs.elki.utilities.documentation.Reference; * </p> * * <p> - * Details on the experimental setup can be found at: <a - * href="http://elki.dbs.ifi.lmu.de/wiki/Examples/ClusterEvaluation" - * >wiki/Examples/ClusterEvaluation</a> + * Details on the experimental setup can be found at: + * <a href="http://elki.dbs.ifi.lmu.de/wiki/Examples/ClusterEvaluation" >wiki/ + * Examples/ClusterEvaluation</a> * </p> * * @author Sascha Goldhofer * @author Erich Schubert + * @since 0.5.0 * * @apiviz.composedOf Segment */ -@Reference(title = "Evaluation of Clusterings – Metrics and Visual Support", authors = "Elke Achtert, Sascha Goldhofer, Hans-Peter Kriegel, Erich Schubert, Arthur Zimek", booktitle = "Proc. 28th International Conference on Data Engineering (ICDE) 2012", url = "http://dx.doi.org/10.1109/ICDE.2012.128") +@Reference(title = "Evaluation of Clusterings – Metrics and Visual Support", // +authors = "Elke Achtert, Sascha Goldhofer, Hans-Peter Kriegel, Erich Schubert, Arthur Zimek", // +booktitle = "Proc. 28th International Conference on Data Engineering (ICDE) 2012", // +url = "http://dx.doi.org/10.1109/ICDE.2012.128") public class Segments extends BasicResult implements Iterable<Segment> { /** * Class logger diff --git a/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/histogram/ComputeOutlierHistogram.java b/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/histogram/ComputeOutlierHistogram.java index 8a6bd542..64a1ce3c 100644 --- a/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/histogram/ComputeOutlierHistogram.java +++ b/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/histogram/ComputeOutlierHistogram.java @@ -66,6 +66,7 @@ import de.lmu.ifi.dbs.elki.utilities.scaling.outlier.OutlierScalingFunction; * * @author Lisa Reichert * @author Erich Schubert + * @since 0.3 * * @apiviz.landmark * @apiviz.uses OutlierResult diff --git a/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/index/IndexPurity.java b/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/index/IndexPurity.java index bde4eaa3..30d3590d 100644 --- a/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/index/IndexPurity.java +++ b/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/index/IndexPurity.java @@ -51,6 +51,7 @@ import de.lmu.ifi.dbs.elki.utilities.DatabaseUtil; * capabilities using the Gini index. * * @author Erich Schubert + * @since 0.5.0 */ public class IndexPurity implements Evaluator { /** diff --git a/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/index/IndexStatistics.java b/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/index/IndexStatistics.java index a137b455..5e01462f 100644 --- a/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/index/IndexStatistics.java +++ b/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/index/IndexStatistics.java @@ -40,6 +40,7 @@ import de.lmu.ifi.dbs.elki.utilities.pairs.Pair; * information. * * @author Erich Schubert + * @since 0.4.0 * * @apiviz.landmark * @apiviz.has IndexMetaResult oneway - - «create» diff --git a/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/outlier/JudgeOutlierScores.java b/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/outlier/JudgeOutlierScores.java index 6674293d..6c84be65 100644 --- a/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/outlier/JudgeOutlierScores.java +++ b/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/outlier/JudgeOutlierScores.java @@ -60,6 +60,7 @@ import de.lmu.ifi.dbs.elki.utilities.scaling.outlier.OutlierScalingFunction; * hits. * * @author Erich Schubert + * @since 0.4.0 * * @apiviz.landmark * @apiviz.has ScoreResult oneway - - «create» diff --git a/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/outlier/OutlierPrecisionAtKCurve.java b/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/outlier/OutlierPrecisionAtKCurve.java index 3ce0e782..a52b829a 100644 --- a/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/outlier/OutlierPrecisionAtKCurve.java +++ b/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/outlier/OutlierPrecisionAtKCurve.java @@ -52,6 +52,7 @@ import de.lmu.ifi.dbs.elki.utilities.optionhandling.parameters.PatternParameter; * method. * * @author Erich Schubert + * @since 0.5.0 * * @apiviz.has PrecisionAtKCurve */ diff --git a/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/outlier/OutlierPrecisionRecallCurve.java b/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/outlier/OutlierPrecisionRecallCurve.java index 3b1d7375..576a0c9b 100644 --- a/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/outlier/OutlierPrecisionRecallCurve.java +++ b/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/outlier/OutlierPrecisionRecallCurve.java @@ -52,6 +52,7 @@ import de.lmu.ifi.dbs.elki.utilities.optionhandling.parameters.PatternParameter; * method. * * @author Erich Schubert + * @since 0.5.0 * * @apiviz.has PRCurve */ diff --git a/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/outlier/OutlierROCCurve.java b/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/outlier/OutlierROCCurve.java index f0ebcd88..540cba6d 100644 --- a/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/outlier/OutlierROCCurve.java +++ b/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/outlier/OutlierROCCurve.java @@ -62,13 +62,15 @@ import de.lmu.ifi.dbs.elki.utilities.optionhandling.parameters.PatternParameter; * clustering obtained via the given class label. * * @author Erich Schubert + * @since 0.2 * * @apiviz.landmark * * @apiviz.uses OutlierResult * @apiviz.has ROCResult oneway - - «create» */ -@Alias({ "ComputeROCCurve", "de.lmu.ifi.dbs.elki.evaluation.roc.ComputeROCCurve" }) +@Alias({ "de.lmu.ifi.dbs.elki.evaluation.roc.ComputeROCCurve", // +"de.lmu.ifi.dbs.elki.evaluation.ComputeROCCurve" }) public class OutlierROCCurve implements Evaluator { /** * The label we use for marking ROCAUC values. @@ -142,7 +144,8 @@ public class OutlierROCCurve implements Evaluator { if(nonefound) { return; - // logger.warning("No results found to process with ROC curve analyzer. Got "+iterables.size()+" iterables, "+orderings.size()+" orderings."); + // logger.warning("No results found to process with ROC curve analyzer. + // Got "+iterables.size()+" iterables, "+orderings.size()+" orderings."); } } @@ -209,6 +212,7 @@ public class OutlierROCCurve implements Evaluator { * </p> */ public static final OptionID POSITIVE_CLASS_NAME_ID = new OptionID("rocauc.positive", "Class label for the 'positive' class."); + /** * Pattern for positive class. */ diff --git a/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/outlier/OutlierRankingEvaluation.java b/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/outlier/OutlierRankingEvaluation.java index 43612178..407b4ec9 100644 --- a/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/outlier/OutlierRankingEvaluation.java +++ b/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/outlier/OutlierRankingEvaluation.java @@ -57,6 +57,7 @@ import de.lmu.ifi.dbs.elki.utilities.optionhandling.parameters.PatternParameter; * Evaluate outlier scores by their ranking * * @author Erich Schubert + * @since 0.2 * * @apiviz.landmark * diff --git a/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/outlier/OutlierSmROCCurve.java b/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/outlier/OutlierSmROCCurve.java index b39211df..49ff1a42 100644 --- a/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/outlier/OutlierSmROCCurve.java +++ b/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/outlier/OutlierSmROCCurve.java @@ -67,6 +67,7 @@ import de.lmu.ifi.dbs.elki.utilities.optionhandling.parameters.PatternParameter; * </p> * * @author Erich Schubert + * @since 0.5.0 * * @apiviz.uses OutlierResult * @apiviz.has SmROCResult oneway - - «create» diff --git a/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/outlier/OutlierThresholdClustering.java b/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/outlier/OutlierThresholdClustering.java index 9220d06e..9993e457 100644 --- a/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/outlier/OutlierThresholdClustering.java +++ b/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/outlier/OutlierThresholdClustering.java @@ -54,6 +54,7 @@ import de.lmu.ifi.dbs.elki.utilities.scaling.outlier.OutlierScalingFunction; * dataset. * * @author Erich Schubert + * @since 0.5.0 */ public class OutlierThresholdClustering implements Evaluator { /** diff --git a/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/scores/AbstractScoreEvaluation.java b/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/scores/AbstractScoreEvaluation.java index 9f8e66df..bebb3e71 100644 --- a/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/scores/AbstractScoreEvaluation.java +++ b/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/scores/AbstractScoreEvaluation.java @@ -36,6 +36,7 @@ import de.lmu.ifi.dbs.elki.result.outlier.OutlierResult; * Abstract base class for evaluating a scoring result. * * @author Erich Schubert + * @since 0.7.0 */ public abstract class AbstractScoreEvaluation implements ScoreEvaluation { @Override diff --git a/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/scores/AveragePrecisionEvaluation.java b/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/scores/AveragePrecisionEvaluation.java index fadcb3cf..51fe6c59 100644 --- a/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/scores/AveragePrecisionEvaluation.java +++ b/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/scores/AveragePrecisionEvaluation.java @@ -28,6 +28,7 @@ import de.lmu.ifi.dbs.elki.utilities.optionhandling.AbstractParameterizer; * Evaluate using average precision. * * @author Erich Schubert + * @since 0.7.0 */ public class AveragePrecisionEvaluation extends AbstractScoreEvaluation { /** diff --git a/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/scores/MaximumF1Evaluation.java b/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/scores/MaximumF1Evaluation.java index dce8a84b..4d96eaaa 100644 --- a/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/scores/MaximumF1Evaluation.java +++ b/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/scores/MaximumF1Evaluation.java @@ -28,6 +28,7 @@ import de.lmu.ifi.dbs.elki.utilities.optionhandling.AbstractParameterizer; * Evaluate using the maximum F1 score. * * @author Erich Schubert + * @since 0.7.0 */ public class MaximumF1Evaluation extends AbstractScoreEvaluation { /** diff --git a/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/scores/PrecisionAtKEvaluation.java b/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/scores/PrecisionAtKEvaluation.java index 3850dd3a..ba6786b9 100644 --- a/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/scores/PrecisionAtKEvaluation.java +++ b/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/scores/PrecisionAtKEvaluation.java @@ -36,6 +36,7 @@ import de.lmu.ifi.dbs.elki.utilities.optionhandling.parameters.IntParameter; * (BEP). * * @author Erich Schubert + * @since 0.7.0 */ public class PrecisionAtKEvaluation extends AbstractScoreEvaluation { /** diff --git a/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/scores/ROCEvaluation.java b/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/scores/ROCEvaluation.java index 32551238..416ecda1 100644 --- a/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/scores/ROCEvaluation.java +++ b/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/scores/ROCEvaluation.java @@ -43,6 +43,7 @@ import de.lmu.ifi.dbs.elki.utilities.optionhandling.AbstractParameterizer; * has been used the wrong way, and should be used backwards. * * @author Erich Schubert + * @since 0.7.0 * * @apiviz.has XYCurve */ diff --git a/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/scores/ScoreEvaluation.java b/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/scores/ScoreEvaluation.java index 2f989609..053033e9 100644 --- a/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/scores/ScoreEvaluation.java +++ b/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/scores/ScoreEvaluation.java @@ -33,6 +33,7 @@ import de.lmu.ifi.dbs.elki.utilities.datastructures.iterator.Iter; * Compute ranking/scoring based evaluation measures. * * @author Erich Schubert + * @since 0.7.0 * * @apiviz.has ScoreIter * @apiviz.uses Predicate diff --git a/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/scores/adapter/AbstractVectorIter.java b/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/scores/adapter/AbstractVectorIter.java index f75844a0..70e6618c 100644 --- a/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/scores/adapter/AbstractVectorIter.java +++ b/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/scores/adapter/AbstractVectorIter.java @@ -30,6 +30,7 @@ import de.lmu.ifi.dbs.elki.utilities.datastructures.iterator.ArrayIter; * Class to iterate over a number vector in decreasing order. * * @author Erich Schubert + * @since 0.7.0 * * @apiviz.composedOf NumberVector */ diff --git a/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/scores/adapter/DBIDRefIter.java b/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/scores/adapter/DBIDRefIter.java index 3b246327..918a235c 100644 --- a/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/scores/adapter/DBIDRefIter.java +++ b/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/scores/adapter/DBIDRefIter.java @@ -28,6 +28,7 @@ import de.lmu.ifi.dbs.elki.database.ids.DBIDRef; * A score iterator wrapping a DBIDRef object. * * @author Erich Schubert + * @since 0.4.0 */ public interface DBIDRefIter { /** diff --git a/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/scores/adapter/DBIDsTest.java b/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/scores/adapter/DBIDsTest.java index 9e1b29e9..d1c65fbe 100644 --- a/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/scores/adapter/DBIDsTest.java +++ b/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/scores/adapter/DBIDsTest.java @@ -31,6 +31,7 @@ import de.lmu.ifi.dbs.elki.evaluation.scores.ScoreEvaluation.Predicate; * @apiviz.composedOf DBIDs * * @author Erich Schubert + * @since 0.7.0 */ public class DBIDsTest implements Predicate<DBIDRefIter> { /** diff --git a/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/scores/adapter/DecreasingVectorIter.java b/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/scores/adapter/DecreasingVectorIter.java index 953f656c..9da00a3e 100644 --- a/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/scores/adapter/DecreasingVectorIter.java +++ b/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/scores/adapter/DecreasingVectorIter.java @@ -31,6 +31,7 @@ import de.lmu.ifi.dbs.elki.utilities.datastructures.arrays.IntegerComparator; * Class to iterate over a number vector in decreasing order. * * @author Erich Schubert + * @since 0.7.0 * * @apiviz.composedOf NumberVector */ diff --git a/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/scores/adapter/DistanceResultAdapter.java b/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/scores/adapter/DistanceResultAdapter.java index cd1a5142..53a165ba 100644 --- a/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/scores/adapter/DistanceResultAdapter.java +++ b/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/scores/adapter/DistanceResultAdapter.java @@ -32,6 +32,7 @@ import de.lmu.ifi.dbs.elki.evaluation.scores.ScoreEvaluation.ScoreIter; * ties. * * @author Erich Schubert + * @since 0.7.0 * * @apiviz.composedOf DoubleDBIDListIter */ diff --git a/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/scores/adapter/FilteredDistanceResultAdapter.java b/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/scores/adapter/FilteredDistanceResultAdapter.java index 28c23251..4309e138 100644 --- a/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/scores/adapter/FilteredDistanceResultAdapter.java +++ b/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/scores/adapter/FilteredDistanceResultAdapter.java @@ -32,6 +32,7 @@ import de.lmu.ifi.dbs.elki.database.ids.DoubleDBIDListIter; * appropriately, the score is only used to detect ties. * * @author Erich Schubert + * @since 0.7.0 */ public class FilteredDistanceResultAdapter extends DistanceResultAdapter { /** diff --git a/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/scores/adapter/IncreasingVectorIter.java b/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/scores/adapter/IncreasingVectorIter.java index 091a6fa1..d94c2990 100644 --- a/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/scores/adapter/IncreasingVectorIter.java +++ b/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/scores/adapter/IncreasingVectorIter.java @@ -31,6 +31,7 @@ import de.lmu.ifi.dbs.elki.utilities.datastructures.arrays.IntegerComparator; * Class to iterate over a number vector in decreasing order. * * @author Erich Schubert + * @since 0.7.0 * * @apiviz.composedOf NumberVector */ diff --git a/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/scores/adapter/OutlierScoreAdapter.java b/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/scores/adapter/OutlierScoreAdapter.java index 6dcf516a..3ff35876 100644 --- a/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/scores/adapter/OutlierScoreAdapter.java +++ b/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/scores/adapter/OutlierScoreAdapter.java @@ -37,6 +37,7 @@ import de.lmu.ifi.dbs.elki.result.outlier.OutlierResult; * The ROC values would be incorrect then anyway! * * @author Erich Schubert + * @since 0.7.0 * * @apiviz.composedOf OutlierResult */ diff --git a/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/scores/adapter/SimpleAdapter.java b/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/scores/adapter/SimpleAdapter.java index e91f0f6d..681cdcdd 100644 --- a/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/scores/adapter/SimpleAdapter.java +++ b/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/scores/adapter/SimpleAdapter.java @@ -36,6 +36,7 @@ import de.lmu.ifi.dbs.elki.evaluation.scores.ScoreEvaluation.ScoreIter; * The ROC values would be incorrect then anyway! * * @author Erich Schubert + * @since 0.7.0 * * @apiviz.composedOf DBIDIter */ diff --git a/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/scores/adapter/VectorNonZero.java b/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/scores/adapter/VectorNonZero.java index 343fa662..52753243 100644 --- a/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/scores/adapter/VectorNonZero.java +++ b/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/scores/adapter/VectorNonZero.java @@ -31,6 +31,7 @@ import de.lmu.ifi.dbs.elki.data.NumberVector; * @apiviz.composedOf NumberVector * * @author Erich Schubert + * @since 0.7.0 */ public class VectorNonZero extends VectorOverThreshold { /** diff --git a/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/scores/adapter/VectorOverThreshold.java b/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/scores/adapter/VectorOverThreshold.java index e35db2ee..b77df57b 100644 --- a/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/scores/adapter/VectorOverThreshold.java +++ b/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/scores/adapter/VectorOverThreshold.java @@ -33,6 +33,7 @@ import de.lmu.ifi.dbs.elki.evaluation.scores.ScoreEvaluation.Predicate; * @apiviz.composedOf NumberVector * * @author Erich Schubert + * @since 0.7.0 */ public class VectorOverThreshold implements Predicate<AbstractVectorIter> { /** diff --git a/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/scores/adapter/VectorZero.java b/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/scores/adapter/VectorZero.java index 08e694f9..aeead25b 100644 --- a/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/scores/adapter/VectorZero.java +++ b/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/scores/adapter/VectorZero.java @@ -32,6 +32,7 @@ import de.lmu.ifi.dbs.elki.evaluation.scores.ScoreEvaluation.Predicate; * @apiviz.composedOf NumberVector * * @author Erich Schubert + * @since 0.7.0 */ public class VectorZero implements Predicate<IncreasingVectorIter> { /** diff --git a/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/similaritymatrix/ComputeSimilarityMatrixImage.java b/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/similaritymatrix/ComputeSimilarityMatrixImage.java index d7883620..a5cf462c 100644 --- a/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/similaritymatrix/ComputeSimilarityMatrixImage.java +++ b/elki/src/main/java/de/lmu/ifi/dbs/elki/evaluation/similaritymatrix/ComputeSimilarityMatrixImage.java @@ -65,6 +65,7 @@ import de.lmu.ifi.dbs.elki.utilities.scaling.ScalingFunction; * Compute a similarity matrix for a distance function. * * @author Erich Schubert + * @since 0.4.0 * * @apiviz.has SimilarityMatrix oneway - - «create» * |