diff options
Diffstat (limited to 'src/de/lmu/ifi/dbs/elki/algorithm/benchmark/ValidateApproximativeKNNIndex.java')
-rw-r--r-- | src/de/lmu/ifi/dbs/elki/algorithm/benchmark/ValidateApproximativeKNNIndex.java | 81 |
1 files changed, 32 insertions, 49 deletions
diff --git a/src/de/lmu/ifi/dbs/elki/algorithm/benchmark/ValidateApproximativeKNNIndex.java b/src/de/lmu/ifi/dbs/elki/algorithm/benchmark/ValidateApproximativeKNNIndex.java index 8b83b5d4..deaea154 100644 --- a/src/de/lmu/ifi/dbs/elki/algorithm/benchmark/ValidateApproximativeKNNIndex.java +++ b/src/de/lmu/ifi/dbs/elki/algorithm/benchmark/ValidateApproximativeKNNIndex.java @@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.algorithm.benchmark; 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 @@ -34,7 +34,7 @@ import de.lmu.ifi.dbs.elki.database.ids.DBIDIter; import de.lmu.ifi.dbs.elki.database.ids.DBIDRange; 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.distance.KNNList; +import de.lmu.ifi.dbs.elki.database.ids.KNNList; import de.lmu.ifi.dbs.elki.database.query.DatabaseQuery; import de.lmu.ifi.dbs.elki.database.query.LinearScanQuery; import de.lmu.ifi.dbs.elki.database.query.distance.DistanceQuery; @@ -43,14 +43,12 @@ import de.lmu.ifi.dbs.elki.database.relation.Relation; import de.lmu.ifi.dbs.elki.datasource.DatabaseConnection; import de.lmu.ifi.dbs.elki.datasource.bundle.MultipleObjectsBundle; import de.lmu.ifi.dbs.elki.distance.distancefunction.DistanceFunction; -import de.lmu.ifi.dbs.elki.distance.distancevalue.Distance; -import de.lmu.ifi.dbs.elki.distance.distancevalue.NumberDistance; import de.lmu.ifi.dbs.elki.logging.Logging; import de.lmu.ifi.dbs.elki.logging.progress.FiniteProgress; import de.lmu.ifi.dbs.elki.math.MeanVariance; +import de.lmu.ifi.dbs.elki.math.random.RandomFactory; import de.lmu.ifi.dbs.elki.result.Result; import de.lmu.ifi.dbs.elki.utilities.DatabaseUtil; -import de.lmu.ifi.dbs.elki.utilities.RandomFactory; import de.lmu.ifi.dbs.elki.utilities.exceptions.AbortException; import de.lmu.ifi.dbs.elki.utilities.optionhandling.OptionID; import de.lmu.ifi.dbs.elki.utilities.optionhandling.parameterization.Parameterization; @@ -72,7 +70,7 @@ import de.lmu.ifi.dbs.elki.utilities.optionhandling.parameters.RandomParameter; * * @apiviz.uses KNNQuery */ -public class ValidateApproximativeKNNIndex<O, D extends Distance<D>> extends AbstractDistanceBasedAlgorithm<O, D, Result> { +public class ValidateApproximativeKNNIndex<O> extends AbstractDistanceBasedAlgorithm<O, Result> { /** * The logger for this class. */ @@ -119,7 +117,7 @@ public class ValidateApproximativeKNNIndex<O, D extends Distance<D>> extends Abs * @param forcelinear Force the use of linear scanning. * @param pattern */ - public ValidateApproximativeKNNIndex(DistanceFunction<? super O, D> distanceFunction, int k, DatabaseConnection queries, double sampling, boolean forcelinear, RandomFactory random, Pattern pattern) { + public ValidateApproximativeKNNIndex(DistanceFunction<? super O> distanceFunction, int k, DatabaseConnection queries, double sampling, boolean forcelinear, RandomFactory random, Pattern pattern) { super(distanceFunction); this.k = k; this.queries = queries; @@ -138,14 +136,14 @@ public class ValidateApproximativeKNNIndex<O, D extends Distance<D>> extends Abs */ public Result run(Database database, Relation<O> relation) { // Get a distance and kNN query instance. - DistanceQuery<O, D> distQuery = database.getDistanceQuery(relation, getDistanceFunction()); + DistanceQuery<O> distQuery = database.getDistanceQuery(relation, getDistanceFunction()); // Approximate query: - KNNQuery<O, D> knnQuery = database.getKNNQuery(distQuery, k, DatabaseQuery.HINT_OPTIMIZED_ONLY); + KNNQuery<O> knnQuery = database.getKNNQuery(distQuery, k, DatabaseQuery.HINT_OPTIMIZED_ONLY); if(knnQuery == null || knnQuery instanceof LinearScanQuery) { throw new AbortException("Expected an accelerated query, but got a linear scan -- index is not used."); } // Exact query: - KNNQuery<O, D> truekNNQuery; + KNNQuery<O> truekNNQuery; if(forcelinear) { truekNNQuery = QueryUtil.getLinearScanKNNQuery(distQuery); } @@ -180,26 +178,23 @@ public class ValidateApproximativeKNNIndex<O, D extends Distance<D>> extends Abs for(DBIDIter iditer = sample.iter(); iditer.valid(); iditer.advance()) { if(pattern == null || pattern.matcher(lrel.get(iditer)).find()) { // Query index: - KNNList<D> knns = knnQuery.getKNNForDBID(iditer, k); + KNNList knns = knnQuery.getKNNForDBID(iditer, k); // Query reference: - KNNList<D> trueknns = truekNNQuery.getKNNForDBID(iditer, k); + KNNList trueknns = truekNNQuery.getKNNForDBID(iditer, k); // Put adjusted knn size: mv.put(knns.size() * k / (double) trueknns.size()); // Put recall: - mvrec.put(DBIDUtil.intersectionSize(knns, trueknns) / trueknns.size()); + mvrec.put(DBIDUtil.intersectionSize(knns, trueknns) / (double) trueknns.size()); if(knns.size() >= k) { - D kdist = knns.getKNNDistance(); - if(kdist instanceof NumberDistance) { - final double dist = ((NumberDistance<?, ?>) kdist).doubleValue(); - final double tdist = ((NumberDistance<?, ?>) trueknns.getKNNDistance()).doubleValue(); - if(tdist > 0.0) { - mvdist.put(dist); - mvdaerr.put(dist - tdist); - mvdrerr.put(dist / tdist); - } + double kdist = knns.getKNNDistance(); + final double tdist = trueknns.getKNNDistance(); + if(tdist > 0.0) { + mvdist.put(kdist); + mvdaerr.put(kdist - tdist); + mvdrerr.put(kdist / tdist); } } else { @@ -207,13 +202,9 @@ public class ValidateApproximativeKNNIndex<O, D extends Distance<D>> extends Abs misses++; } } - if(prog != null) { - prog.incrementProcessed(LOG); - } - } - if(prog != null) { - prog.ensureCompleted(LOG); + LOG.incrementProcessed(prog); } + LOG.ensureCompleted(prog); if(LOG.isStatistics()) { LOG.statistics("Mean number of results: " + mv.getMean() + " +- " + mv.getNaiveStddev()); LOG.statistics("Recall of true results: " + mvrec.getMean() + " +- " + mvrec.getNaiveStddev()); @@ -268,39 +259,32 @@ public class ValidateApproximativeKNNIndex<O, D extends Distance<D>> extends Abs O o = (O) bundle.data(off, col); // Query index: - KNNList<D> knns = knnQuery.getKNNForObject(o, k); + KNNList knns = knnQuery.getKNNForObject(o, k); // Query reference: - KNNList<D> trueknns = truekNNQuery.getKNNForObject(o, k); + KNNList trueknns = truekNNQuery.getKNNForObject(o, k); // Put adjusted knn size: mv.put(knns.size() * k / (double) trueknns.size()); // Put recall: - mvrec.put(DBIDUtil.intersectionSize(knns, trueknns) / trueknns.size()); + mvrec.put(DBIDUtil.intersectionSize(knns, trueknns) / (double) trueknns.size()); if(knns.size() >= k) { - D kdist = knns.getKNNDistance(); - if(kdist instanceof NumberDistance) { - final double dist = ((NumberDistance<?, ?>) kdist).doubleValue(); - final double tdist = ((NumberDistance<?, ?>) trueknns.getKNNDistance()).doubleValue(); - if(tdist > 0.0) { - mvdist.put(dist); - mvdaerr.put(dist - tdist); - mvdrerr.put(dist / tdist); - } + double kdist = knns.getKNNDistance(); + final double tdist = trueknns.getKNNDistance(); + if(tdist > 0.0) { + mvdist.put(kdist); + mvdaerr.put(kdist - tdist); + mvdrerr.put(kdist / tdist); } } else { // Less than k objects. misses++; } - if(prog != null) { - prog.incrementProcessed(LOG); - } - } - if(prog != null) { - prog.ensureCompleted(LOG); + LOG.incrementProcessed(prog); } + LOG.ensureCompleted(prog); if(LOG.isStatistics()) { LOG.statistics("Mean number of results: " + mv.getMean() + " +- " + mv.getNaiveStddev()); LOG.statistics("Recall of true results: " + mvrec.getMean() + " +- " + mvrec.getNaiveStddev()); @@ -334,9 +318,8 @@ public class ValidateApproximativeKNNIndex<O, D extends Distance<D>> extends Abs * @author Erich Schubert * * @param <O> Object type - * @param <D> Distance type */ - public static class Parameterizer<O, D extends Distance<D>> extends AbstractDistanceBasedAlgorithm.Parameterizer<O, D> { + public static class Parameterizer<O> extends AbstractDistanceBasedAlgorithm.Parameterizer<O> { /** * Parameter for the number of neighbors. */ @@ -432,7 +415,7 @@ public class ValidateApproximativeKNNIndex<O, D extends Distance<D>> extends Abs } @Override - protected ValidateApproximativeKNNIndex<O, D> makeInstance() { + protected ValidateApproximativeKNNIndex<O> makeInstance() { return new ValidateApproximativeKNNIndex<>(distanceFunction, k, queries, sampling, forcelinear, random, pattern); } } |