diff options
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 | 62 |
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. * |