我正在尝试显示here所示的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.有人可以告诉我为什么会这样吗?
答案 0 :(得分:1)
这是一个非常受欢迎的问题。根据定义,稀疏格式不存储0值。
Weka ARFF format page清楚地说:
警告:从中保存SparseInstance对象存在已知问题 具有字符串属性的数据集。在Weka中,字符串和名义数据 值存储为数字;这些数字作为一个索引 可能的属性值数组(这非常有效)。然而, 第一个字符串值被赋予索引0:这意味着, 在内部,此值存储为0.当SparseInstance为时 写入时,不输出内部值为0的字符串实例 他们的字符串值丢失(当再次读取arff文件时, 默认值0是不同字符串值的索引,所以 属性值似乎改变了)。要解决此问题,请添加一个 索引0处的虚拟字符串值,无论何时声明,都不会使用 可能在SparseInstance对象中使用的字符串属性 并保存为稀疏ARFF文件。
你必须首先放置一个虚拟属性。只需将您的代码修改为:
attVals = new FastVector();
attVals.addElement("dummy");
attVals.addElement("A");
attVals.addElement("B");
如果您需要任何进一步的帮助,请与我们联系。