diff options
Diffstat (limited to 'src/de/lmu/ifi/dbs/elki/evaluation/outlier')
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 |