summaryrefslogtreecommitdiff
path: root/src/de/lmu/ifi/dbs/elki/evaluation/outlier
diff options
context:
space:
mode:
Diffstat (limited to 'src/de/lmu/ifi/dbs/elki/evaluation/outlier')
-rw-r--r--src/de/lmu/ifi/dbs/elki/evaluation/outlier/JudgeOutlierScores.java6
-rw-r--r--src/de/lmu/ifi/dbs/elki/evaluation/outlier/OutlierPrecisionAtKCurve.java2
-rw-r--r--src/de/lmu/ifi/dbs/elki/evaluation/outlier/OutlierPrecisionRecallCurve.java8
-rw-r--r--src/de/lmu/ifi/dbs/elki/evaluation/outlier/OutlierROCCurve.java35
-rw-r--r--src/de/lmu/ifi/dbs/elki/evaluation/outlier/OutlierRankingEvaluation.java211
-rw-r--r--src/de/lmu/ifi/dbs/elki/evaluation/outlier/OutlierSmROCCurve.java23
-rw-r--r--src/de/lmu/ifi/dbs/elki/evaluation/outlier/OutlierThresholdClustering.java8
-rw-r--r--src/de/lmu/ifi/dbs/elki/evaluation/outlier/package-info.java2
8 files changed, 253 insertions, 42 deletions
diff --git a/src/de/lmu/ifi/dbs/elki/evaluation/outlier/JudgeOutlierScores.java b/src/de/lmu/ifi/dbs/elki/evaluation/outlier/JudgeOutlierScores.java
index 1639515a..ff34f7c0 100644
--- a/src/de/lmu/ifi/dbs/elki/evaluation/outlier/JudgeOutlierScores.java
+++ b/src/de/lmu/ifi/dbs/elki/evaluation/outlier/JudgeOutlierScores.java
@@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.evaluation.outlier;
This file is part of ELKI:
Environment for Developing KDD-Applications Supported by Index-Structures
- Copyright (C) 2012
+ Copyright (C) 2014
Ludwig-Maximilians-Universität München
Lehr- und Forschungseinheit für Datenbanksysteme
ELKI Development Team
@@ -147,12 +147,12 @@ public class JudgeOutlierScores implements Evaluator {
double negscore = 0.0;
// fill histogram with values of each object
for (DBIDIter iter = ids.iter(); iter.valid(); iter.advance()) {
- double result = or.getScores().get(iter);
+ double result = or.getScores().doubleValue(iter);
result = innerScaling.getScaled(scaling.getScaled(result));
posscore += (1.0 - result);
}
for (DBIDIter iter = outlierIds.iter(); iter.valid(); iter.advance()) {
- double result = or.getScores().get(iter);
+ double result = or.getScores().doubleValue(iter);
result = innerScaling.getScaled(scaling.getScaled(result));
negscore += result;
}
diff --git a/src/de/lmu/ifi/dbs/elki/evaluation/outlier/OutlierPrecisionAtKCurve.java b/src/de/lmu/ifi/dbs/elki/evaluation/outlier/OutlierPrecisionAtKCurve.java
index 72967d58..f876469c 100644
--- a/src/de/lmu/ifi/dbs/elki/evaluation/outlier/OutlierPrecisionAtKCurve.java
+++ b/src/de/lmu/ifi/dbs/elki/evaluation/outlier/OutlierPrecisionAtKCurve.java
@@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.evaluation.outlier;
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
diff --git a/src/de/lmu/ifi/dbs/elki/evaluation/outlier/OutlierPrecisionRecallCurve.java b/src/de/lmu/ifi/dbs/elki/evaluation/outlier/OutlierPrecisionRecallCurve.java
index a3d9d92f..8ac9a559 100644
--- a/src/de/lmu/ifi/dbs/elki/evaluation/outlier/OutlierPrecisionRecallCurve.java
+++ b/src/de/lmu/ifi/dbs/elki/evaluation/outlier/OutlierPrecisionRecallCurve.java
@@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.evaluation.outlier;
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
@@ -31,7 +31,7 @@ import de.lmu.ifi.dbs.elki.database.ids.DBIDIter;
import de.lmu.ifi.dbs.elki.database.ids.DBIDUtil;
import de.lmu.ifi.dbs.elki.database.ids.DBIDs;
import de.lmu.ifi.dbs.elki.database.ids.SetDBIDs;
-import de.lmu.ifi.dbs.elki.database.relation.Relation;
+import de.lmu.ifi.dbs.elki.database.relation.DoubleRelation;
import de.lmu.ifi.dbs.elki.evaluation.Evaluator;
import de.lmu.ifi.dbs.elki.logging.Logging;
import de.lmu.ifi.dbs.elki.math.geometry.XYCurve;
@@ -116,7 +116,7 @@ public class OutlierPrecisionRecallCurve implements Evaluator {
}
}
- private XYCurve computePrecisionResult(int size, SetDBIDs ids, DBIDIter iter, Relation<Double> scores) {
+ private XYCurve computePrecisionResult(int size, SetDBIDs ids, DBIDIter iter, DoubleRelation scores) {
final int postot = ids.size();
int poscnt = 0, total = 0;
XYCurve curve = new PRCurve(postot + 2, postot);
@@ -140,7 +140,7 @@ public class OutlierPrecisionRecallCurve implements Evaluator {
}
// defer calculation for ties
if (scores != null) {
- double curscore = scores.get(iter);
+ double curscore = scores.doubleValue(iter);
if (Double.compare(prevscore, curscore) == 0) {
continue;
}
diff --git a/src/de/lmu/ifi/dbs/elki/evaluation/outlier/OutlierROCCurve.java b/src/de/lmu/ifi/dbs/elki/evaluation/outlier/OutlierROCCurve.java
index 0d92c50a..fc7250c1 100644
--- a/src/de/lmu/ifi/dbs/elki/evaluation/outlier/OutlierROCCurve.java
+++ b/src/de/lmu/ifi/dbs/elki/evaluation/outlier/OutlierROCCurve.java
@@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.evaluation.outlier;
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
@@ -31,7 +31,10 @@ import de.lmu.ifi.dbs.elki.database.ids.DBIDUtil;
import de.lmu.ifi.dbs.elki.database.ids.DBIDs;
import de.lmu.ifi.dbs.elki.database.ids.SetDBIDs;
import de.lmu.ifi.dbs.elki.evaluation.Evaluator;
-import de.lmu.ifi.dbs.elki.evaluation.roc.ROC;
+import de.lmu.ifi.dbs.elki.evaluation.scores.ROCEvaluation;
+import de.lmu.ifi.dbs.elki.evaluation.scores.adapter.DBIDsTest;
+import de.lmu.ifi.dbs.elki.evaluation.scores.adapter.OutlierScoreAdapter;
+import de.lmu.ifi.dbs.elki.evaluation.scores.adapter.SimpleAdapter;
import de.lmu.ifi.dbs.elki.logging.Logging;
import de.lmu.ifi.dbs.elki.math.geometry.XYCurve;
import de.lmu.ifi.dbs.elki.result.HierarchicalResult;
@@ -103,30 +106,26 @@ public class OutlierROCCurve implements Evaluator {
}
private ROCResult computeROCResult(int size, SetDBIDs positiveids, DBIDs order) {
- if (order.size() != size) {
+ if(order.size() != size) {
throw new IllegalStateException("Iterable result doesn't match database size - incomplete ordering?");
}
- XYCurve roccurve = ROC.materializeROC(new ROC.DBIDsTest(positiveids), new ROC.SimpleAdapter(order.iter()));
+ XYCurve roccurve = ROCEvaluation.materializeROC(new DBIDsTest(positiveids), new SimpleAdapter(order.iter()));
double rocauc = XYCurve.areaUnderCurve(roccurve);
- if (LOG.isVerbose()) {
+ if(LOG.isVerbose()) {
LOG.verbose(ROCAUC_LABEL + ": " + rocauc);
}
- final ROCResult rocresult = new ROCResult(roccurve, rocauc);
-
- return rocresult;
+ return new ROCResult(roccurve, rocauc);
}
private ROCResult computeROCResult(int size, SetDBIDs positiveids, OutlierResult or) {
- XYCurve roccurve = ROC.materializeROC(new ROC.DBIDsTest(positiveids), new ROC.OutlierScoreAdapter(or));
+ XYCurve roccurve = ROCEvaluation.materializeROC(new DBIDsTest(positiveids), new OutlierScoreAdapter(or));
double rocauc = XYCurve.areaUnderCurve(roccurve);
- if (LOG.isVerbose()) {
+ if(LOG.isVerbose()) {
LOG.verbose(ROCAUC_LABEL + ": " + rocauc);
}
- final ROCResult rocresult = new ROCResult(roccurve, rocauc);
-
- return rocresult;
+ return new ROCResult(roccurve, rocauc);
}
@Override
@@ -135,7 +134,7 @@ public class OutlierROCCurve implements Evaluator {
// Prepare
SetDBIDs positiveids = DBIDUtil.ensureSet(DatabaseUtil.getObjectsByLabelMatch(db, positiveClassName));
- if (positiveids.size() == 0) {
+ if(positiveids.size() == 0) {
LOG.warning("Computing a ROC curve failed - no objects matched.");
return;
}
@@ -144,7 +143,7 @@ public class OutlierROCCurve implements Evaluator {
List<OutlierResult> oresults = ResultUtil.getOutlierResults(result);
List<OrderingResult> orderings = ResultUtil.getOrderingResults(result);
// Outlier results are the main use case.
- for (OutlierResult o : oresults) {
+ for(OutlierResult o : oresults) {
db.getHierarchy().add(o, computeROCResult(o.getScores().size(), positiveids, o));
// Process them only once.
orderings.remove(o.getOrdering());
@@ -153,13 +152,13 @@ public class OutlierROCCurve implements Evaluator {
// FIXME: find appropriate place to add the derived result
// otherwise apply an ordering to the database IDs.
- for (OrderingResult or : orderings) {
+ for(OrderingResult or : orderings) {
DBIDs sorted = or.iter(or.getDBIDs());
db.getHierarchy().add(or, computeROCResult(or.getDBIDs().size(), positiveids, sorted));
nonefound = false;
}
- if (nonefound) {
+ if(nonefound) {
return;
// logger.warning("No results found to process with ROC curve analyzer. Got "+iterables.size()+" iterables, "+orderings.size()+" orderings.");
}
@@ -229,7 +228,7 @@ public class OutlierROCCurve implements Evaluator {
protected void makeOptions(Parameterization config) {
super.makeOptions(config);
PatternParameter positiveClassNameP = new PatternParameter(POSITIVE_CLASS_NAME_ID);
- if (config.grab(positiveClassNameP)) {
+ if(config.grab(positiveClassNameP)) {
positiveClassName = positiveClassNameP.getValue();
}
}
diff --git a/src/de/lmu/ifi/dbs/elki/evaluation/outlier/OutlierRankingEvaluation.java b/src/de/lmu/ifi/dbs/elki/evaluation/outlier/OutlierRankingEvaluation.java
new file mode 100644
index 00000000..f78a9790
--- /dev/null
+++ b/src/de/lmu/ifi/dbs/elki/evaluation/outlier/OutlierRankingEvaluation.java
@@ -0,0 +1,211 @@
+package de.lmu.ifi.dbs.elki.evaluation.outlier;
+
+/*
+ This file is part of ELKI:
+ Environment for Developing KDD-Applications Supported by Index-Structures
+
+ Copyright (C) 2014
+ Ludwig-Maximilians-Universität München
+ Lehr- und Forschungseinheit für Datenbanksysteme
+ ELKI Development Team
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Affero General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+import java.util.List;
+import java.util.regex.Pattern;
+
+import de.lmu.ifi.dbs.elki.database.Database;
+import de.lmu.ifi.dbs.elki.database.ids.DBIDUtil;
+import de.lmu.ifi.dbs.elki.database.ids.DBIDs;
+import de.lmu.ifi.dbs.elki.database.ids.SetDBIDs;
+import de.lmu.ifi.dbs.elki.evaluation.Evaluator;
+import de.lmu.ifi.dbs.elki.evaluation.scores.AveragePrecisionEvaluation;
+import de.lmu.ifi.dbs.elki.evaluation.scores.MaximumF1Evaluation;
+import de.lmu.ifi.dbs.elki.evaluation.scores.PrecisionAtKEvaluation;
+import de.lmu.ifi.dbs.elki.evaluation.scores.ROCEvaluation;
+import de.lmu.ifi.dbs.elki.evaluation.scores.adapter.DBIDsTest;
+import de.lmu.ifi.dbs.elki.evaluation.scores.adapter.OutlierScoreAdapter;
+import de.lmu.ifi.dbs.elki.evaluation.scores.adapter.SimpleAdapter;
+import de.lmu.ifi.dbs.elki.logging.Logging;
+import de.lmu.ifi.dbs.elki.logging.statistics.DoubleStatistic;
+import de.lmu.ifi.dbs.elki.result.EvaluationResult;
+import de.lmu.ifi.dbs.elki.result.EvaluationResult.MeasurementGroup;
+import de.lmu.ifi.dbs.elki.result.HierarchicalResult;
+import de.lmu.ifi.dbs.elki.result.OrderingResult;
+import de.lmu.ifi.dbs.elki.result.Result;
+import de.lmu.ifi.dbs.elki.result.ResultUtil;
+import de.lmu.ifi.dbs.elki.result.outlier.OutlierResult;
+import de.lmu.ifi.dbs.elki.utilities.DatabaseUtil;
+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;
+import de.lmu.ifi.dbs.elki.utilities.optionhandling.parameters.PatternParameter;
+
+/**
+ * Evaluate outlier scores by their ranking
+ *
+ * @author Erich Schubert
+ *
+ * @apiviz.landmark
+ *
+ * @apiviz.uses OutlierResult
+ * @apiviz.has EvaluationResult oneway - - «create»
+ */
+public class OutlierRankingEvaluation implements Evaluator {
+ /**
+ * The logger.
+ */
+ private static final Logging LOG = Logging.getLogger(OutlierRankingEvaluation.class);
+
+ /**
+ * The pattern to identify positive classes.
+ *
+ * <p>
+ * Key: {@code -rocauc.positive}
+ * </p>
+ */
+ public static final OptionID POSITIVE_CLASS_NAME_ID = new OptionID("outliereval.positive", "Class label for the 'positive' class.");
+
+ /**
+ * Stores the "positive" class.
+ */
+ private Pattern positiveClassName;
+
+ /**
+ * Key prefix for statistics logging.
+ */
+ private String key = OutlierRankingEvaluation.class.getName();
+
+ /**
+ * Constructor.
+ *
+ * @param positive_class_name Positive class name pattern
+ */
+ public OutlierRankingEvaluation(Pattern positive_class_name) {
+ super();
+ this.positiveClassName = positive_class_name;
+ }
+
+ private EvaluationResult evaluateOutlierResult(int size, SetDBIDs positiveids, OutlierResult or) {
+ EvaluationResult res = new EvaluationResult("Evaluation of ranking", "ranking-evaluation");
+ DBIDsTest test = new DBIDsTest(positiveids);
+
+ MeasurementGroup g = res.newGroup("Evaluation measures");
+ double rocauc = ROCEvaluation.STATIC.evaluate(test, new OutlierScoreAdapter(or));
+ g.addMeasure("ROC AUC", rocauc, 0., 1. ,.5, false);
+ double avep = AveragePrecisionEvaluation.STATIC.evaluate(test, new OutlierScoreAdapter(or));
+ g.addMeasure("Average Precision", avep, 0., 1., 0., false);
+ double rprec = PrecisionAtKEvaluation.RPRECISION.evaluate(test, new OutlierScoreAdapter(or));
+ g.addMeasure("R-Precision", rprec, 0., 1., 0., false);
+ double maxf1 = MaximumF1Evaluation.STATIC.evaluate(test, new OutlierScoreAdapter(or));
+ g.addMeasure("Maximum F1", maxf1, 0., 1., 0., false);
+ if(LOG.isStatistics()) {
+ LOG.statistics(new DoubleStatistic(key + ".rocauc", rocauc));
+ LOG.statistics(new DoubleStatistic(key + ".precision.average", rocauc));
+ LOG.statistics(new DoubleStatistic(key + ".precision.r", rocauc));
+ LOG.statistics(new DoubleStatistic(key + ".f1.maximum", rocauc));
+ }
+ return res;
+ }
+
+ private EvaluationResult evaluateOrderingResult(int size, SetDBIDs positiveids, DBIDs order) {
+ if(order.size() != size) {
+ throw new IllegalStateException("Iterable result doesn't match database size - incomplete ordering?");
+ }
+
+ EvaluationResult res = new EvaluationResult("Evaluation of ranking", "ranking-evaluation");
+ DBIDsTest test = new DBIDsTest(positiveids);
+
+ MeasurementGroup g = res.newGroup("Evaluation measures");
+ double rocauc = ROCEvaluation.STATIC.evaluate(test, new SimpleAdapter(order.iter()));
+ g.addMeasure("ROC AUC", rocauc, 0., 1. ,.5, false);
+ double avep = AveragePrecisionEvaluation.STATIC.evaluate(test, new SimpleAdapter(order.iter()));
+ g.addMeasure("Average Precision", avep, 0., 1., 0., false);
+ double rprec = PrecisionAtKEvaluation.RPRECISION.evaluate(test, new SimpleAdapter(order.iter()));
+ g.addMeasure("R-Precision", rprec, 0., 1., 0., false);
+ double maxf1 = MaximumF1Evaluation.STATIC.evaluate(test, new SimpleAdapter(order.iter()));
+ g.addMeasure("Maximum F1", maxf1, 0., 1., 0., false);
+ if(LOG.isStatistics()) {
+ LOG.statistics(new DoubleStatistic(key + ".rocauc", rocauc));
+ LOG.statistics(new DoubleStatistic(key + ".precision.average", rocauc));
+ LOG.statistics(new DoubleStatistic(key + ".precision.r", rocauc));
+ LOG.statistics(new DoubleStatistic(key + ".f1.maximum", rocauc));
+ }
+ return res;
+ }
+
+ @Override
+ public void processNewResult(HierarchicalResult baseResult, Result result) {
+ Database db = ResultUtil.findDatabase(baseResult);
+ SetDBIDs positiveids = DBIDUtil.ensureSet(DatabaseUtil.getObjectsByLabelMatch(db, positiveClassName));
+
+ if(positiveids.size() == 0) {
+ LOG.warning("Cannot evaluate outlier results - no objects matched the given pattern.");
+ return;
+ }
+
+ boolean nonefound = true;
+ List<OutlierResult> oresults = ResultUtil.getOutlierResults(result);
+ List<OrderingResult> orderings = ResultUtil.getOrderingResults(result);
+ // Outlier results are the main use case.
+ for(OutlierResult o : oresults) {
+ db.getHierarchy().add(o, evaluateOutlierResult(o.getScores().size(), positiveids, o));
+ // Process them only once.
+ orderings.remove(o.getOrdering());
+ nonefound = false;
+ }
+
+ // FIXME: find appropriate place to add the derived result
+ // otherwise apply an ordering to the database IDs.
+ for(OrderingResult or : orderings) {
+ DBIDs sorted = or.iter(or.getDBIDs());
+ db.getHierarchy().add(or, evaluateOrderingResult(or.getDBIDs().size(), positiveids, sorted));
+ nonefound = false;
+ }
+
+ if(nonefound) {
+ return;
+ // logger.warning("No results found to process with ROC curve analyzer. Got "+iterables.size()+" iterables, "+orderings.size()+" orderings.");
+ }
+ }
+
+ /**
+ * Parameterization class.
+ *
+ * @author Erich Schubert
+ *
+ * @apiviz.exclude
+ */
+ public static class Parameterizer extends AbstractParameterizer {
+ /**
+ * Pattern for positive class.
+ */
+ protected Pattern positiveClassName = null;
+
+ @Override
+ protected void makeOptions(Parameterization config) {
+ super.makeOptions(config);
+ PatternParameter positiveClassNameP = new PatternParameter(POSITIVE_CLASS_NAME_ID);
+ if(config.grab(positiveClassNameP)) {
+ positiveClassName = positiveClassNameP.getValue();
+ }
+ }
+
+ @Override
+ protected OutlierRankingEvaluation makeInstance() {
+ return new OutlierRankingEvaluation(positiveClassName);
+ }
+ }
+}
diff --git a/src/de/lmu/ifi/dbs/elki/evaluation/outlier/OutlierSmROCCurve.java b/src/de/lmu/ifi/dbs/elki/evaluation/outlier/OutlierSmROCCurve.java
index 71ec42f5..3400a4bf 100644
--- a/src/de/lmu/ifi/dbs/elki/evaluation/outlier/OutlierSmROCCurve.java
+++ b/src/de/lmu/ifi/dbs/elki/evaluation/outlier/OutlierSmROCCurve.java
@@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.evaluation.outlier;
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
@@ -30,7 +30,7 @@ import de.lmu.ifi.dbs.elki.database.Database;
import de.lmu.ifi.dbs.elki.database.ids.DBIDIter;
import de.lmu.ifi.dbs.elki.database.ids.DBIDUtil;
import de.lmu.ifi.dbs.elki.database.ids.SetDBIDs;
-import de.lmu.ifi.dbs.elki.database.relation.Relation;
+import de.lmu.ifi.dbs.elki.database.relation.DoubleRelation;
import de.lmu.ifi.dbs.elki.evaluation.Evaluator;
import de.lmu.ifi.dbs.elki.logging.Logging;
import de.lmu.ifi.dbs.elki.math.geometry.XYCurve;
@@ -60,20 +60,21 @@ import de.lmu.ifi.dbs.elki.utilities.optionhandling.parameters.PatternParameter;
* However, this method has some deficiencies when the mean score is not 0.5, as
* discussed in:
* <p>
- * E. Schubert, R. Wojdanowski, A. Zimek, H.-P. Kriegel<br>
- * On Evaluation of Outlier Rankings and Outlier Scores<br>
+ * E. Schubert, R. Wojdanowski, A. Zimek, H.-P. Kriegel<br />
+ * On Evaluation of Outlier Rankings and Outlier Scores<br />
* In Proceedings of the 12th SIAM International Conference on Data Mining
* (SDM), Anaheim, CA, 2012.
* </p>
*
* @author Erich Schubert
*
- * @apiviz.landmark
- *
* @apiviz.uses OutlierResult
* @apiviz.has SmROCResult oneway - - «create»
*/
-@Reference(authors = "W. Klement, P. A. Flach, N. Japkowicz, S. Matwin", title = "Smooth Receiver Operating Characteristics (smROC) Curves", booktitle = "In: European Conference on Machine Learning and Principles and Practice of Knowledge Discovery in Databases (ECML-PKDD'11)", url = "http://dx.doi.org/10.1007/978-3-642-23783-6_13")
+@Reference(authors = "W. Klement, P. A. Flach, N. Japkowicz, S. Matwin", //
+title = "Smooth Receiver Operating Characteristics (smROC) Curves", //
+booktitle = "In: European Conference on Machine Learning and Principles and Practice of Knowledge Discovery in Databases (ECML-PKDD'11)", //
+url = "http://dx.doi.org/10.1007/978-3-642-23783-6_13")
public class OutlierSmROCCurve implements Evaluator {
/**
* The label we use for marking ROCAUC values.
@@ -101,13 +102,13 @@ public class OutlierSmROCCurve implements Evaluator {
}
private SmROCResult computeSmROCResult(SetDBIDs positiveids, OutlierResult or) {
- Relation<Double> scores = or.getScores();
+ DoubleRelation scores = or.getScores();
final int size = scores.size();
// Compute mean, for inversion
double mean = 0.0;
for(DBIDIter iditer = scores.iterDBIDs(); iditer.valid(); iditer.advance()) {
- mean += scores.get(iditer) / size;
+ mean += scores.doubleValue(iditer) / size;
}
SmROCResult curve = new SmROCResult(positiveids.size() + 2);
@@ -118,9 +119,9 @@ public class OutlierSmROCCurve implements Evaluator {
int poscnt = 0, negcnt = 0;
double prevscore = Double.NaN;
double x = 0, y = 0;
- for (DBIDIter nei = or.getOrdering().iter(or.getOrdering().getDBIDs()).iter(); nei.valid(); nei.advance()) {
+ for(DBIDIter nei = or.getOrdering().iter(or.getOrdering().getDBIDs()).iter(); nei.valid(); nei.advance()) {
// Analyze next point
- final double curscore = scores.get(nei);
+ final double curscore = scores.doubleValue(nei);
// defer calculation for ties
if(!Double.isNaN(prevscore) && (Double.compare(prevscore, curscore) == 0)) {
// positive or negative match?
diff --git a/src/de/lmu/ifi/dbs/elki/evaluation/outlier/OutlierThresholdClustering.java b/src/de/lmu/ifi/dbs/elki/evaluation/outlier/OutlierThresholdClustering.java
index 04233378..5591df3f 100644
--- a/src/de/lmu/ifi/dbs/elki/evaluation/outlier/OutlierThresholdClustering.java
+++ b/src/de/lmu/ifi/dbs/elki/evaluation/outlier/OutlierThresholdClustering.java
@@ -3,7 +3,7 @@ package de.lmu.ifi.dbs.elki.evaluation.outlier;
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,7 +32,7 @@ import de.lmu.ifi.dbs.elki.data.model.Model;
import de.lmu.ifi.dbs.elki.database.ids.DBIDIter;
import de.lmu.ifi.dbs.elki.database.ids.DBIDUtil;
import de.lmu.ifi.dbs.elki.database.ids.ModifiableDBIDs;
-import de.lmu.ifi.dbs.elki.database.relation.Relation;
+import de.lmu.ifi.dbs.elki.database.relation.DoubleRelation;
import de.lmu.ifi.dbs.elki.evaluation.Evaluator;
import de.lmu.ifi.dbs.elki.result.HierarchicalResult;
import de.lmu.ifi.dbs.elki.result.Result;
@@ -88,7 +88,7 @@ public class OutlierThresholdClustering implements Evaluator {
}
private Clustering<Model> split(OutlierResult or) {
- Relation<Double> scores = or.getScores();
+ DoubleRelation scores = or.getScores();
if(scaling instanceof OutlierScalingFunction) {
((OutlierScalingFunction) scaling).prepare(or);
}
@@ -97,7 +97,7 @@ public class OutlierThresholdClustering implements Evaluator {
idlists.add(DBIDUtil.newHashSet());
}
for(DBIDIter iter = scores.getDBIDs().iter(); iter.valid(); iter.advance()) {
- double score = scores.get(iter);
+ double score = scores.doubleValue(iter);
if(scaling != null) {
score = scaling.getScaled(score);
}
diff --git a/src/de/lmu/ifi/dbs/elki/evaluation/outlier/package-info.java b/src/de/lmu/ifi/dbs/elki/evaluation/outlier/package-info.java
index 1e5e6933..81cf2248 100644
--- a/src/de/lmu/ifi/dbs/elki/evaluation/outlier/package-info.java
+++ b/src/de/lmu/ifi/dbs/elki/evaluation/outlier/package-info.java
@@ -5,7 +5,7 @@
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