summaryrefslogtreecommitdiff
path: root/src/de/lmu/ifi/dbs/elki/distance/distancefunction/minkowski/WeightedSquaredEuclideanDistanceFunction.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/de/lmu/ifi/dbs/elki/distance/distancefunction/minkowski/WeightedSquaredEuclideanDistanceFunction.java')
-rw-r--r--src/de/lmu/ifi/dbs/elki/distance/distancefunction/minkowski/WeightedSquaredEuclideanDistanceFunction.java89
1 files changed, 59 insertions, 30 deletions
diff --git a/src/de/lmu/ifi/dbs/elki/distance/distancefunction/minkowski/WeightedSquaredEuclideanDistanceFunction.java b/src/de/lmu/ifi/dbs/elki/distance/distancefunction/minkowski/WeightedSquaredEuclideanDistanceFunction.java
index 4e361c10..a238ba1d 100644
--- a/src/de/lmu/ifi/dbs/elki/distance/distancefunction/minkowski/WeightedSquaredEuclideanDistanceFunction.java
+++ b/src/de/lmu/ifi/dbs/elki/distance/distancefunction/minkowski/WeightedSquaredEuclideanDistanceFunction.java
@@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.distance.distancefunction.minkowski;
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
@@ -27,15 +27,20 @@ import java.util.Arrays;
import de.lmu.ifi.dbs.elki.data.NumberVector;
import de.lmu.ifi.dbs.elki.data.spatial.SpatialComparable;
-import de.lmu.ifi.dbs.elki.distance.distancefunction.AbstractSpatialDoubleDistanceNorm;
+import de.lmu.ifi.dbs.elki.distance.distancefunction.AbstractSpatialNorm;
+import de.lmu.ifi.dbs.elki.distance.distancefunction.WeightedNumberVectorDistanceFunction;
+import de.lmu.ifi.dbs.elki.utilities.datastructures.arraylike.ArrayLikeUtil;
+import de.lmu.ifi.dbs.elki.utilities.optionhandling.AbstractParameterizer;
+import de.lmu.ifi.dbs.elki.utilities.optionhandling.parameterization.Parameterization;
+import de.lmu.ifi.dbs.elki.utilities.optionhandling.parameters.DoubleListParameter;
/**
- * Provides the squared Euclidean distance for FeatureVectors. This results in
- * the same rankings, but saves computing the square root as often.
+ * Squared Euclidean distance for {@link NumberVector}s. This results in the
+ * same rankings as Euclidean distance, but saves computing the square root.
*
* @author Arthur Zimek
*/
-public class WeightedSquaredEuclideanDistanceFunction extends AbstractSpatialDoubleDistanceNorm {
+public class WeightedSquaredEuclideanDistanceFunction extends AbstractSpatialNorm implements WeightedNumberVectorDistanceFunction<NumberVector> {
/**
* Weight array
*/
@@ -44,24 +49,18 @@ public class WeightedSquaredEuclideanDistanceFunction extends AbstractSpatialDou
/**
* Constructor.
*
- * @param weights
+ * @param weights Weight vector
*/
public WeightedSquaredEuclideanDistanceFunction(double[] weights) {
super();
this.weights = weights;
}
- /**
- * Provides the squared Euclidean distance between the given two vectors.
- *
- * @return the squared Euclidean distance between the given two vectors as raw
- * double value
- */
@Override
- public double doubleDistance(NumberVector<?> v1, NumberVector<?> v2) {
+ public double distance(NumberVector v1, NumberVector v2) {
final int dim = dimensionality(v1, v2, weights.length);
double agg = 0.;
- for (int d = 0; d < dim; d++) {
+ for(int d = 0; d < dim; d++) {
final double delta = (v1.doubleValue(d) - v2.doubleValue(d));
agg += delta * delta * weights[d];
}
@@ -69,10 +68,10 @@ public class WeightedSquaredEuclideanDistanceFunction extends AbstractSpatialDou
}
@Override
- public double doubleNorm(NumberVector<?> obj) {
+ public double norm(NumberVector obj) {
final int dim = obj.getDimensionality();
double agg = 0.;
- for (int d = 0; d < dim; d++) {
+ for(int d = 0; d < dim; d++) {
final double delta = obj.doubleValue(dim);
agg += delta * delta * weights[d];
}
@@ -80,23 +79,25 @@ public class WeightedSquaredEuclideanDistanceFunction extends AbstractSpatialDou
}
@Override
- public double doubleMinDist(SpatialComparable mbr1, SpatialComparable mbr2) {
+ public double minDist(SpatialComparable mbr1, SpatialComparable mbr2) {
// Optimization for the simplest case
- if (mbr1 instanceof NumberVector) {
- if (mbr2 instanceof NumberVector) {
- return doubleDistance((NumberVector<?>) mbr1, (NumberVector<?>) mbr2);
+ if(mbr1 instanceof NumberVector) {
+ if(mbr2 instanceof NumberVector) {
+ return distance((NumberVector) mbr1, (NumberVector) mbr2);
}
}
// TODO: optimize for more simpler cases: obj vs. rect?
final int dim = dimensionality(mbr1, mbr2, weights.length);
double agg = 0;
- for (int d = 0; d < dim; d++) {
+ for(int d = 0; d < dim; 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;
}
agg += diff * diff * weights[d];
@@ -111,16 +112,16 @@ public class WeightedSquaredEuclideanDistanceFunction extends AbstractSpatialDou
@Override
public boolean equals(Object obj) {
- if (this == obj) {
+ if(this == obj) {
return true;
}
- if (obj == null) {
+ if(obj == null) {
return false;
}
- if (!(obj instanceof WeightedSquaredEuclideanDistanceFunction)) {
- if (obj.getClass().equals(SquaredEuclideanDistanceFunction.class)) {
- for (double d : weights) {
- if (d != 1.0) {
+ if(!(obj instanceof WeightedSquaredEuclideanDistanceFunction)) {
+ if(obj.getClass().equals(SquaredEuclideanDistanceFunction.class)) {
+ for(double d : weights) {
+ if(d != 1.0) {
return false;
}
}
@@ -131,4 +132,32 @@ public class WeightedSquaredEuclideanDistanceFunction extends AbstractSpatialDou
WeightedSquaredEuclideanDistanceFunction other = (WeightedSquaredEuclideanDistanceFunction) obj;
return Arrays.equals(this.weights, other.weights);
}
+
+ /**
+ * Parameterization class.
+ *
+ * @author Erich Schubert
+ *
+ * @apiviz.exclude
+ */
+ public static class Parameterizer extends AbstractParameterizer {
+ /**
+ * Weight array
+ */
+ protected double[] weights;
+
+ @Override
+ protected void makeOptions(Parameterization config) {
+ super.makeOptions(config);
+ DoubleListParameter weightsP = new DoubleListParameter(WEIGHTS_ID);
+ if(config.grab(weightsP)) {
+ weights = ArrayLikeUtil.toPrimitiveDoubleArray(weightsP.getValue());
+ }
+ }
+
+ @Override
+ protected WeightedSquaredEuclideanDistanceFunction makeInstance() {
+ return new WeightedSquaredEuclideanDistanceFunction(weights);
+ }
+ }
}