2012-04-17 9 views
1

以下は、wekaのARFFセーバーが増分モードで書かれている場合に文字列が正しく出力されない様子を示すプログラムです。以下のプログラムは、パラメータがプログラムに渡された場合はインクリメンタル・モードで、パラメータが渡されない場合はバッチ・モードで実行されます。wekaのARFF出力はインクリメンタルに保存されているかによって異なります

バッチモードでは、ARFFファイルには文字列...通常の操作が含まれています。 インクリメンタルモードでは、ARFFファイルには文字列の代わりに整数が含まれています...奇妙です!

ARFFフォーマッタをインクリメンタル形式で出力するにはどうすればよいですか?

import java.io.File; 
import java.io.IOException; 

import weka.core.Attribute; 
import weka.core.FastVector; 
import weka.core.Instance; 
import weka.core.Instances; 
import weka.core.converters.ArffSaver; 
import weka.core.converters.Saver; 

public class ArffTest { 
    static Instances instances; 
    static ArffSaver saver; 
    static boolean flag=false; 

    public static void addData(String ticker, double price) throws IOException{ 
     int numAttr = instances.numAttributes(); // same for 
     double[] vals = new double[numAttr]; 
     int i=0; 
     vals[i++] = instances.attribute(0).addStringValue(ticker); 
     vals[i++] = price; 
     Instance instance = new Instance(1.0, vals); 
     if (flag) 
      saver.writeIncremental(instance); 
     else 
      instances.add(instance); 
    } 

    public static void main(String[] args) { 
     if(args.length>0){ 
      flag=true; 
     } 
     FastVector atts = new FastVector();   // attributes 
     atts.addElement(new Attribute("Ticker", (FastVector)null));// symbol 
     atts.addElement(new Attribute("Price")); // price that order exited at. 

     instances = new Instances("Samples", atts, 0); // create header 
     saver = new ArffSaver(); 
     saver.setInstances(instances); 
     if(flag) 
      saver.setRetrieval(Saver.INCREMENTAL); 

     try{ 
      saver.setFile(new File("test.arff")); 
      addData("YY", 23.0); 
      addData("XY", 24.0); 
      addData("XX", 29.0); 
      if(flag) 
       saver.writeIncremental(null); 
      else 
       saver.writeBatch(); 
     }catch(Exception e){ 
      System.out.println("Exception"); 
     } 
    } 
} 

答えて

1

新しく作成したインスタンスをデータセットに追加するのを忘れました。

Instance instance = new DenseInstance(1.0, vals); 
instance.setDataset(instances); //Add instance! 
if (flag) 
    saver.writeIncremental(instance); 
else 
    instances.add(instance); 

インスタンスは、文字列 属性を取得するために、データセットへのアクセス権を持っている必要があります。そうでなければ、インデックスを書き出します。

さらに、Weka 3.7.6を使用することをお勧めします。インスタンスは2つの実装を持つ インターフェイスになりました。

歓声、 Mukiその修正のための

+0

感謝。私は新しいwekaバージョンに移行する必要があると思います。 – fodon

関連する問題