在Weka中获取集群分配

p_m*_*mcp 1 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
...
Run Code Online (Sandbox Code Playgroud)

我已经将它加载到Weka中进行聚类:

DataSource source = new DataSource("test.csv");
Instances data = source.getDataSet();
kmeans.buildClusterer(data);
Run Code Online (Sandbox Code Playgroud)

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

然后我尝试打印出作业:

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

这打印:

Instance 1 -> Cluster 0 
Instance 2 -> Cluster 2
...
Run Code Online (Sandbox Code Playgroud)

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

Instance 1072 -> Cluster 0
Instance 1092 -> Cluster 2
Run Code Online (Sandbox Code Playgroud)

小智 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]);
}
Run Code Online (Sandbox Code Playgroud)

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