我已经计算过群集,并且只想使用ELKI库来对此群集执行评估。
所以我有这种形式的数据:
0.234 0.923 cluster_1 true_cluster1
0.543 0.874 cluster_2 true_cluster3
...
我试图:
创建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);
为每个数据库执行ByLabel群集:
Clustering<Model> clustering1 = new ByLabelClustering().run(db1);
Clustering<Model> clustering2 = new ByLabelClustering().run(db2);
使用ClusterContingencyTable比较群集和获取度量:
ClusterContingencyTable ct = new ClusterContingencyTable(true, false);
ct.process(clustering1, clustering2);
PairCounting paircount = ct.getPaircount();
问题在于不计算测量值
我查看了ContingencyTable和PairCounting的源代码,如果集群来自不同的数据库并且数据库只能有1个标签关系,它似乎不会起作用。
有没有办法在ELKI中做到这一点?
答案 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。但是为了比较聚类,它们需要包含相同的对象,而不是不相交的集合。