【问题标题】:Weka XRFFSaver including missing sparse valuesWeka XRFFSaver 包括缺失的稀疏值
【发布时间】:2013-06-23 04:47:26
【问题描述】:

我在当前的 weka 开发版本中使用 XRFFSaver 类。我使用的是 xrff 而不是 arff,因为我的数据非常稀疏,specs here 表明稀疏实例处理得很好且高效(即不包含在输出中)。

但是使用 XRFFSaver,它们会像这样包含在输出中:

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

这违背了整个练习的目的。有人知道这是操作员错误还是我需要编写自己的保护程序?

我快速查看了源代码,但在 XRFFSaver 或 XMLInstances 中找不到任何切换此行为的方法,但是快速查看。

tnx

【问题讨论】:

    标签: weka


    【解决方案1】:

    我很快想出了一个解决方案:

    注意:这是在 C# 中的(我使用 weka through ikvm)。但是,任何人都应该非常简单地转换为 Java。
    注意2:唯一重要的一行是:if (sparse) continue,我还在下面用 cmets 突出显示。其他所有内容都是我通过 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)); }
          }
        }
      }
    

    【讨论】:

      猜你喜欢
      • 2014-08-12
      • 1970-01-01
      • 2012-04-08
      • 1970-01-01
      • 2018-12-30
      • 2011-08-26
      • 2020-10-12
      • 2011-08-26
      • 1970-01-01
      相关资源
      最近更新 更多