3

ここに示すように、arffファイルのスパース表現を試していました。私のプログラムでは、クラスラベル「B」を印刷できますが、何らかの理由で「A」を印刷していません。

    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}

何らかの理由でインデックス0を取得していません。なぜこれが発生しているのか誰かに教えてもらえますか?

4

1 に答える 1

1

これは非常に一般的な問題です。定義上、スパース形式は0の値を格納しません。

Weka ARFF形式のページには、次のように明確に記載されています。

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

そもそもダミー属性を配置する必要があります。コードを次のように変更するだけです。

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

さらにサポートが必要な場合はお知らせください。

于 2012-05-30T08:36:18.133 に答える