diff options
Diffstat (limited to 'src/de/lmu/ifi/dbs/elki/distance/distancefunction/ClarkDistanceFunction.java')
-rw-r--r-- | src/de/lmu/ifi/dbs/elki/distance/distancefunction/ClarkDistanceFunction.java | 49 |
1 files changed, 39 insertions, 10 deletions
diff --git a/src/de/lmu/ifi/dbs/elki/distance/distancefunction/ClarkDistanceFunction.java b/src/de/lmu/ifi/dbs/elki/distance/distancefunction/ClarkDistanceFunction.java index 221a7db1..b856729e 100644 --- a/src/de/lmu/ifi/dbs/elki/distance/distancefunction/ClarkDistanceFunction.java +++ b/src/de/lmu/ifi/dbs/elki/distance/distancefunction/ClarkDistanceFunction.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) 2013 + Copyright (C) 2014 Ludwig-Maximilians-Universität München Lehr- und Forschungseinheit für Datenbanksysteme ELKI Development Team @@ -25,6 +25,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.documentation.Reference; import de.lmu.ifi.dbs.elki.utilities.optionhandling.AbstractParameterizer; @@ -40,7 +42,7 @@ import de.lmu.ifi.dbs.elki.utilities.optionhandling.AbstractParameterizer; * @author Erich Schubert */ @Reference(authors = "M.-M. Deza and E. Deza", title = "Dictionary of distances", booktitle = "Dictionary of distances") -public class ClarkDistanceFunction extends AbstractSpatialDoubleDistanceFunction { +public class ClarkDistanceFunction extends AbstractSpatialDistanceFunction { /** * Static instance. */ @@ -57,10 +59,11 @@ public class ClarkDistanceFunction extends AbstractSpatialDoubleDistanceFunction } @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.) { @@ -68,14 +71,25 @@ public class ClarkDistanceFunction extends AbstractSpatialDoubleDistanceFunction agg += v * v; } } - return Math.sqrt(agg / dim); + 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 Math.sqrt(agg / Math.max(dim1, dim2)); } @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 min1 = mbr1.getMin(d), max1 = mbr1.getMax(d); final double min2 = mbr2.getMin(d), max2 = mbr2.getMax(d); final double diff; @@ -93,7 +107,22 @@ public class ClarkDistanceFunction extends AbstractSpatialDoubleDistanceFunction final double v = diff / (absmax1 + absmax2); agg += v * v; } - return Math.sqrt(agg / dim); + 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 Math.sqrt(agg / Math.max(dim1, dim2)); + } + + @Override + public SimpleTypeInformation<? super NumberVector> getInputTypeRestriction() { + return TypeUtil.NUMBER_VECTOR_VARIABLE_LENGTH; } /** |