4

我在下面有这个课程,我考虑了 wiki 和论文中给出的示例来构建它,为什么 SympleKMeans 不能处理数据?该类可以打印数据源dados,因此处理文件没有问题,错误在于构建。

package slcct;

import weka.clusterers.ClusterEvaluation;
import weka.clusterers.SimpleKMeans;
import weka.core.Instance;
import weka.core.Instances;
import weka.core.converters.ConverterUtils.DataSource;


public class Cluster {

public String path;
public Instances dados;
public String[] options = new String[2];

public Cluster(String caminho, int nclusters, int seed ){
    this.path = caminho;
    this.options[0] = String.valueOf(nclusters);
    this.options[1] = String.valueOf(seed);

}

public void ledados() throws Exception{

    DataSource source = new DataSource(path);
    dados = source.getDataSet();
    System.out.println(dados)

    if(dados.classIndex()==-1){
        dados.setClassIndex(dados.numAttributes()-1);
    }
}

public void imprimedados(){
    for(int i=0; i<dados.numInstances();i++)
    {
        Instance actual = dados.instance(i);
        System.out.println((i+1) + " : "+ actual);
    }
}

public void clustering() throws Exception{

    SimpleKMeans cluster = new SimpleKMeans();
    cluster.setOptions(options);
    cluster.setDisplayStdDevs(true);
    cluster.getMaxIterations();
    cluster.buildClusterer(dados);

    Instances ClusterCenter = cluster.getClusterCentroids();
    Instances SDev = cluster.getClusterStandardDevs();
    int[] ClusterSize = cluster.getClusterSizes(); 

    ClusterEvaluation eval = new ClusterEvaluation();
    eval.setClusterer(cluster);
    eval.evaluateClusterer(dados);

    for(int i=0;i<ClusterCenter.numInstances();i++){
        System.out.println("Cluster#"+( i +1)+ ": "+ClusterSize[i]+" dados .");
        System.out.println("Centróide:"+ ClusterCenter.instance(i));
        System.out.println("STDDEV:" + SDev.instance(i));
        System.out.println("Cluster Evaluation:"+eval.clusterResultsToString());

    }

}
}

错误:

weka.core.WekaException: weka.clusterers.SimpleKMeans: Cannot handle any class attribute!

at weka.core.Capabilities.test(Capabilities.java:1097)    
at weka.core.Capabilities.test(Capabilities.java:1018)   
at weka.core.Capabilities.testWithFail(Capabilities.java:1297) 
at weka.clusterers.SimpleKMeans.buildClusterer(SimpleKMeans.java:228)    
at slcct.Cluster.clustering(Cluster.java:53)//Here.    
at slcct.Clustering.jButton1ActionPerformed(Clustering.java:104)
4

3 回答 3

7

我相信您不需要设置类索引,因为您正在进行聚类而不是分类。尝试按照本指南进行编程 Java 集群

于 2011-05-13T11:24:14.100 回答
3

在您的“ledados()”函数中,只需删除下面给出的代码块。它会起作用的。因为您的数据中没有定义的类。

if(dados.classIndex()==-1){
    dados.setClassIndex(dados.numAttributes()-1);
}

您的新功能:

public void ledados() throws Exception{

DataSource source = new DataSource(path);
dados = source.getDataSet();
System.out.println(dados) }
于 2012-03-24T14:01:40.047 回答
0

在进行 k 聚类时,您不需要数据中的类属性

于 2012-03-22T21:25:23.867 回答