Simple K-Means не обрабатывает iris.arff - PullRequest
4 голосов
/ 13 мая 2011

У меня есть этот класс ниже, я создаю его с учетом примеров, приведенных в вики и в диссертации, почему SympleKMeans не может обрабатывать данные? Класс может печатать данные Dadasource, так что нет ничего плохого в обработке файла, ошибка в сборке.

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)

Ответы [ 3 ]

7 голосов
/ 13 мая 2011

Я считаю, что вам не нужно устанавливать индекс класса, так как вы делаете кластеризацию, а не классификацию. Попробуйте это руководство по программной кластеризации Java .

3 голосов
/ 24 марта 2012

В вашей функции 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) }
0 голосов
/ 23 марта 2012

Вам не понадобится атрибут класса в данных при выполнении кластеризации k

...