2013-06-22 36 views
0

我在當前的weka dev版本中使用XRFFSaver類。我使用xrff而不是arff,因爲我擁有極其稀疏的數據,並且specs here指示稀疏實例可以很好地處理(即,不包含在輸出中)。Weka XRFFSaver包含缺失的稀疏值

但是使用XRFFSaver它們包含在這樣的輸出:

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

這違背了整個演習的目的。任何人都知道這是操作員錯誤還是我需要寫我自己的保護程序?

我快速查看了源代碼,但無法在XRFFSaver或XMLInstances中找到切換此行爲的任何方法,但它是快速查看。

TNX

回答

0

我很快就設計了一個簡單的解決方案是:

注:這是在C#(我用weka through ikvm)。但是,對於任何人轉換爲Java,這應該是非常簡單的。
注2:唯一重要的一行是這一個: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)); } 
     } 
    } 
    }