diff options
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.java | 89 |
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); + } + } } |