summaryrefslogtreecommitdiff
path: root/src/de/lmu/ifi/dbs/elki/distance/distancefunction/CanberraDistanceFunction.java
diff options
context:
space:
mode:
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.java62
1 files changed, 48 insertions, 14 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 97ef19ce..0efe3c3e 100644
--- a/src/de/lmu/ifi/dbs/elki/distance/distancefunction/CanberraDistanceFunction.java
+++ b/src/de/lmu/ifi/dbs/elki/distance/distancefunction/CanberraDistanceFunction.java
@@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.distance.distancefunction;
This file is part of ELKI:
Environment for Developing KDD-Applications Supported by Index-Structures
- Copyright (C) 2011
+ Copyright (C) 2014
Ludwig-Maximilians-Universität München
Lehr- und Forschungseinheit für Datenbanksysteme
ELKI Development Team
@@ -24,6 +24,8 @@ 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.data.type.SimpleTypeInformation;
+import de.lmu.ifi.dbs.elki.data.type.TypeUtil;
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;
@@ -35,15 +37,18 @@ import de.lmu.ifi.dbs.elki.utilities.optionhandling.AbstractParameterizer;
* Reference:<br />
* G. N. Lance, W. T. Williams<br />
* Computer programs for hierarchical polythetic classification ("similarity
- * analysis")<br />
+ * analyses")<br />
* In: Computer Journal, Volume 9, Issue 1
* </p>
*
* @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")
+@Reference(authors = "G. N. Lance, W. T. Williams", //
+title = "Computer programs for hierarchical polythetic classification (similarity analyses)", //
+booktitle = "Computer Journal, Volume 9, Issue 1", //
+url = "http://comjnl.oxfordjournals.org/content/9/1/60.short")
@Alias({ "canberra" })
-public class CanberraDistanceFunction extends AbstractSpatialDoubleDistanceFunction {
+public class CanberraDistanceFunction extends AbstractSpatialDistanceFunction {
/**
* Static instance. Use this!
*/
@@ -57,30 +62,44 @@ public class CanberraDistanceFunction extends AbstractSpatialDoubleDistanceFunct
}
@Override
- public double doubleDistance(NumberVector<?> v1, NumberVector<?> v2) {
- final int dim = dimensionality(v1, v2);
+ public double distance(NumberVector v1, NumberVector v2) {
+ final int dim1 = v1.getDimensionality(), dim2 = v2.getDimensionality();
+ final int mindim = (dim1 < dim2) ? dim1 : dim2;
double agg = 0.;
- for (int d = 0; d < dim; d++) {
+ for(int d = 0; d < mindim; d++) {
final double xd = v1.doubleValue(d), yd = v2.doubleValue(d);
final double div = Math.abs(xd) + Math.abs(yd);
- if (div > 0) {
+ if(div > 0) {
agg += Math.abs(xd - yd) / div;
}
}
+ for(int d = mindim; d < dim1; d++) {
+ if(v1.doubleValue(d) != 0) {
+ agg += 1;
+ }
+ }
+ for(int d = mindim; d < dim2; d++) {
+ if(v2.doubleValue(d) != 0) {
+ agg += 1;
+ }
+ }
return agg;
}
@Override
- public double doubleMinDist(SpatialComparable mbr1, SpatialComparable mbr2) {
- final int dim = dimensionality(mbr1, mbr2);
+ public double minDist(SpatialComparable mbr1, SpatialComparable mbr2) {
+ final int dim1 = mbr1.getDimensionality(), dim2 = mbr2.getDimensionality();
+ final int mindim = (dim1 < dim2) ? dim1 : dim2;
double agg = 0.;
- for (int d = 0; d < dim; d++) {
+ for(int d = 0; d < mindim; d++) {
final double diff;
- if (mbr1.getMax(d) < mbr2.getMin(d)) {
+ if(mbr1.getMax(d) < mbr2.getMin(d)) {
diff = mbr2.getMin(d) - mbr1.getMax(d);
- } else if (mbr1.getMin(d) > mbr2.getMax(d)) {
+ }
+ else if(mbr1.getMin(d) > mbr2.getMax(d)) {
diff = mbr1.getMin(d) - mbr2.getMax(d);
- } else { // The mbrs intersect!
+ }
+ else { // The mbrs intersect!
continue;
}
final double a1 = Math.max(-mbr1.getMin(d), mbr1.getMax(d));
@@ -89,6 +108,16 @@ public class CanberraDistanceFunction extends AbstractSpatialDoubleDistanceFunct
// Cannot be 0, because then diff = 0 and we continued above.
agg += diff / div;
}
+ for(int d = mindim; d < dim1; d++) {
+ if(mbr1.getMin(d) > 0. || mbr1.getMax(d) < 0.) {
+ agg += 1;
+ }
+ }
+ for(int d = mindim; d < dim2; d++) {
+ if(mbr2.getMin(d) > 0. || mbr2.getMax(d) < 0.) {
+ agg += 1;
+ }
+ }
return agg;
}
@@ -99,6 +128,11 @@ public class CanberraDistanceFunction extends AbstractSpatialDoubleDistanceFunct
return true;
}
+ @Override
+ public SimpleTypeInformation<? super NumberVector> getInputTypeRestriction() {
+ return TypeUtil.NUMBER_VECTOR_VARIABLE_LENGTH;
+ }
+
/**
* Parameterization class.
*