我在尝试arff文件的稀疏表示,如here所示。在我的程序中,我可以打印类标签“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。有人能告诉我为什么会这样吗?

最佳答案

这是一个非常普遍的问题。根据定义,稀疏格式不存储0个值。
韦卡清楚地说:
警告:从中保存SparseInstance对象时出现已知问题
具有字符串属性的数据集。在WEKA中,字符串和标称数据
值存储为数字;这些数字用作
可能的属性值数组(这非常有效)。然而,
第一个字符串值被指定为索引0:这意味着,
在内部,此值存储为0。当火花装置
没有输出内部值为0的已写入字符串实例,因此
它们的字符串值丢失(当再次读取arff文件时,
默认值0是不同字符串值的索引,因此
属性值似乎发生更改)。为了解决这个问题,添加
索引0处的伪字符串值,无论何时声明
可能在SparseInstance对象中使用的字符串属性
并保存为稀疏的arff文件。
首先必须放置一个dummy属性。只需将代码修改为:

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

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

08-24 13:59