4

私は以下にこのクラスを持っています.wikiと論文で与えられた例を考慮してそれを構築します.なぜSympleKMeansはデータを処理できないのですか? クラスはデータソースのダドスを出力できるため、ファイルの処理に問題はなく、エラーはビルドにあります。

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 に答える