2013-06-22 4 views
0

현재 weka 개발자 버전에서 XRFFSaver 클래스를 사용하고 있습니다. 나는 극히 드문 드문 한 데이터를 가지고 있기 때문에 arff보다는 xrff를 사용하고 있습니다. 희박한 인스턴스가 효율적으로 (출력에 포함되지 않음) 처리된다는 것을 나타내는 specs here이 있음을 나타냅니다. 부족한 희소 가치가있는 Weka XRFFSaver

그러나 그들은이 같은 출력에 포함되어 XRFFSaver를 사용 : 전체 운동의 목적을 패배

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

합니다. 누구나 이것이 운영자 오류인지 또는 내 자신의 보호기를 작성해야합니까?

원본을 빠르게 살펴 봤지만 XRFFSaver 또는 XMLInstances에서이 동작을 전환하는 방법을 찾지 못했습니다. 그러나 빠른 모양이었습니다.

나는 빨리이에 솔루션을 해킹

답변

0

TNX :

참고 :이 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)); } 
     } 
    } 
    } 
관련 문제