2012-03-23 8 views
3

私は、hereのように、arffファイルの疎な表現を試していました。私のプログラムでは、クラスラベル "B"を印刷することができましたが、何らかの理由で "A"を印刷していません。Weka printing sparse arff file

attVals = new FastVector(); 
    attVals.addElement("A"); 
    attVals.addElement("B"); 
    atts.addElement(new Attribute("class", attVals)); 

    vals[index] = attVals.indexOf("A"); 

プログラムの出力は次のようである -

{0 6,2 8}  --- I should get {0 6,2 8,3 A} 

しかし、私は

vals[index] = attVals.indexOf("B"); 

を行うとき、私は適切な出力を得る - それはいくつかの理由について

{0 6,2 8,3 B} 

を誰かが私にwhを伝えることはできますか?これは起こっていますか?

答えて

1

これは非常に一般的な問題です。定義による疎フォーマットは0値を格納しません。

ウェカARFF format pageははっきりと述べている:

警告:文字列の属性を持つ データセットからSparseInstanceオブジェクトを保存する既知の問題があります。 Wekaでは、文字列と公称データの数値は数字として格納されます。これらの数値は、可能な属性値の配列の 配列へのインデックスとして機能します(これは非常に効率的です)。ただし、 最初の文字列の値にはインデックス0が割り当てられます。つまり、内部で という値が格納されています.SparseInstanceが の場合、内部値0の文字列インスタンスは出力されないため、文字列値は です。 (また、arffファイルを再度読み取ると、 のデフォルト値0は異なる文字列値のインデックスになるため、 の属性値が変更されているように見えます)。この問題を回避するには、 のSparseInstanceオブジェクトで使用され、スパースARFFファイルとして保存される可能性が高い文字列属性を宣言すると、決して使用されないインデックス0に ダミー文字列値を追加します。

最初にダミー属性を配置する必要があります。コードを次のように変更してください:

attVals = new FastVector(); 
attVals.addElement("dummy"); 
attVals.addElement("A"); 
attVals.addElement("B"); 

さらなるヘルプが必要な場合はお知らせください。

関連する問題