Я пытаюсь реализовать тестовое приложение кластеризации DBSCAN с использованием библиотеки ELKI. Мой набор данных 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 |
Время измеряется с помощью простого простого System.currentTimeMillis() вокруг dbscan.run(db). Глядя на колонку времен, вы можете видеть, что тренд похож на n^2, а не на nlog(n), но я не могу понять, чего мне не хватает, чтобы использовать ELKI DBSCAN с оптимизацией R*-Tree.
Спасибо за любую помощь или предложения.