diff options
author | Erich Schubert <erich@debian.org> | 2014-10-31 03:43:51 +0100 |
---|---|---|
committer | Andrej Shadura <andrewsh@debian.org> | 2019-03-09 22:30:40 +0000 |
commit | 596d8876dca5627dd76e8c23bf40a24cc305eeed (patch) | |
tree | d269ddb46561469f6b1fff67b19e0cd2b4608f5b /src/de/lmu/ifi/dbs/elki/math/linearalgebra/pca/WeightedCovarianceMatrixBuilder.java | |
parent | ee31d687b1a0e2f2f1e6e71375c7cc3b094919b8 (diff) | |
parent | 337087b668d3a54f3afee3a9adb597a32e9f7e94 (diff) |
Import Debian changes 0.6.5~20141030-1
elki (0.6.5~20141030-1) unstable; urgency=medium
* New upstream beta release
* Urgency medium: 0.6.0 suffers from a performance issue with duplicates.
* Repackaged tarball from .jar to .tar.bz2
* Add dependency on libsvm3-java
* Enable line numbers for debugging (ant debuglevel)
Diffstat (limited to 'src/de/lmu/ifi/dbs/elki/math/linearalgebra/pca/WeightedCovarianceMatrixBuilder.java')
-rw-r--r-- | src/de/lmu/ifi/dbs/elki/math/linearalgebra/pca/WeightedCovarianceMatrixBuilder.java | 73 |
1 files changed, 27 insertions, 46 deletions
diff --git a/src/de/lmu/ifi/dbs/elki/math/linearalgebra/pca/WeightedCovarianceMatrixBuilder.java b/src/de/lmu/ifi/dbs/elki/math/linearalgebra/pca/WeightedCovarianceMatrixBuilder.java index 236a24bc..801decd7 100644 --- a/src/de/lmu/ifi/dbs/elki/math/linearalgebra/pca/WeightedCovarianceMatrixBuilder.java +++ b/src/de/lmu/ifi/dbs/elki/math/linearalgebra/pca/WeightedCovarianceMatrixBuilder.java @@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.math.linearalgebra.pca; 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 @@ -26,19 +26,16 @@ package de.lmu.ifi.dbs.elki.math.linearalgebra.pca; import de.lmu.ifi.dbs.elki.data.NumberVector; import de.lmu.ifi.dbs.elki.database.ids.DBIDIter; import de.lmu.ifi.dbs.elki.database.ids.DBIDs; -import de.lmu.ifi.dbs.elki.database.ids.distance.DistanceDBIDList; -import de.lmu.ifi.dbs.elki.database.ids.distance.DistanceDBIDPair; -import de.lmu.ifi.dbs.elki.database.ids.distance.DistanceDBIDListIter; -import de.lmu.ifi.dbs.elki.database.ids.distance.DoubleDistanceDBIDPair; +import de.lmu.ifi.dbs.elki.database.ids.DoubleDBIDList; +import de.lmu.ifi.dbs.elki.database.ids.DoubleDBIDListIter; import de.lmu.ifi.dbs.elki.database.relation.Relation; import de.lmu.ifi.dbs.elki.database.relation.RelationUtil; import de.lmu.ifi.dbs.elki.distance.distancefunction.PrimitiveDistanceFunction; import de.lmu.ifi.dbs.elki.distance.distancefunction.minkowski.EuclideanDistanceFunction; -import de.lmu.ifi.dbs.elki.distance.distancevalue.DoubleDistance; -import de.lmu.ifi.dbs.elki.distance.distancevalue.NumberDistance; import de.lmu.ifi.dbs.elki.math.linearalgebra.Centroid; import de.lmu.ifi.dbs.elki.math.linearalgebra.CovarianceMatrix; import de.lmu.ifi.dbs.elki.math.linearalgebra.Matrix; +import de.lmu.ifi.dbs.elki.math.linearalgebra.Vector; import de.lmu.ifi.dbs.elki.math.linearalgebra.pca.weightfunctions.ConstantWeight; import de.lmu.ifi.dbs.elki.math.linearalgebra.pca.weightfunctions.WeightFunction; import de.lmu.ifi.dbs.elki.utilities.documentation.Description; @@ -67,13 +64,14 @@ import de.lmu.ifi.dbs.elki.utilities.optionhandling.parameters.ObjectParameter; * @apiviz.has WeightFunction * @apiviz.has PrimitiveDistanceFunction * @apiviz.uses CovarianceMatrix - * - * @param <V> Vector class to use */ @Title("Weighted Covariance Matrix / PCA") @Description("A PCA modification by using weights while building the covariance matrix, to obtain more stable results") -@Reference(authors = "H.-P. Kriegel, P. Kröger, E. Schubert, A. Zimek", title = "A General Framework for Increasing the Robustness of PCA-based Correlation Clustering Algorithms", booktitle = "Proceedings of the 20th International Conference on Scientific and Statistical Database Management (SSDBM), Hong Kong, China, 2008", url = "http://dx.doi.org/10.1007/978-3-540-69497-7_27") -public class WeightedCovarianceMatrixBuilder<V extends NumberVector<?>> extends AbstractCovarianceMatrixBuilder<V> { +@Reference(authors = "Hans-Peter Kriegel, Peer Kröger, Erich Schubert, Arthur Zimek", // +title = "A General Framework for Increasing the Robustness of PCA-based Correlation Clustering Algorithms",// +booktitle = "Proceedings of the 20th International Conference on Scientific and Statistical Database Management (SSDBM), Hong Kong, China, 2008",// +url = "http://dx.doi.org/10.1007/978-3-540-69497-7_27") +public class WeightedCovarianceMatrixBuilder extends AbstractCovarianceMatrixBuilder { /** * Parameter to specify the weight function to use in weighted PCA, must * implement @@ -93,8 +91,7 @@ public class WeightedCovarianceMatrixBuilder<V extends NumberVector<?>> extends /** * Holds the distance function used for weight calculation. */ - // TODO: make configurable? - private PrimitiveDistanceFunction<? super V, DoubleDistance> weightDistance = EuclideanDistanceFunction.STATIC; + private PrimitiveDistanceFunction<? super NumberVector> weightDistance = EuclideanDistanceFunction.STATIC; /** * Constructor. @@ -117,18 +114,18 @@ public class WeightedCovarianceMatrixBuilder<V extends NumberVector<?>> extends * @return Covariance matrix */ @Override - public Matrix processIds(DBIDs ids, Relation<? extends V> relation) { + public Matrix processIds(DBIDs ids, Relation<? extends NumberVector> relation) { final int dim = RelationUtil.dimensionality(relation); final CovarianceMatrix cmat = new CovarianceMatrix(dim); - final V centroid = Centroid.make(relation, ids).toVector(relation); + final Vector centroid = Centroid.make(relation, ids); // find maximum distance double maxdist = 0.0; double stddev = 0.0; { - for (DBIDIter iter = ids.iter(); iter.valid(); iter.advance()) { - V obj = relation.get(iter); - double distance = weightDistance.distance(centroid, obj).doubleValue(); + for(DBIDIter iter = ids.iter(); iter.valid(); iter.advance()) { + NumberVector obj = relation.get(iter); + double distance = weightDistance.distance(centroid, obj); stddev += distance * distance; if(distance > maxdist) { maxdist = distance; @@ -141,9 +138,9 @@ public class WeightedCovarianceMatrixBuilder<V extends NumberVector<?>> extends stddev = Math.sqrt(stddev / ids.size()); } - for (DBIDIter iter = ids.iter(); iter.valid(); iter.advance()) { - V obj = relation.get(iter); - double distance = weightDistance.distance(centroid, obj).doubleValue(); + for(DBIDIter iter = ids.iter(); iter.valid(); iter.advance()) { + NumberVector obj = relation.get(iter); + double distance = weightDistance.distance(centroid, obj); double weight = weightfunction.getWeight(distance, maxdist, stddev); cmat.put(obj, weight); } @@ -158,11 +155,10 @@ public class WeightedCovarianceMatrixBuilder<V extends NumberVector<?>> extends * @param results a collection of QueryResults * @param database the database used * @param k number of elements to process - * @param <D> distance type * @return Covariance Matrix */ @Override - public <D extends NumberDistance<D, ?>> Matrix processQueryResults(DistanceDBIDList<D> results, Relation<? extends V> database, int k) { + public Matrix processQueryResults(DoubleDBIDList results, Relation<? extends NumberVector> database, int k) { final int dim = RelationUtil.dimensionality(database); final CovarianceMatrix cmat = new CovarianceMatrix(dim); @@ -176,15 +172,8 @@ public class WeightedCovarianceMatrixBuilder<V extends NumberVector<?>> extends double stddev = 0.0; { int i = 0; - for (DistanceDBIDListIter<D> it = results.iter(); it.valid() && i < k; it.advance(), k++) { - DistanceDBIDPair<D> res = it.getDistancePair(); - final double dist; - if(res instanceof DoubleDistanceDBIDPair) { - dist = ((DoubleDistanceDBIDPair) res).doubleDistance(); - } - else { - dist = res.getDistance().doubleValue(); - } + for(DoubleDBIDListIter it = results.iter(); it.valid() && i < k; it.advance(), k++) { + final double dist = it.doubleValue(); stddev += dist * dist; if(dist > maxdist) { maxdist = dist; @@ -198,17 +187,9 @@ public class WeightedCovarianceMatrixBuilder<V extends NumberVector<?>> extends // calculate weighted PCA int i = 0; - for (DistanceDBIDListIter<D> it = results.iter(); it.valid() && i < k; it.advance(), k++) { - DistanceDBIDPair<D> res = it.getDistancePair(); - final double dist; - if(res instanceof DoubleDistanceDBIDPair) { - dist = ((DoubleDistanceDBIDPair) res).doubleDistance(); - } - else { - dist = res.getDistance().doubleValue(); - } - - V obj = database.get(res); + for(DoubleDBIDListIter it = results.iter(); it.valid() && i < k; it.advance(), k++) { + final double dist = it.doubleValue(); + NumberVector obj = database.get(it); double weight = weightfunction.getWeight(dist, maxdist, stddev); cmat.put(obj, weight); } @@ -222,7 +203,7 @@ public class WeightedCovarianceMatrixBuilder<V extends NumberVector<?>> extends * * @apiviz.exclude */ - public static class Parameterizer<V extends NumberVector<?>> extends AbstractParameterizer { + public static class Parameterizer extends AbstractParameterizer { /** * Weight function. */ @@ -238,8 +219,8 @@ public class WeightedCovarianceMatrixBuilder<V extends NumberVector<?>> extends } @Override - protected WeightedCovarianceMatrixBuilder<V> makeInstance() { - return new WeightedCovarianceMatrixBuilder<>(weightfunction); + protected WeightedCovarianceMatrixBuilder makeInstance() { + return new WeightedCovarianceMatrixBuilder(weightfunction); } } }
\ No newline at end of file |