diff options
author | Andrej Shadura <andrewsh@debian.org> | 2019-03-09 22:30:36 +0000 |
---|---|---|
committer | Andrej Shadura <andrewsh@debian.org> | 2019-03-09 22:30:36 +0000 |
commit | 8300861dc4c62c5567a4e654976072f854217544 (patch) | |
tree | 0a148df3698efedd37839f6aca0e21b2f12f1b52 /src/de/lmu/ifi/dbs/elki/distance/distancefunction/CanberraDistanceFunction.java | |
parent | b7b404fd7a726774d442562d11659d7b5368cdb9 (diff) |
Import Upstream version 0.6.0~beta2
Diffstat (limited to 'src/de/lmu/ifi/dbs/elki/distance/distancefunction/CanberraDistanceFunction.java')
-rw-r--r-- | src/de/lmu/ifi/dbs/elki/distance/distancefunction/CanberraDistanceFunction.java | 68 |
1 files changed, 28 insertions, 40 deletions
diff --git a/src/de/lmu/ifi/dbs/elki/distance/distancefunction/CanberraDistanceFunction.java b/src/de/lmu/ifi/dbs/elki/distance/distancefunction/CanberraDistanceFunction.java index f6db7439..97ef19ce 100644 --- a/src/de/lmu/ifi/dbs/elki/distance/distancefunction/CanberraDistanceFunction.java +++ b/src/de/lmu/ifi/dbs/elki/distance/distancefunction/CanberraDistanceFunction.java @@ -24,10 +24,7 @@ package de.lmu.ifi.dbs.elki.distance.distancefunction; */ import de.lmu.ifi.dbs.elki.data.NumberVector; import de.lmu.ifi.dbs.elki.data.spatial.SpatialComparable; -import de.lmu.ifi.dbs.elki.database.query.distance.SpatialDistanceQuery; -import de.lmu.ifi.dbs.elki.database.query.distance.SpatialPrimitiveDistanceQuery; -import de.lmu.ifi.dbs.elki.database.relation.Relation; -import de.lmu.ifi.dbs.elki.distance.distancevalue.DoubleDistance; +import de.lmu.ifi.dbs.elki.utilities.Alias; import de.lmu.ifi.dbs.elki.utilities.documentation.Reference; import de.lmu.ifi.dbs.elki.utilities.optionhandling.AbstractParameterizer; @@ -45,7 +42,8 @@ import de.lmu.ifi.dbs.elki.utilities.optionhandling.AbstractParameterizer; * @author Erich Schubert */ @Reference(authors = "G. N. Lance, W. T. Williams", title = "Computer programs for hierarchical polythetic classification (similarity analysis).", booktitle = "Computer Journal, Volume 9, Issue 1", url = "http://comjnl.oxfordjournals.org/content/9/1/60.short") -public class CanberraDistanceFunction extends AbstractVectorDoubleDistanceFunction implements SpatialPrimitiveDoubleDistanceFunction<NumberVector<?>> { +@Alias({ "canberra" }) +public class CanberraDistanceFunction extends AbstractSpatialDoubleDistanceFunction { /** * Static instance. Use this! */ @@ -59,56 +57,46 @@ public class CanberraDistanceFunction extends AbstractVectorDoubleDistanceFuncti } @Override - public double doubleDistance(NumberVector<?> o1, NumberVector<?> o2) { - final int dim = o1.getDimensionality(); - double sum = 0.0; - for(int i = 0; i < dim; i++) { - double v1 = o1.doubleValue(i); - double v2 = o2.doubleValue(i); - final double div = Math.abs(v1) + Math.abs(v2); + public double doubleDistance(NumberVector<?> v1, NumberVector<?> v2) { + final int dim = dimensionality(v1, v2); + double agg = 0.; + for (int d = 0; d < dim; d++) { + final double xd = v1.doubleValue(d), yd = v2.doubleValue(d); + final double div = Math.abs(xd) + Math.abs(yd); if (div > 0) { - sum += Math.abs(v1 - v2) / div; + agg += Math.abs(xd - yd) / div; } } - return sum; + return agg; } @Override public double doubleMinDist(SpatialComparable mbr1, SpatialComparable mbr2) { - final int dim = mbr1.getDimensionality(); - double sum = 0.0; - for(int d = 0; d < dim; d++) { - final double m1, m2; - if(mbr1.getMax(d) < mbr2.getMin(d)) { - m1 = mbr2.getMin(d); - m2 = mbr1.getMax(d); - } - else if(mbr1.getMin(d) > mbr2.getMax(d)) { - m1 = mbr1.getMin(d); - m2 = mbr2.getMax(d); - } - else { // The mbrs intersect! + final int dim = dimensionality(mbr1, mbr2); + double agg = 0.; + for (int d = 0; d < dim; d++) { + final double diff; + if (mbr1.getMax(d) < mbr2.getMin(d)) { + diff = mbr2.getMin(d) - mbr1.getMax(d); + } else if (mbr1.getMin(d) > mbr2.getMax(d)) { + diff = mbr1.getMin(d) - mbr2.getMax(d); + } else { // The mbrs intersect! continue; } - final double manhattanI = m1 - m2; final double a1 = Math.max(-mbr1.getMin(d), mbr1.getMax(d)); final double a2 = Math.max(-mbr2.getMin(d), mbr2.getMax(d)); final double div = a1 + a2; - if (div > 0) { - sum += manhattanI / div; - } + // Cannot be 0, because then diff = 0 and we continued above. + agg += diff / div; } - return sum; - } - - @Override - public DoubleDistance minDist(SpatialComparable mbr1, SpatialComparable mbr2) { - return new DoubleDistance(doubleMinDist(mbr1, mbr2)); + return agg; } @Override - public <T extends NumberVector<?>> SpatialDistanceQuery<T, DoubleDistance> instantiate(Relation<T> relation) { - return new SpatialPrimitiveDistanceQuery<T, DoubleDistance>(relation, this); + public boolean isMetric() { + // As this is also reffered to as "canberra metric", it is probably a metric + // But *maybe* only for positive numbers only? + return true; } /** @@ -124,4 +112,4 @@ public class CanberraDistanceFunction extends AbstractVectorDoubleDistanceFuncti return CanberraDistanceFunction.STATIC; } } -}
\ No newline at end of file +} |