我有一个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
答案 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用于群集分配;完成所选的聚类算法后,右键单击屏幕左侧的结果,然后显示结果然后保存。