summaryrefslogtreecommitdiff
path: root/src/de/lmu/ifi/dbs/elki/algorithm/clustering/AbstractProjectedDBSCAN.java
diff options
context:
space:
mode:
authorAndrej Shadura <andrewsh@debian.org>2019-03-09 22:30:33 +0000
committerAndrej Shadura <andrewsh@debian.org>2019-03-09 22:30:33 +0000
commitace5fa7f57d49756c0e1b111a30f3b6a9436c1cb (patch)
tree041e034bddeeaf574c02ca8f040b1359cef00133 /src/de/lmu/ifi/dbs/elki/algorithm/clustering/AbstractProjectedDBSCAN.java
parentc36aa2a8fd31ca5e225ff30278e910070cd2c8c1 (diff)
Import Upstream version 0.5.0
Diffstat (limited to 'src/de/lmu/ifi/dbs/elki/algorithm/clustering/AbstractProjectedDBSCAN.java')
-rw-r--r--src/de/lmu/ifi/dbs/elki/algorithm/clustering/AbstractProjectedDBSCAN.java56
1 files changed, 30 insertions, 26 deletions
diff --git a/src/de/lmu/ifi/dbs/elki/algorithm/clustering/AbstractProjectedDBSCAN.java b/src/de/lmu/ifi/dbs/elki/algorithm/clustering/AbstractProjectedDBSCAN.java
index 108ba0ed..250cc70b 100644
--- a/src/de/lmu/ifi/dbs/elki/algorithm/clustering/AbstractProjectedDBSCAN.java
+++ b/src/de/lmu/ifi/dbs/elki/algorithm/clustering/AbstractProjectedDBSCAN.java
@@ -37,6 +37,7 @@ import de.lmu.ifi.dbs.elki.data.type.TypeInformation;
import de.lmu.ifi.dbs.elki.data.type.TypeUtil;
import de.lmu.ifi.dbs.elki.database.Database;
import de.lmu.ifi.dbs.elki.database.ids.DBID;
+import de.lmu.ifi.dbs.elki.database.ids.DBIDIter;
import de.lmu.ifi.dbs.elki.database.ids.DBIDUtil;
import de.lmu.ifi.dbs.elki.database.ids.ModifiableDBIDs;
import de.lmu.ifi.dbs.elki.database.query.DistanceResultPair;
@@ -166,7 +167,14 @@ public abstract class AbstractProjectedDBSCAN<R extends Clustering<Model>, V ext
this.lambda = lambda;
}
- public Clustering<Model> run(Database database, Relation<V> relation) throws IllegalStateException {
+ /**
+ * Run the algorithm
+ *
+ * @param database Database to process
+ * @param relation Relation to process
+ * @return Clustering result
+ */
+ public Clustering<Model> run(Database database, Relation<V> relation) {
FiniteProgress objprog = getLogger().isVerbose() ? new FiniteProgress("Processing objects", relation.size(), getLogger()) : null;
IndefiniteProgress clusprog = getLogger().isVerbose() ? new IndefiniteProgress("Number of clusters", getLogger()) : null;
resultList = new ArrayList<ModifiableDBIDs>();
@@ -177,9 +185,9 @@ public abstract class AbstractProjectedDBSCAN<R extends Clustering<Model>, V ext
RangeQuery<V, DoubleDistance> rangeQuery = database.getRangeQuery(distFunc);
if(relation.size() >= minpts) {
- for(DBID id : relation.iterDBIDs()) {
- if(!processedIDs.contains(id)) {
- expandCluster(distFunc, rangeQuery, id, objprog, clusprog);
+ for(DBIDIter iditer = relation.iterDBIDs(); iditer.valid(); iditer.advance()) {
+ if(!processedIDs.contains(iditer)) {
+ expandCluster(distFunc, rangeQuery, iditer.getDBID(), objprog, clusprog);
if(processedIDs.size() == relation.size() && noise.size() == 0) {
break;
}
@@ -191,8 +199,8 @@ public abstract class AbstractProjectedDBSCAN<R extends Clustering<Model>, V ext
}
}
else {
- for(DBID id : relation.iterDBIDs()) {
- noise.add(id);
+ for(DBIDIter iditer = relation.iterDBIDs(); iditer.valid(); iditer.advance()) {
+ noise.add(iditer);
if(objprog != null && clusprog != null) {
objprog.setProcessed(processedIDs.size(), getLogger());
clusprog.setProcessed(resultList.size(), getLogger());
@@ -284,28 +292,26 @@ public abstract class AbstractProjectedDBSCAN<R extends Clustering<Model>, V ext
// try to expand the cluster
ModifiableDBIDs currentCluster = DBIDUtil.newArray();
for(DistanceResultPair<DoubleDistance> seed : seeds) {
- DBID nextID = seed.getDBID();
-
- Integer nextID_corrDim = distFunc.getIndex().getLocalProjection(nextID).getCorrelationDimension();
+ int nextID_corrDim = distFunc.getIndex().getLocalProjection(seed).getCorrelationDimension();
// nextID is not reachable from start object
if(nextID_corrDim > lambda) {
continue;
}
- if(!processedIDs.contains(nextID)) {
- currentCluster.add(nextID);
- processedIDs.add(nextID);
+ if(!processedIDs.contains(seed)) {
+ currentCluster.add(seed);
+ processedIDs.add(seed);
}
- else if(noise.contains(nextID)) {
- currentCluster.add(nextID);
- noise.remove(nextID);
+ else if(noise.contains(seed)) {
+ currentCluster.add(seed);
+ noise.remove(seed);
}
}
seeds.remove(0);
while(seeds.size() > 0) {
- DBID q = seeds.remove(0).getDBID();
- Integer corrDim_q = distFunc.getIndex().getLocalProjection(q).getCorrelationDimension();
+ DistanceResultPair<DoubleDistance> q = seeds.remove(0);
+ int corrDim_q = distFunc.getIndex().getLocalProjection(q).getCorrelationDimension();
// q forms no lambda-dim hyperplane
if(corrDim_q > lambda) {
continue;
@@ -314,22 +320,22 @@ public abstract class AbstractProjectedDBSCAN<R extends Clustering<Model>, V ext
List<DistanceResultPair<DoubleDistance>> reachables = rangeQuery.getRangeForDBID(q, epsilon);
if(reachables.size() > minpts) {
for(DistanceResultPair<DoubleDistance> r : reachables) {
- Integer corrDim_r = distFunc.getIndex().getLocalProjection(r.getDBID()).getCorrelationDimension();
+ int corrDim_r = distFunc.getIndex().getLocalProjection(r).getCorrelationDimension();
// r is not reachable from q
if(corrDim_r > lambda) {
continue;
}
- boolean inNoise = noise.contains(r.getDBID());
- boolean unclassified = !processedIDs.contains(r.getDBID());
+ boolean inNoise = noise.contains(r);
+ boolean unclassified = !processedIDs.contains(r);
if(inNoise || unclassified) {
if(unclassified) {
seeds.add(r);
}
- currentCluster.add(r.getDBID());
- processedIDs.add(r.getDBID());
+ currentCluster.add(r);
+ processedIDs.add(r);
if(inNoise) {
- noise.remove(r.getDBID());
+ noise.remove(r);
}
if(objprog != null && clusprog != null) {
objprog.setProcessed(processedIDs.size(), getLogger());
@@ -349,9 +355,7 @@ public abstract class AbstractProjectedDBSCAN<R extends Clustering<Model>, V ext
resultList.add(currentCluster);
}
else {
- for(DBID id : currentCluster) {
- noise.add(id);
- }
+ noise.addDBIDs(currentCluster);
noise.add(startObjectID);
processedIDs.add(startObjectID);
}