3

我正在尝试 arff 文件的稀疏表示,如此处所示。在我的程序中,我可以打印类标签“B”,但由于某种原因它没有打印“A”。

    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。有人可以告诉我为什么会这样吗?

4

1 回答 1

1

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

Weka ARFF 格式页面明确表示:

警告:从具有字符串属性的数据集中保存 SparseInstance 对象存在一个已知问题。在 Weka 中,字符串和标称数据值存储为数字;这些数字充当可能属性值数组的索引(这非常有效)。但是,第一个字符串值被分配索引 0:这意味着,在内部,这个值被存储为 0。当写入 SparseInstance 时,内部值为 0 的字符串实例不会输出,因此它们的字符串值会丢失(并且当再次读取arff文件,默认值0是不同字符串值的索引,所以属性值出现变化)。为了解决这个问题,

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

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

如果您需要任何进一步的帮助,请告诉我。

于 2012-05-30T08:36:18.133 回答