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字段.
| 归档时间: |
|
| 查看次数: |
2874 次 |
| 最近记录: |