在 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
...
我试过:
创建 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 中做到这一点?
您可以轻松修改 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。但是为了比较聚类,它们需要包含相同的对象,而不是不相交的集合。
我已经计算了聚类并且只想使用 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 中做到这一点?
您可以轻松修改 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。但是为了比较聚类,它们需要包含相同的对象,而不是不相交的集合。