2012-03-23 47 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"); 

讓我知道你是否需要任何進一步的幫助。