summaryrefslogtreecommitdiff
path: root/src/de/lmu/ifi/dbs/elki/math/linearalgebra/ProjectedCentroid.java
diff options
context:
space:
mode:
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.java40
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;