2012-03-23 97 views
3

我正在尝试如图here所示的arff文件的稀疏表示。在我的程序中,我可以打印类别标签“B”,但出于某种原因,它不打印“A”。Weka打印稀疏arff文件

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.有人可以告诉我wh这发生了吗?

回答

1

这是一个非常流行的问题。稀疏格式根据定义不存储0个值。

Weka的ARFF format page明确说:

警告:有一个已知的问题从 数据集具有字符串属性保存SparseInstance对象。在Weka中,字符串和标称数据 值存储为数字;这些数字充当可能属性值的数组(作为非常有效的数组)的索引。但是, 的第一个字符串值被分配了索引0:这意味着,内部为 ,该值存储为0.当SparseInstance被写入 时,不会输出内部值为0的字符串实例,因此 的字符串值为丢失(并且当再次读取该文件文件时, 默认值0是不同字符串值的索引,因此 属性值似乎改变)。要解决此问题,请在索引0处添加一个 虚拟字符串值,该值永远不会用于您声明 字符串属性,这些字符串属性可能在SparseInstance对象 中使用并保存为稀疏ARFF文件。

您必须首先放置一个虚拟属性。只需将您的代码修改为:

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

让我知道你是否需要任何进一步的帮助。