|
34 | 34 | import elki.database.ids.DBIDUtil;
|
35 | 35 | import elki.database.ids.DBIDs;
|
36 | 36 | import elki.database.ids.ModifiableDBIDs;
|
| 37 | +import elki.database.query.QueryBuilder; |
| 38 | +import elki.database.query.distance.DistanceQuery; |
37 | 39 | import elki.database.relation.ProxyView;
|
38 | 40 | import elki.database.relation.Relation;
|
39 | 41 | import elki.database.relation.RelationUtil;
|
40 | 42 | import elki.distance.subspace.DimensionSelectingSubspaceDistance;
|
41 | 43 | import elki.distance.subspace.SubspaceEuclideanDistance;
|
| 44 | +import elki.index.RangeIndex; |
42 | 45 | import elki.logging.Logging;
|
43 | 46 | import elki.logging.progress.FiniteProgress;
|
44 | 47 | import elki.logging.progress.StepProgress;
|
45 | 48 | import elki.math.linearalgebra.Centroid;
|
46 | 49 | import elki.result.Metadata;
|
47 | 50 | import elki.utilities.datastructures.BitsUtil;
|
| 51 | +import elki.utilities.datastructures.iterator.It; |
48 | 52 | import elki.utilities.documentation.Description;
|
49 | 53 | import elki.utilities.documentation.Reference;
|
50 | 54 | import elki.utilities.documentation.Title;
|
|
72 | 76 | * only include points in clusters that are not already part of sub-clusters
|
73 | 77 | * (note that this does not remove overlap of independent subspaces).
|
74 | 78 | * <p>
|
| 79 | + * TODO: modifying the subspaces of the distance function can cause weird |
| 80 | + * errors. Rather replace this with a subspace distance factory. |
| 81 | + * <p> |
75 | 82 | * Reference:
|
76 | 83 | * <p>
|
77 | 84 | * Karin Kailing, Hans-Peter Kriegel, Peer Kröger<br>
|
@@ -316,17 +323,22 @@ private List<Cluster<Model>> runDBSCAN(Relation<V> relation, DBIDs ids, Subspace
|
316 | 323 | }
|
317 | 324 | // subset filter:
|
318 | 325 | relation = ids == null ? relation : new ProxyView<>(ids, relation);
|
319 |
| - |
320 |
| - DBSCAN<V> dbscan = new DBSCAN<>(distance, epsilon, minpts); |
321 |
| - Clustering<Model> dbsres = dbscan.run(relation); |
322 |
| - |
| 326 | + Clustering<Model> dbsres = new DBSCAN<>(distance, epsilon, minpts).run(relation); |
323 | 327 | // separate cluster and noise
|
324 | 328 | List<Cluster<Model>> clusters = new ArrayList<>();
|
325 | 329 | for(Cluster<Model> c : dbsres.getAllClusters()) {
|
326 | 330 | if(!c.isNoise()) {
|
327 | 331 | clusters.add(c);
|
328 | 332 | }
|
329 | 333 | }
|
| 334 | + // Remove any automatically generated index associated with this distance |
| 335 | + // because we modify the distance subspace again! |
| 336 | + DistanceQuery<V> dq = new QueryBuilder<>(relation, distance).distanceQuery(); |
| 337 | + for(It<RangeIndex<V>> it = Metadata.hierarchyOf(relation).iterChildrenReverse().filter(RangeIndex.class); it.valid(); it.advance()) { |
| 338 | + if(it.get().rangeByDBID(dq, epsilon, 0) != null) { |
| 339 | + Metadata.hierarchyOf(relation).removeChild(it.get()); |
| 340 | + } |
| 341 | + } |
330 | 342 | return clusters;
|
331 | 343 | }
|
332 | 344 |
|
|
0 commit comments