diff options
Diffstat (limited to 'src/de/lmu/ifi/dbs/elki/math/linearalgebra/ProjectedCentroid.java')
-rw-r--r-- | src/de/lmu/ifi/dbs/elki/math/linearalgebra/ProjectedCentroid.java | 40 |
1 files changed, 24 insertions, 16 deletions
diff --git a/src/de/lmu/ifi/dbs/elki/math/linearalgebra/ProjectedCentroid.java b/src/de/lmu/ifi/dbs/elki/math/linearalgebra/ProjectedCentroid.java index 435ac3d7..2a24a74d 100644 --- a/src/de/lmu/ifi/dbs/elki/math/linearalgebra/ProjectedCentroid.java +++ b/src/de/lmu/ifi/dbs/elki/math/linearalgebra/ProjectedCentroid.java @@ -29,7 +29,7 @@ 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.relation.Relation; -import de.lmu.ifi.dbs.elki.utilities.DatabaseUtil; +import de.lmu.ifi.dbs.elki.database.relation.RelationUtil; /** * Centroid only using a subset of dimensions. @@ -57,11 +57,11 @@ public class ProjectedCentroid extends Centroid { public ProjectedCentroid(BitSet dims, int dim) { super(dim); this.dims = dims; - assert (dims.size() <= dim); + assert (dims.length() <= dim) : (dims.length() + " > " + dim + " ?!?"); } /** - * Add a single value with weight 1.0 + * Add a single value with weight 1.0. * * @param val Value */ @@ -82,8 +82,11 @@ public class ProjectedCentroid extends Centroid { * @param weight weight */ @Override - public void put(double val[], double weight) { + public void put(double[] val, double weight) { assert (val.length == elements.length); + if (weight == 0) { + return; // Skip zero weights. + } final double nwsum = weight + wsum; for(int i = dims.nextSetBit(0); i >= 0; i = dims.nextSetBit(i + 1)) { final double delta = val[i] - elements[i]; @@ -94,16 +97,16 @@ public class ProjectedCentroid extends Centroid { } /** - * Add a single value with weight 1.0 + * Add a single value with weight 1.0. * * @param val Value */ @Override - public void put(NumberVector<?, ?> val) { + public void put(NumberVector<?> val) { assert (val.getDimensionality() == elements.length); wsum += 1.0; for(int i = dims.nextSetBit(0); i >= 0; i = dims.nextSetBit(i + 1)) { - final double delta = val.doubleValue(i + 1) - elements[i]; + final double delta = val.doubleValue(i) - elements[i]; elements[i] += delta / wsum; } } @@ -115,11 +118,14 @@ public class ProjectedCentroid extends Centroid { * @param weight weight */ @Override - public void put(NumberVector<?, ?> val, double weight) { + public void put(NumberVector<?> val, double weight) { assert (val.getDimensionality() == elements.length); + if (weight == 0) { + return; // Skip zero weights. + } final double nwsum = weight + wsum; for(int i = dims.nextSetBit(0); i >= 0; i = dims.nextSetBit(i + 1)) { - final double delta = val.doubleValue(i + 1) - elements[i]; + final double delta = val.doubleValue(i) - elements[i]; final double rval = delta * weight / nwsum; elements[i] += rval; } @@ -131,10 +137,11 @@ public class ProjectedCentroid extends Centroid { * * @param dims Dimensions to use (indexed with 0) * @param relation Relation to process + * @return Centroid */ - public static ProjectedCentroid make(BitSet dims, Relation<? extends NumberVector<?, ?>> relation) { - ProjectedCentroid c = new ProjectedCentroid(dims, DatabaseUtil.dimensionality(relation)); - assert (dims.size() <= DatabaseUtil.dimensionality(relation)); + public static ProjectedCentroid make(BitSet dims, Relation<? extends NumberVector<?>> relation) { + ProjectedCentroid c = new ProjectedCentroid(dims, RelationUtil.dimensionality(relation)); + assert (dims.size() <= RelationUtil.dimensionality(relation)); for(DBIDIter iditer = relation.iterDBIDs(); iditer.valid(); iditer.advance()) { c.put(relation.get(iditer)); } @@ -147,11 +154,12 @@ public class ProjectedCentroid extends Centroid { * @param dims Dimensions to use (indexed with 0) * @param relation Relation to process * @param ids IDs to process + * @return Centroid */ - public static ProjectedCentroid make(BitSet dims, Relation<? extends NumberVector<?, ?>> relation, DBIDs ids) { - ProjectedCentroid c = new ProjectedCentroid(dims, DatabaseUtil.dimensionality(relation)); - assert (dims.size() <= DatabaseUtil.dimensionality(relation)); - for (DBIDIter iter = ids.iter(); iter.valid(); iter.advance()) { + public static ProjectedCentroid make(BitSet dims, Relation<? extends NumberVector<?>> relation, DBIDs ids) { + ProjectedCentroid c = new ProjectedCentroid(dims, RelationUtil.dimensionality(relation)); + assert (dims.length() <= RelationUtil.dimensionality(relation)); + for(DBIDIter iter = ids.iter(); iter.valid(); iter.advance()) { c.put(relation.get(iter)); } return c; |