【问题标题】:ELKI DBSCAN with R*-Tree带有 R*-Tree 的 ELKI DBSCAN
【发布时间】:2014-07-19 01:02:07
【问题描述】:

我正在尝试使用 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   |

使用简单的 System.currentTimeMillis() 围绕 dbscan.run(db) 对时间进行基准测试。查看时间列,您可以看到趋势类似于 n^2 而不是 nlog(n),但我无法理解将 ELKI DBSCAN 与 R*-Tree 优化一起使用时缺少什么。

感谢您的任何帮助或建议。

【问题讨论】:

    标签: performance r-tree dbscan elki


    【解决方案1】:

    如果选择的查询半径 epsilon 太大,每个对象都会有 O(n) 邻居。

    那么运行时将是O(n^2) 或更糟,即使有索引支持;因为每个查询的答案大小是O(n)

    如果您选择 epsilon 使得平均 10% 的对象将在 epsilon 半径内,那么您的运行时间将至少为 O(n * 10% * n),即 O(n^2)

    这很好地说明了O(n log n) 的理论运行时间在实践中可能无法为您提供O(n log n) 的运行时间。平均而言,R*-tree 可以回答 O(log n) 中的半径或 kNN 查询 - 对于小的答案集,答案集的大小可以忽略不计。更精确的分析可能会产生 O(log n + |answer| log |answer|) 的运行时间(因为我们目前按距离对答案进行排序;对于某些算法,我们可以将其删除)。

    通常情况下,假设为O(n*n) 的算法将花费您O(n*n log n) 运行时间,因为对于每个对象,您都按距离对所有其他对象进行排序。幸运的是,排序得到了很好的优化,所以额外的log n 并不重要。

    【讨论】:

    • 感谢您的回答。问题正是我有一个数据集,其中的点聚集在一个小区域中,并且我使用的 eps 值太大而无法使 R-Tree 优化工作。降低 eps 的值,R-Tree 优化开始起作用,算法变得更快。感谢您对问题的清晰解释。
    猜你喜欢
    • 2014-07-15
    • 2016-06-25
    • 2017-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-11
    • 2014-07-01
    • 2014-07-17
    相关资源
    最近更新 更多