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

时间:2016-11-02 09:52:51

标签: java cluster-analysis data-mining elki

我已经计算过群集,并且只想使用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();
    
  4. 问题在于不计算测量值 我查看了ContingencyTable和PairCounting的源代码,如果集群来自不同的数据库并且数据库只能有1个标签关系,它似乎不会起作用。
    有没有办法在ELKI中做到这一点?

1 个答案:

答案 0 :(得分:1)

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

或者您使用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,第二个数据库为n + 1..2n。但是为了比较聚类,它们需要包含相同的对象,而不是不相交的集合。