在 Java 中使用 ELKI 评估预计算聚类

Evaluation of precomputed clustering using ELKI in Java

我已经计算了聚类并且只想使用 ELKI 库对此聚类进行评估。

所以我有这种形式的数据:

0.234 0.923 cluster_1 true_cluster1
0.543 0.874 cluster_2 true_cluster3
...

我试过:

  1. 创建 2 个数据库:带有结果标签和参考标签:

    double [][] data;
    String [] reference_labels, result_labels;
    
    DatabaseConnection dbc1 = new ArrayAdapterDatabaseConnection(data, result_labels);
    Database db1 = new StaticArrayDatabase(dbc1, null);
    
    DatabaseConnection dbc2 = new ArrayAdapterDatabaseConnection(data, reference_labels);
    Database db2 = new StaticArrayDatabase(dbc2, null);
    
  2. 为每个数据库执行 ByLabel 聚类:

    Clustering<Model> clustering1 = new ByLabelClustering().run(db1);
    Clustering<Model> clustering2 = new ByLabelClustering().run(db2);
    
  3. 使用 ClusterContingencyTable 比较聚类和获取度量值:

    ClusterContingencyTable ct = new ClusterContingencyTable(true, false);
    ct.process(clustering1, clustering2);
    PairCounting paircount = ct.getPaircount();
    

问题是没有计算测量值。
我查看了 ContingencyTable 和 PairCounting 的源代码,如果聚类来自不同的数据库并且数据库只能有 1 个标签关系,它似乎不起作用。
有没有办法在 ELKI 中做到这一点?

您可以轻松修改 ByLabelClustering class(或实现您自己的)以仅使用第一个标签,或仅使用第二个标签;那么你只能使用一个数据库。

或者您使用 3 参数构造函数:

DatabaseConnection dbc1 = new ArrayAdapterDatabaseConnection(data, result_labels, 0);
Database db1 = new StaticArrayDatabase(dbc1, null);

DatabaseConnection dbc2 = new ArrayAdapterDatabaseConnection(data, reference_labels, 0);
Database db2 = new StaticArrayDatabase(dbc2, null);

所以 DBID 是相同的。然后 ClusterContingencyTable 应该工作。

默认情况下,ELKI 会继续 枚举对象,因此第一个数据库的 ID 为 1..n,第二个数据库的 ID 为 n+1..2n。但是为了比较聚类,它们需要包含相同的对象,而不是不相交的集合。