2011-05-13 27 views
4

我在下面有這個類,我考慮維基和論文中給出的例子來構建它,爲什麼SympleKMeans不能處理數據?該類可以打印數據源dados,所以它沒有錯誤處理文件,錯誤在構建。Simple K-Means does not handle iris.arff

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) 

回答

0

,而這樣做ķ集羣

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) }