summaryrefslogtreecommitdiff
path: root/src/de/lmu/ifi/dbs/elki/distance/distancefunction/ClarkDistanceFunction.java
diff options
context:
space:
mode:
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.java49
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;
}
/**