ELKI ライブラリを使用して DBSCAN クラスタリング テスト アプリケーションを実装しようとしています。私のデータセットは 6 次元で、約 100.000 個のオブジェクトで構成されています。
コード内で R*-Tree ELKI 最適化を使用しようとしましたが、コードをベンチマークすると、まだ O(n^2) で動作しているようです。
これは、アプリケーション内で使用するコードです。
ListParameterization dbscanParams = new ListParameterization();
dbscanParams.addParameter(DBSCAN.Parameterizer.EPSILON_ID, eps);
dbscanParams.addParameter(DBSCAN.Parameterizer.MINPTS_ID, minPts);
dbscanParams.addParameter(DBSCAN.DISTANCE_FUNCTION_ID, EuclideanDistanceFunction.class);
DBSCAN<DoubleVector, DoubleDistance> dbscan = ClassGenericsUtil.parameterizeOrAbort(DBSCAN.class, dbscanParams);
ArrayAdapterDatabaseConnection arrayAdapterDatabaseConnection = new ArrayAdapterDatabaseConnection(featuresMatrix, featuresLabels);
ListParameterization dbparams = new ListParameterization();
dbparams.addParameter(AbstractDatabase.Parameterizer.INDEX_ID, RStarTreeFactory.class);
dbparams.addParameter(RStarTreeFactory.Parameterizer.BULK_SPLIT_ID, SortTileRecursiveBulkSplit.class);
dbparams.addParameter(AbstractDatabase.Parameterizer.DATABASE_CONNECTION_ID, arrayAdapterDatabaseConnection);
dbparams.addParameter(AbstractPageFileFactory.Parameterizer.PAGE_SIZE_ID, pageSize);
Database db = ClassGenericsUtil.parameterizeOrAbort(StaticArrayDatabase.class, dbparams);
db.initialize();
Clustering<Model> result = dbscan.run(db);
上記のコードを実行すると、次の結果が得られます。
| NUM_OBJECTS | TIME(ms) |
|-------------|------------|
| 4444 | 1508 |
| 8887 | 5547 |
| 17768 | 23401 |
| 35536 | 103733 |
| 71040 | 426494 |
| 142080 | 1801652 |
時間は、dbscan.run(db) の周りで単純な System.currentTimeMillis() を使用してベンチマークされます。時間の列を見ると、n^2 のような傾向であり、nlog(n) のような傾向ではないことがわかりますが、R*-Tree 最適化で ELKI DBSCAN を使用するために何が欠けているのか理解できません。
助けや提案をありがとう。