我想执行k-means算法
我在eclipse中使用这个weka
我有这个代码
public class demo {
public demo() throws Exception {
// TODO Auto-generated constructor stub
BufferedReader breader = null;
breader = new BufferedReader(new FileReader(
"D:/logiciels/weka-3-7-12/weka-3-7-12/data/iris.arff"));
Instances Train = new Instances(breader);
Train.setClassIndex(Train.numAttributes() - 1);
SimpleKMeans kMeans = new SimpleKMeans();
kMeans.setSeed(10);
kMeans.setPreserveInstancesOrder(true);
kMeans.setNumClusters(3);
kMeans.buildClusterer(Train);
int[] assignments = kMeans.getAssignments();
int i = 0;
for (int clusterNum : assignments) {
System.out.printf("Instance %d -> Cluster %d", i, clusterNum);
i++;
}
breader.close();
}
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
new demo();
}
}
但是有一个例外
Exception in thread "main" weka.core.WekaException: weka.clusterers.SimpleKMeans: Cannot handle any class attribute!
at weka.core.Capabilities.test(Capabilities.java:1295)
at weka.core.Capabilities.test(Capabilities.java:1208)
at weka.core.Capabilities.testWithFail(Capabilities.java:1506)
at weka.clusterers.SimpleKMeans.buildClusterer(SimpleKMeans.java:595)
at wakaproject.demo.<init>(demo.java:24)
at wakaproject.demo.main(demo.java:37)
我已经阅读了一些解决方案,但我不知道问题在哪里
提前感谢你
答案 0 :(得分:2)
错误:
Exception in thread "main" weka.core.WekaException: weka.clusterers.SimpleKMeans: Cannot handle any class attribute!
声明SimpleKMeans无法处理类属性。这是因为K-means是一种无监督学习算法,这意味着不应该定义任何类。然而,代码中的一行设置了类值。
如果按如下方式修改代码,则可以正常工作。
public class demo {
public demo() throws Exception {
// TODO Auto-generated constructor stub
BufferedReader breader = null;
breader = new BufferedReader(new FileReader(
"D:/logiciels/weka-3-7-12/weka-3-7-12/data/iris.arff"));
Instances Train = new Instances(breader);
//Train.setClassIndex(Train.numAttributes() - 1); // comment out this line
SimpleKMeans kMeans = new SimpleKMeans();
kMeans.setSeed(10);
kMeans.setPreserveInstancesOrder(true);
kMeans.setNumClusters(3);
kMeans.buildClusterer(Train);
int[] assignments = kMeans.getAssignments();
int i = 0;
for (int clusterNum : assignments) {
System.out.printf("Instance %d -> Cluster %d", i, clusterNum);
i++;
}
breader.close();
}
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
new demo();
}
}