在Weka中获取集群分配

时间:2014-05-26 14:52:24

标签: java cluster-analysis weka k-means

我有一个CSV文件如下:

id,at1,at2,at3
1072,0.5,0.2,0.7
1092,0.2,0.5,0.7
...

我已将它加载到Weka中进行群集:

DataSource source = new DataSource("test.csv");
Instances data = source.getDataSet();
kmeans.buildClusterer(data);

问题#1:如何将第一列设置为ID?即。忽略第一列用于聚类目的。

然后我尝试打印出作业:

int[] assignments = kmeans.getAssignments();
int i = 0;
for (int clusterNum : assignments) {
    System.out.printf("Instance %d -> Cluster %d \n", i, clusterNum);
    i++;
}

打印:

Instance 1 -> Cluster 0 
Instance 2 -> Cluster 2
...

问题#2:打印作业时如何参考ID?例如:

Instance 1072 -> Cluster 0
Instance 1092 -> Cluster 2

2 个答案:

答案 0 :(得分:7)

我意识到这是一个老问题,但我来到这里寻找答案,然后能够自己解决,所以把我的解决方案放在这里为下一个有这个问题的人。在我的例子中,集群组件是Java应用程序的一部分,因此我没有选择使用Weka工作台。以下是我将ID与集群分配一起提取的方法。

int[] assignments = kmeans.getAssignments();
for (int i = 0; i < assignments; i++) {
  int id = (int) data.instance(i).value(0); // cast from double
  System.out.printf("ID %d -> Cluster %d \n", id, assignments[i]);
}

与OP不同,我没有从DataSource.getDataSet()构建我的Instances,我是从数据库表中手动构建的,但是我的情况下id字段也是第一个,所以我认为上面的代码应该是工作。我有一个自定义距离函数,在计算相似度时会跳过id字段。

答案 1 :(得分:2)

如果您使用带有GUI的Windows版Weka,您的生活会更容易。

在群集标签中,有一个用于忽略ID等属性的按钮。

并且Id用于群集分配;完成所选的聚类算法后,右键单击屏幕左侧的结果,然后显示结果然后保存。