1

以下は、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");
        }
    }
}
4

1 に答える 1

1

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

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

String 属性を取得するには、インスタンスがデータセットにアクセスできる必要があります。そうでない場合は、インデックスを書き出すだけです。

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

乾杯、ムキ

于 2012-04-22T14:32:29.420 に答える