0

現在の weka dev バージョンでは XRFFSaver クラスを使用しています。非常にまばらなデータがあるため、arff ではなく xrff を使用しています。ここでの仕様は、まばらなインスタンスが適切かつ効率的に処理される (つまり、出力に含まれない) ことを示しています。

ただし、XFFSaver を使用すると、次のように出力に含まれます。

<value index="1" missing="yes"/>
<value index="2" missing="yes"/>
...

これは、演習全体の目的を無効にします。これがオペレーターのエラーなのか、それとも独自のセーバーを作成する必要があるのか​​ 誰にもわかりますか?

ソースをざっと見てみたところ、XFFSaver または XMLInstances のいずれかでこの動作を切り替える方法が見つかりませんでしたが、ざっと見ただけでした。

tnx

4

1 に答える 1

0

私はすぐにこれに対する解決策をハックしました:

注: これは C# です (私はikvm で wekaを使用しています)。ただし、これは誰でも簡単に Java に変換できるはずです。
注 2: 唯一の重要な行は次の 1 行です。if (sparse) continueこれもコメントで強調表示しています。それ以外はすべて、grepcode と google で見つけた weka ソースのそのままのコピーです。私がコピーした最新バージョンかどうかさえわからないので、慎重に使用してください。

また、標準の XRFFLoader がこれを正しく処理することを確認するためにテストしました。

TNX

  // Usage
  var saver = new EfficientXRFFSaver();
  saver.setCompressOutput(file.EndsWith(".gz"));
  saver.setInstances(Instances);
  saver.setFile(new java.io.File(file));
  saver.writeBatch();

  // Implementation
  public class EfficientXRFFSaver : XRFFSaver
  {
    public override void resetOptions() {
      base.resetOptions();
      setFileExtension(getCompressOutput() ? XRFFLoader.FILE_EXTENSION_COMPRESSED : XRFFLoader.FILE_EXTENSION);

      try { m_XMLInstances = new EfficientXMLInstances(); } 
      catch { m_XMLInstances = null; }
    }
  }

  public class EfficientXMLInstances : XMLInstances
  {
    protected override void addInstance(Element parent, Instance inst) {      
      var node = m_Document.createElement(TAG_INSTANCE);
      parent.appendChild(node);

      var sparse = inst is SparseInstance;
      if (sparse) { node.setAttribute(ATT_TYPE, VAL_SPARSE); }
      if (inst.weight() != 1.0) { node.setAttribute(ATT_WEIGHT, Utils.doubleToString(inst.weight(), m_Precision)); }
      for (var i = 0; i < inst.numValues(); i++) {
        var index = inst.index(i);

        var value = m_Document.createElement(TAG_VALUE);        
        if (inst.isMissing(index)) {

          // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
          // !!!!!!!!!! IMPORTANT !!!!!!!!!!!!!
          // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
          // This line will not add this element if its missing and sparse.
          if (sparse) continue;
          value.setAttribute(ATT_MISSING, VAL_YES);
        } else {
          if (inst.attribute(index).isRelationValued()) {
            var child = m_Document.createElement(TAG_INSTANCES);
            value.appendChild(child);
            for (var n = 0; n < inst.relationalValue(i).numInstances(); n++) {
              addInstance(child, inst.relationalValue(i).instance(n));
            }
          } else {
            value.appendChild(inst.attribute(index).type() == weka.core.Attribute.NUMERIC ? 
                m_Document.createTextNode(Utils.doubleToString(inst.value(index), m_Precision)) : 
                m_Document.createTextNode(validContent(inst.stringValue(index))));
          }
        }
        node.appendChild(value);
        if (sparse) { value.setAttribute(ATT_INDEX, "" + (index + 1)); }
      }
    }
  }
于 2013-06-22T20:47:26.243 に答える