0

这几天我一直在寻找最合适的密度聚类工具并决定尝试一下 ELKI。对于 DBSCAN,我成功地重现了对文件“3clusters-and-noise-2d.csv”进行聚类的测试,并且还设法通过来自 github 的 ELKI 代码打印了每个集群中的集群元数据和点(最新版本)在 java 中(我对 cli 或 ui 工具并不感兴趣)。

现在,我想使用某种内部 java 结构来创建数据库,而不是通过文件导入以减少写入和读取开销。

在提供的示例中,我能够做到这一点,但仅限于文件的第一列。

我的问题基本上是,当Java中已经存在相同的数据时,如何创建通过文件创建的相同数据库?

知道了!

所以经过一些调整后,基本上你所做的是使用二维数组,其中每一行代表一个点,并且你的列数与你的维度一样多......要在不读取文件的情况下创建数据库,你基本上使用 ArrayAdapterDatabaseConnection 如下:

    double[][] data = new double[NUM_OF_POINTS][NUM_OF_DIMENSIONS]; 
    //populate data according to your app
    DatabaseConnection dbc = new ArrayAdapterDatabaseConnection(data);
    Database db = new StaticArrayDatabase(dbc, null);
    db.initialize();

    //dbscan algorithm setup
    params = new ListParameterization();
    params.addParameter(DBSCAN.Parameterizer.EPSILON_ID, 0.04);
    params.addParameter(DBSCAN.Parameterizer.MINPTS_ID, 20);
    DBSCAN<DoubleVector> dbscan = ClassGenericsUtil.parameterizeOrAbort(DBSCAN.class, params);

    //run DBSCAN on database
    Clustering<Model> result = dbscan.run(db);

我已经使用“3clusters-and-noise-2d.csv”数据集对此进行了测试,并且可以确认当我通过文件或 arrayadapter 传递它们时得到相同的结果。

4

1 回答 1

0

一个完整的例子可以在 ELKI 源代码中找到:

http://elki.dbs.ifi.lmu.de/browser/elki/elki/src/main/java/tutorial/javaapi/PassingDataToELKI.java

它生成随机数据并在其上运行 k-means。它还展示了如何可靠地映射回DBIDs您的数据点。

于 2015-07-24T07:54:34.713 回答