summaryrefslogtreecommitdiff
path: root/src/de/lmu/ifi/dbs/elki/distance/distancefunction/CanberraDistanceFunction.java
diff options
context:
space:
mode:
authorAndrej Shadura <andrewsh@debian.org>2019-03-09 22:30:36 +0000
committerAndrej Shadura <andrewsh@debian.org>2019-03-09 22:30:36 +0000
commit8300861dc4c62c5567a4e654976072f854217544 (patch)
tree0a148df3698efedd37839f6aca0e21b2f12f1b52 /src/de/lmu/ifi/dbs/elki/distance/distancefunction/CanberraDistanceFunction.java
parentb7b404fd7a726774d442562d11659d7b5368cdb9 (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.java68
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
+}