2013-11-20 27 views
3

我想簇集由經度和緯度指定的點。我正在使用WEKA API 問題是與Instances instances = new Instances(40.01,1.02); 那麼,如何指定輸入數據而不使用ARFF文件?我只想將數組讀入Instances使用WEKA API定義用於聚類的輸入數據

import java.io.Reader; 

import weka.clusterers.ClusterEvaluation; 
import weka.clusterers.SimpleKMeans; 
import weka.core.Instances; 


public class test { 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 
     Instances instances = new Instances(40.01,1.02); 

     SimpleKMeans simpleKMeans = new SimpleKMeans(); 
     simpleKMeans.buildClusterer(instances); 

     ClusterEvaluation eval = new ClusterEvaluation(); 
     eval.setClusterer(simpleKMeans); 
     eval.evaluateClusterer(new Instances(instances)); 

     eval.clusterResultsToString(); 
    } 

} 

回答

3

我相信你必須創建你自己的實例。下面我將展示使用兩個屬性(經度和緯度)創建一個新實例。


import weka.core.Attribute; 
import weka.core.DenseInstance; 
import weka.core.FastVector; 
import weka.core.Instances; 

public class AttTest { 

    public static void main(String[] args) throws Exception 
    { 
     double[] one={0,1,2,3}; 
     double[] two={3,2,1,0}; 
     double[][] both=new double[2][4]; 
     both[0]=one; 
     both[1]=two; 

     Instances to_use=AttTest.buildArff(both); 
     System.out.println(to_use.toString()); 
    } 

    public static Instances buildArff(double[][] array) throws Exception 
    { 
     FastVector  atts = new FastVector(); 
     atts.addElement(new Attribute("lat")); //latitude 
     atts.addElement(new Attribute("lon")); //longitude 

     // 2. create Instances object 
     Instances test = new Instances("location", atts, 0); 

     // 3. fill with data 
     for(int s1=0; s1 < array[0].length; s1=s1+1) 
     { 
      double vals[] = new double[test.numAttributes()]; 
      vals[0] = array[0][s1]; 
      vals[1] = array[1][s1]; 
      test.add(new DenseInstance(1.0, vals)); 
     } 

     return(test); 
    } 
}
相關問題