20
20
*/
21
21
package elki .outlier .subspace ;
22
22
23
- import java .util .Arrays ;
24
23
import java .util .Random ;
25
24
26
25
import elki .clustering .hierarchical .extraction .HDBSCANHierarchyExtraction ;
37
36
import elki .database .datastore .DataStoreFactory ;
38
37
import elki .database .datastore .DataStoreUtil ;
39
38
import elki .database .datastore .WritableDoubleDataStore ;
40
- import elki .database .ids .DBIDFactory ;
41
- import elki .database .ids .DBIDIter ;
42
- import elki .database .ids .DBIDRange ;
43
- import elki .database .ids .DBIDUtil ;
39
+ import elki .database .ids .*;
44
40
import elki .database .relation .*;
45
41
import elki .datasource .ArrayAdapterDatabaseConnection ;
46
42
import elki .datasource .DatabaseConnection ;
@@ -117,16 +113,14 @@ public OutRankS1HDBSCAN(HDBSCANHierarchyExtraction hdbscanExtraction, double alp
117
113
/**
118
114
* Run the clustering algorithm.
119
115
*
120
- * @param db Database
121
116
* @param relation Relation
122
117
* @return Outlier result
123
118
*/
124
- public OutlierResult run (Database db , Relation <? extends NumberVector > relation ) {
125
- final int n = relation .size ();
119
+ public OutlierResult run (Relation <? extends NumberVector > relation ) {
126
120
final int dim = RelationUtil .dimensionality (relation );
121
+ final DBIDRange ids = DBIDUtil .assertRange (relation .getDBIDs ());
127
122
SimpleTypeInformation <NumberVector > type ;
128
- double [] score = new double [n ];
129
- Arrays .fill (score , 0. );
123
+ double [] score = new double [ids .size ()];
130
124
for (int subspace = 0 ; subspace < subspaces ; subspace ++) {
131
125
// Features selection for subspace
132
126
final Random random = rnd .getSingleThreadedRandom ();
@@ -135,11 +129,10 @@ public OutlierResult run(Database db, Relation<? extends NumberVector> relation)
135
129
NumericalFeatureSelection <NumberVector > projection = new NumericalFeatureSelection <>(subspacedims );
136
130
projection .initialize (relation .getDataTypeInformation ());
137
131
138
- // Build virtual relation
132
+ // Build the projected data set
139
133
type = VectorFieldTypeInformation .typeRequest (NumberVector .class , projdims , projdims );
140
- DBIDRange vids = DBIDFactory .FACTORY .generateStaticDBIDRange (1 , relation .size ());
141
- MaterializedRelation <NumberVector > vrelation = new MaterializedRelation <>(type , vids );
142
- for (DBIDIter it = relation .iterDBIDs (); it .valid (); it .advance ()) {
134
+ MaterializedRelation <NumberVector > vrelation = new MaterializedRelation <>(type , ids );
135
+ for (DBIDIter it = ids .iter (); it .valid (); it .advance ()) {
143
136
vrelation .insert (it , projection .project (relation .get (it )));
144
137
}
145
138
@@ -166,7 +159,7 @@ public OutlierResult run(Database db, Relation<? extends NumberVector> relation)
166
159
double reldim = projdims / (double ) maxdim ;
167
160
// Process objects in the cluster
168
161
for (DBIDIter iter = cluster .getIDs ().iter (); iter .valid (); iter .advance ()) {
169
- final int offset = DBIDUtil . asInteger (iter ) - 1 - ( n * (subspace + 1 ));
162
+ final int offset = ids . index (iter ) - ( ids . size () * (subspace + 1 ));
170
163
double oldscore = score [offset ];
171
164
double newscore = oldscore + (alpha * relsize + (1 - alpha ) * reldim );
172
165
score [offset ] = newscore ;
@@ -176,9 +169,9 @@ public OutlierResult run(Database db, Relation<? extends NumberVector> relation)
176
169
177
170
DoubleMinMax minmax = new DoubleMinMax ();
178
171
type = VectorFieldTypeInformation .typeRequest (NumberVector .class , dim , dim );
179
- WritableDoubleDataStore meanscore = DataStoreUtil .makeDoubleStorage (db . getRelation ( type ). getDBIDs () , DataStoreFactory .HINT_HOT );
180
- for (DBIDIter iter = relation . iterDBIDs (); iter .valid (); iter .advance ()) {
181
- double newscore = score [DBIDUtil . asInteger ( iter ) - 1 ] / (double ) subspaces ;
172
+ WritableDoubleDataStore meanscore = DataStoreUtil .makeDoubleStorage (ids , DataStoreFactory .HINT_DB );
173
+ for (DBIDArrayIter iter = ids . iter (); iter .valid (); iter .advance ()) {
174
+ double newscore = score [iter . getOffset () ] / (double ) subspaces ;
182
175
meanscore .put (iter , newscore );
183
176
minmax .put (newscore );
184
177
}
0 commit comments