diff options
Diffstat (limited to 'src/de/lmu/ifi/dbs/elki/algorithm/statistics')
6 files changed, 93 insertions, 59 deletions
diff --git a/src/de/lmu/ifi/dbs/elki/algorithm/statistics/AddSingleScale.java b/src/de/lmu/ifi/dbs/elki/algorithm/statistics/AddSingleScale.java index 159fb691..cbae17ca 100644 --- a/src/de/lmu/ifi/dbs/elki/algorithm/statistics/AddSingleScale.java +++ b/src/de/lmu/ifi/dbs/elki/algorithm/statistics/AddSingleScale.java @@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.algorithm.statistics; This file is part of ELKI: Environment for Developing KDD-Applications Supported by Index-Structures - Copyright (C) 2012 + Copyright (C) 2013 Ludwig-Maximilians-Universität München Lehr- und Forschungseinheit für Datenbanksysteme ELKI Development Team diff --git a/src/de/lmu/ifi/dbs/elki/algorithm/statistics/AveragePrecisionAtK.java b/src/de/lmu/ifi/dbs/elki/algorithm/statistics/AveragePrecisionAtK.java index e8165afc..1b87a015 100644 --- a/src/de/lmu/ifi/dbs/elki/algorithm/statistics/AveragePrecisionAtK.java +++ b/src/de/lmu/ifi/dbs/elki/algorithm/statistics/AveragePrecisionAtK.java @@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.algorithm.statistics; This file is part of ELKI: Environment for Developing KDD-Applications Supported by Index-Structures - Copyright (C) 2012 + Copyright (C) 2013 Ludwig-Maximilians-Universität München Lehr- und Forschungseinheit für Datenbanksysteme ELKI Development Team @@ -27,6 +27,7 @@ import java.util.ArrayList; import java.util.Collection; import de.lmu.ifi.dbs.elki.algorithm.AbstractDistanceBasedAlgorithm; +import de.lmu.ifi.dbs.elki.data.ClassLabel; import de.lmu.ifi.dbs.elki.data.DoubleVector; import de.lmu.ifi.dbs.elki.data.NumberVector; import de.lmu.ifi.dbs.elki.data.type.TypeInformation; @@ -35,23 +36,23 @@ 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.DBIDs; +import de.lmu.ifi.dbs.elki.database.ids.distance.KNNList; import de.lmu.ifi.dbs.elki.database.query.distance.DistanceQuery; import de.lmu.ifi.dbs.elki.database.query.knn.KNNQuery; import de.lmu.ifi.dbs.elki.database.relation.Relation; import de.lmu.ifi.dbs.elki.distance.distancefunction.DistanceFunction; -import de.lmu.ifi.dbs.elki.distance.distanceresultlist.KNNResult; 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.result.CollectionResult; -import de.lmu.ifi.dbs.elki.result.HistogramResult; import de.lmu.ifi.dbs.elki.utilities.optionhandling.OptionID; import de.lmu.ifi.dbs.elki.utilities.optionhandling.constraints.GreaterConstraint; import de.lmu.ifi.dbs.elki.utilities.optionhandling.constraints.GreaterEqualConstraint; import de.lmu.ifi.dbs.elki.utilities.optionhandling.constraints.LessEqualConstraint; import de.lmu.ifi.dbs.elki.utilities.optionhandling.parameterization.Parameterization; import de.lmu.ifi.dbs.elki.utilities.optionhandling.parameters.DoubleParameter; +import de.lmu.ifi.dbs.elki.utilities.optionhandling.parameters.Flag; import de.lmu.ifi.dbs.elki.utilities.optionhandling.parameters.IntParameter; import de.lmu.ifi.dbs.elki.utilities.optionhandling.parameters.LongParameter; @@ -60,6 +61,7 @@ import de.lmu.ifi.dbs.elki.utilities.optionhandling.parameters.LongParameter; * at k, when ranking the objects by distance. * * @author Erich Schubert + * * @param <V> Vector type * @param <D> Distance type */ @@ -73,38 +75,51 @@ public class AveragePrecisionAtK<V extends Object, D extends NumberDistance<D, ? * The parameter k - the number of neighbors to retrieve. */ private int k; - + /** * Relative number of object to use in sampling. */ private double sampling = 1.0; - + /** * Random sampling seed. */ private Long seed = null; /** + * Include query object in evaluation. + */ + private boolean includeSelf; + + /** * Constructor. * * @param distanceFunction Distance function * @param k K parameter * @param sampling Sampling rate * @param seed Random sampling seed (may be null) + * @param includeSelf Include query object in evaluation */ - public AveragePrecisionAtK(DistanceFunction<? super V, D> distanceFunction, int k, double sampling, Long seed) { + public AveragePrecisionAtK(DistanceFunction<? super V, D> distanceFunction, int k, double sampling, Long seed, boolean includeSelf) { super(distanceFunction); this.k = k; this.sampling = sampling; this.seed = seed; + this.includeSelf = includeSelf; } - @Override - public HistogramResult<DoubleVector> run(Database database) { - final Relation<V> relation = database.getRelation(getInputTypeRestriction()[0]); - final Relation<Object> lrelation = database.getRelation(getInputTypeRestriction()[1]); + /** + * Run the algorithm + * + * @param database Database to run on (for kNN queries) + * @param relation Relation for distance computations + * @param lrelation Relation for class label comparison + * @return Vectors containing mean and standard deviation. + */ + public CollectionResult<DoubleVector> run(Database database, Relation<V> relation, Relation<ClassLabel> lrelation) { final DistanceQuery<V, D> distQuery = database.getDistanceQuery(relation, getDistanceFunction()); - final KNNQuery<V, D> knnQuery = database.getKNNQuery(distQuery, k); + final int qk = k + (includeSelf ? 0 : 1); + final KNNQuery<V, D> knnQuery = database.getKNNQuery(distQuery, qk); MeanVariance[] mvs = MeanVariance.newArray(k); @@ -115,53 +130,56 @@ public class AveragePrecisionAtK<V extends Object, D extends NumberDistance<D, ? } else { ids = relation.getDBIDs(); } - - if(LOG.isVerbose()) { + + if (LOG.isVerbose()) { LOG.verbose("Processing points..."); } FiniteProgress objloop = LOG.isVerbose() ? new FiniteProgress("Computing nearest neighbors", ids.size(), LOG) : null; // sort neighbors - for(DBIDIter iter = ids.iter(); iter.valid(); iter.advance()) { - KNNResult<D> knn = knnQuery.getKNNForDBID(iter, k); + for (DBIDIter iter = ids.iter(); iter.valid(); iter.advance()) { + KNNList<D> knn = knnQuery.getKNNForDBID(iter, qk); Object label = lrelation.get(iter); int positive = 0, i = 0; - for (DBIDIter ri = knn.iter(); i < k && ri.valid(); ri.advance(), i++) { + for (DBIDIter ri = knn.iter(); i < k && ri.valid(); ri.advance()) { + if (!includeSelf && DBIDUtil.equal(iter, ri)) { + continue; + } Object olabel = lrelation.get(ri); - if(label == null) { - if(olabel == null) { + if (label == null) { + if (olabel == null) { positive += 1; } - } - else { - if(label.equals(olabel)) { + } else { + if (label.equals(olabel)) { positive += 1; } } final double precision = positive / (double) (i + 1); mvs[i].put(precision); + i++; } - if(objloop != null) { + if (objloop != null) { objloop.incrementProcessed(LOG); } } - if(objloop != null) { + if (objloop != null) { objloop.ensureCompleted(LOG); } // Collections.sort(results); // Transform Histogram into a Double Vector array. - Collection<DoubleVector> res = new ArrayList<DoubleVector>(k); - for(int i = 0; i < k; i++) { + Collection<DoubleVector> res = new ArrayList<>(k); + for (int i = 0; i < k; i++) { DoubleVector row = new DoubleVector(new double[] { mvs[i].getMean(), mvs[i].getSampleStddev() }); res.add(row); } - return new HistogramResult<DoubleVector>("Average Precision", "average-precision", res); + return new CollectionResult<>("Average Precision", "average-precision", res); } @Override public TypeInformation[] getInputTypeRestriction() { - return TypeUtil.array(getDistanceFunction().getInputTypeRestriction(), TypeUtil.GUESSED_LABEL); + return TypeUtil.array(getDistanceFunction().getInputTypeRestriction(), TypeUtil.CLASSLABEL); } @Override @@ -193,26 +211,36 @@ public class AveragePrecisionAtK<V extends Object, D extends NumberDistance<D, ? public static final OptionID SEED_ID = new OptionID("avep.sampling-seed", "Random seed for deterministic sampling."); /** + * Parameter to include the query object. + */ + public static final OptionID INCLUDESELF_ID = new OptionID("avep.includeself", "Include the query object in the evaluation."); + + /** * Neighborhood size. */ protected int k = 20; - + /** * Relative amount of data to sample. */ protected double sampling = 1.0; - + /** * Random sampling seed. */ protected Long seed = null; + /** + * Include query object in evaluation. + */ + protected boolean includeSelf; + @Override protected void makeOptions(Parameterization config) { super.makeOptions(config); final IntParameter kP = new IntParameter(K_ID); kP.addConstraint(new GreaterEqualConstraint(2)); - if(config.grab(kP)) { + if (config.grab(kP)) { k = kP.getValue(); } final DoubleParameter samplingP = new DoubleParameter(SAMPLING_ID); @@ -227,11 +255,15 @@ public class AveragePrecisionAtK<V extends Object, D extends NumberDistance<D, ? if (config.grab(rndP)) { seed = rndP.getValue(); } + final Flag includeP = new Flag(INCLUDESELF_ID); + if (config.grab(includeP)) { + includeSelf = includeP.isTrue(); + } } @Override protected AveragePrecisionAtK<V, D> makeInstance() { - return new AveragePrecisionAtK<V, D>(distanceFunction, k, sampling, seed); + return new AveragePrecisionAtK<>(distanceFunction, k, sampling, seed, includeSelf); } } -}
\ No newline at end of file +} diff --git a/src/de/lmu/ifi/dbs/elki/algorithm/statistics/DistanceStatisticsWithClasses.java b/src/de/lmu/ifi/dbs/elki/algorithm/statistics/DistanceStatisticsWithClasses.java index ebf588b6..3c8e1635 100644 --- a/src/de/lmu/ifi/dbs/elki/algorithm/statistics/DistanceStatisticsWithClasses.java +++ b/src/de/lmu/ifi/dbs/elki/algorithm/statistics/DistanceStatisticsWithClasses.java @@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.algorithm.statistics; This file is part of ELKI: Environment for Developing KDD-Applications Supported by Index-Structures - Copyright (C) 2012 + Copyright (C) 2013 Ludwig-Maximilians-Universität München Lehr- und Forschungseinheit für Datenbanksysteme ELKI Development Team @@ -284,7 +284,7 @@ public class DistanceStatisticsWithClasses<O, D extends NumberDistance<D, ?>> ex } long bnum = inum + onum; - Collection<DoubleVector> binstat = new ArrayList<DoubleVector>(numbin); + Collection<DoubleVector> binstat = new ArrayList<>(numbin); for (ObjHistogram.Iter<long[]> iter = histogram.iter(); iter.valid(); iter.advance()) { final long[] value = iter.getValue(); final double icof = (inum == 0) ? 0 : ((double) value[0]) / inum / histogram.getBinsize(); @@ -294,7 +294,7 @@ public class DistanceStatisticsWithClasses<O, D extends NumberDistance<D, ?>> ex DoubleVector row = new DoubleVector(new double[] { iter.getCenter(), icof, icaf, ocof, ocaf }); binstat.add(row); } - HistogramResult<DoubleVector> result = new HistogramResult<DoubleVector>("Distance Histogram", "distance-histogram", binstat); + HistogramResult<DoubleVector> result = new HistogramResult<>("Distance Histogram", "distance-histogram", binstat); result.addHeader("Absolute minimum distance (abs): " + gminmax.getMin()); result.addHeader("Absolute maximum distance (abs): " + gminmax.getMax()); @@ -319,8 +319,8 @@ public class DistanceStatisticsWithClasses<O, D extends NumberDistance<D, ?>> ex Random rnd = new Random(); // estimate minimum and maximum. int k = (int) Math.max(25, Math.pow(relation.size(), 0.2)); - TreeSet<DoubleDBIDPair> minhotset = new TreeSet<DoubleDBIDPair>(); - TreeSet<DoubleDBIDPair> maxhotset = new TreeSet<DoubleDBIDPair>(Collections.reverseOrder()); + TreeSet<DoubleDBIDPair> minhotset = new TreeSet<>(); + TreeSet<DoubleDBIDPair> maxhotset = new TreeSet<>(Collections.reverseOrder()); int randomsize = (int) Math.max(25, Math.pow(relation.size(), 0.2)); double rprob = ((double) randomsize) / size; @@ -336,7 +336,7 @@ public class DistanceStatisticsWithClasses<O, D extends NumberDistance<D, ?>> ex maxhotset.add(DBIDUtil.newPair(Double.MIN_VALUE, firstid)); for (; iter.valid(); iter.advance()) { // generate candidates for min distance. - ArrayList<DoubleDBIDPair> np = new ArrayList<DoubleDBIDPair>(k * 2 + randomsize * 2); + ArrayList<DoubleDBIDPair> np = new ArrayList<>(k * 2 + randomsize * 2); for (DoubleDBIDPair pair : minhotset) { // skip the object itself if (DBIDUtil.equal(iter, pair)) { @@ -355,7 +355,7 @@ public class DistanceStatisticsWithClasses<O, D extends NumberDistance<D, ?>> ex shrinkHeap(minhotset, k); // generate candidates for max distance. - ArrayList<DoubleDBIDPair> np2 = new ArrayList<DoubleDBIDPair>(k * 2 + randomsize * 2); + ArrayList<DoubleDBIDPair> np2 = new ArrayList<>(k * 2 + randomsize * 2); for (DoubleDBIDPair pair : minhotset) { // skip the object itself if (DBIDUtil.equal(iter, pair)) { @@ -479,7 +479,7 @@ public class DistanceStatisticsWithClasses<O, D extends NumberDistance<D, ?>> ex sampling = samplingF.getValue(); } - ArrayList<Parameter<?>> exclusive = new ArrayList<Parameter<?>>(); + ArrayList<Parameter<?>> exclusive = new ArrayList<>(); exclusive.add(exactF); exclusive.add(samplingF); config.checkConstraint(new OnlyOneIsAllowedToBeSetGlobalConstraint(exclusive)); @@ -487,7 +487,7 @@ public class DistanceStatisticsWithClasses<O, D extends NumberDistance<D, ?>> ex @Override protected DistanceStatisticsWithClasses<O, D> makeInstance() { - return new DistanceStatisticsWithClasses<O, D>(distanceFunction, numbin, exact, sampling); + return new DistanceStatisticsWithClasses<>(distanceFunction, numbin, exact, sampling); } } } diff --git a/src/de/lmu/ifi/dbs/elki/algorithm/statistics/EvaluateRankingQuality.java b/src/de/lmu/ifi/dbs/elki/algorithm/statistics/EvaluateRankingQuality.java index 1643d378..76e5ef66 100644 --- a/src/de/lmu/ifi/dbs/elki/algorithm/statistics/EvaluateRankingQuality.java +++ b/src/de/lmu/ifi/dbs/elki/algorithm/statistics/EvaluateRankingQuality.java @@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.algorithm.statistics; This file is part of ELKI: Environment for Developing KDD-Applications Supported by Index-Structures - Copyright (C) 2012 + Copyright (C) 2013 Ludwig-Maximilians-Universität München Lehr- und Forschungseinheit für Datenbanksysteme ELKI Development Team @@ -41,22 +41,24 @@ 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.DoubleDBIDPair; +import de.lmu.ifi.dbs.elki.database.ids.distance.KNNList; import de.lmu.ifi.dbs.elki.database.query.distance.DistanceQuery; import de.lmu.ifi.dbs.elki.database.query.knn.KNNQuery; import de.lmu.ifi.dbs.elki.database.relation.Relation; import de.lmu.ifi.dbs.elki.distance.distancefunction.DistanceFunction; -import de.lmu.ifi.dbs.elki.distance.distanceresultlist.KNNResult; import de.lmu.ifi.dbs.elki.distance.distancevalue.NumberDistance; import de.lmu.ifi.dbs.elki.evaluation.roc.ROC; import de.lmu.ifi.dbs.elki.logging.Logging; import de.lmu.ifi.dbs.elki.logging.progress.FiniteProgress; import de.lmu.ifi.dbs.elki.math.MathUtil; +import de.lmu.ifi.dbs.elki.math.MeanVariance; import de.lmu.ifi.dbs.elki.math.linearalgebra.CovarianceMatrix; import de.lmu.ifi.dbs.elki.math.linearalgebra.Matrix; import de.lmu.ifi.dbs.elki.math.linearalgebra.Vector; import de.lmu.ifi.dbs.elki.result.CollectionResult; import de.lmu.ifi.dbs.elki.result.HistogramResult; import de.lmu.ifi.dbs.elki.utilities.datastructures.histogram.MeanVarianceStaticHistogram; +import de.lmu.ifi.dbs.elki.utilities.datastructures.histogram.ObjHistogram; import de.lmu.ifi.dbs.elki.utilities.documentation.Description; import de.lmu.ifi.dbs.elki.utilities.documentation.Title; import de.lmu.ifi.dbs.elki.utilities.optionhandling.OptionID; @@ -126,8 +128,8 @@ public class EvaluateRankingQuality<V extends NumberVector<?>, D extends NumberD Collection<Cluster<Model>> split = (new ByLabelOrAllInOneClustering()).run(database).getAllClusters(); // Compute cluster averages and covariance matrix - HashMap<Cluster<?>, Vector> averages = new HashMap<Cluster<?>, Vector>(split.size()); - HashMap<Cluster<?>, Matrix> covmats = new HashMap<Cluster<?>, Matrix>(split.size()); + HashMap<Cluster<?>, Vector> averages = new HashMap<>(split.size()); + HashMap<Cluster<?>, Matrix> covmats = new HashMap<>(split.size()); for (Cluster<?> clus : split) { CovarianceMatrix covmat = CovarianceMatrix.make(relation, clus.getIDs()); averages.put(clus, covmat.getMeanVector()); @@ -143,7 +145,7 @@ public class EvaluateRankingQuality<V extends NumberVector<?>, D extends NumberD // sort neighbors for (Cluster<?> clus : split) { - ArrayList<DoubleDBIDPair> cmem = new ArrayList<DoubleDBIDPair>(clus.size()); + ArrayList<DoubleDBIDPair> cmem = new ArrayList<>(clus.size()); Vector av = averages.get(clus); Matrix covm = covmats.get(clus); @@ -154,7 +156,7 @@ public class EvaluateRankingQuality<V extends NumberVector<?>, D extends NumberD Collections.sort(cmem); for (int ind = 0; ind < cmem.size(); ind++) { - KNNResult<D> knn = knnQuery.getKNNForDBID(cmem.get(ind), relation.size()); + KNNList<D> knn = knnQuery.getKNNForDBID(cmem.get(ind), relation.size()); double result = ROC.computeROCAUCDistanceResult(relation.size(), clus, knn); hist.put(((double) ind) / clus.size(), result); @@ -170,12 +172,12 @@ public class EvaluateRankingQuality<V extends NumberVector<?>, D extends NumberD // Collections.sort(results); // Transform Histogram into a Double Vector array. - Collection<DoubleVector> res = new ArrayList<DoubleVector>(relation.size()); - for (MeanVarianceStaticHistogram.Iter iter = hist.iter(); iter.valid(); iter.advance()) { + Collection<DoubleVector> res = new ArrayList<>(relation.size()); + for (ObjHistogram.Iter<MeanVariance> iter = hist.iter(); iter.valid(); iter.advance()) { DoubleVector row = new DoubleVector(new double[] { iter.getCenter(), iter.getValue().getCount(), iter.getValue().getMean(), iter.getValue().getSampleVariance() }); res.add(row); } - return new HistogramResult<DoubleVector>("Ranking Quality Histogram", "ranking-histogram", res); + return new HistogramResult<>("Ranking Quality Histogram", "ranking-histogram", res); } @Override @@ -213,7 +215,7 @@ public class EvaluateRankingQuality<V extends NumberVector<?>, D extends NumberD @Override protected EvaluateRankingQuality<V, D> makeInstance() { - return new EvaluateRankingQuality<V, D>(distanceFunction, numbins); + return new EvaluateRankingQuality<>(distanceFunction, numbins); } } } diff --git a/src/de/lmu/ifi/dbs/elki/algorithm/statistics/RankingQualityHistogram.java b/src/de/lmu/ifi/dbs/elki/algorithm/statistics/RankingQualityHistogram.java index 6d8167a5..58018029 100644 --- a/src/de/lmu/ifi/dbs/elki/algorithm/statistics/RankingQualityHistogram.java +++ b/src/de/lmu/ifi/dbs/elki/algorithm/statistics/RankingQualityHistogram.java @@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.algorithm.statistics; This file is part of ELKI: Environment for Developing KDD-Applications Supported by Index-Structures - Copyright (C) 2012 + Copyright (C) 2013 Ludwig-Maximilians-Universität München Lehr- und Forschungseinheit für Datenbanksysteme ELKI Development Team @@ -35,11 +35,11 @@ import de.lmu.ifi.dbs.elki.data.type.TypeInformation; import de.lmu.ifi.dbs.elki.data.type.TypeUtil; 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.distance.KNNList; import de.lmu.ifi.dbs.elki.database.query.distance.DistanceQuery; import de.lmu.ifi.dbs.elki.database.query.knn.KNNQuery; import de.lmu.ifi.dbs.elki.database.relation.Relation; import de.lmu.ifi.dbs.elki.distance.distancefunction.DistanceFunction; -import de.lmu.ifi.dbs.elki.distance.distanceresultlist.KNNResult; import de.lmu.ifi.dbs.elki.distance.distancevalue.NumberDistance; import de.lmu.ifi.dbs.elki.evaluation.roc.ROC; import de.lmu.ifi.dbs.elki.logging.Logging; @@ -126,7 +126,7 @@ public class RankingQualityHistogram<O, D extends NumberDistance<D, ?>> extends // sort neighbors for (Cluster<?> clus : split) { for (DBIDIter iter = clus.getIDs().iter(); iter.valid(); iter.advance()) { - KNNResult<D> knn = knnQuery.getKNNForDBID(iter, relation.size()); + KNNList<D> knn = knnQuery.getKNNForDBID(iter, relation.size()); double result = ROC.computeROCAUCDistanceResult(relation.size(), clus, knn); mv.put(result); @@ -142,12 +142,12 @@ public class RankingQualityHistogram<O, D extends NumberDistance<D, ?>> extends } // Transform Histogram into a Double Vector array. - Collection<DoubleVector> res = new ArrayList<DoubleVector>(relation.size()); + Collection<DoubleVector> res = new ArrayList<>(relation.size()); for (DoubleStaticHistogram.Iter iter = hist.iter(); iter.valid(); iter.advance()) { DoubleVector row = new DoubleVector(new double[] { iter.getCenter(), iter.getValue() }); res.add(row); } - HistogramResult<DoubleVector> result = new HistogramResult<DoubleVector>("Ranking Quality Histogram", "ranking-histogram", res); + HistogramResult<DoubleVector> result = new HistogramResult<>("Ranking Quality Histogram", "ranking-histogram", res); result.addHeader("Mean: " + mv.getMean() + " Variance: " + mv.getSampleVariance()); return result; } @@ -187,7 +187,7 @@ public class RankingQualityHistogram<O, D extends NumberDistance<D, ?>> extends @Override protected RankingQualityHistogram<O, D> makeInstance() { - return new RankingQualityHistogram<O, D>(distanceFunction, numbins); + return new RankingQualityHistogram<>(distanceFunction, numbins); } } } diff --git a/src/de/lmu/ifi/dbs/elki/algorithm/statistics/package-info.java b/src/de/lmu/ifi/dbs/elki/algorithm/statistics/package-info.java index e706d586..8e566101 100644 --- a/src/de/lmu/ifi/dbs/elki/algorithm/statistics/package-info.java +++ b/src/de/lmu/ifi/dbs/elki/algorithm/statistics/package-info.java @@ -8,7 +8,7 @@ This file is part of ELKI: Environment for Developing KDD-Applications Supported by Index-Structures -Copyright (C) 2012 +Copyright (C) 2013 Ludwig-Maximilians-Universität München Lehr- und Forschungseinheit für Datenbanksysteme ELKI Development Team |