Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Simple K-Means doesnt handle iris.arff

Tags:

java

weka

I have this class below, i build it considering the examples given on the wiki and in a thesis, why can't SympleKMeans handle data? The class can print the Datasource dados, so its nothing wrong with processing file, the error is on the build.

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());

    }

}
}

The error:

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)
like image 323
Jay Avatar asked Dec 28 '22 20:12

Jay


2 Answers

I believe you need not set the class index, as you are doing clustering and not classification. Try following this guide for programmatic Java clustering.

like image 142
Yuval F Avatar answered Dec 30 '22 08:12

Yuval F


In your "ledados()" function just remove the code block given below. It will work. Because you have no defined class in your data.

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

Your new function:

public void ledados() throws Exception{

DataSource source = new DataSource(path);
dados = source.getDataSet();
System.out.println(dados) }
like image 26
cuneytykaya Avatar answered Dec 30 '22 08:12

cuneytykaya