2012-08-25 69 views
6

如何將新實例添加到我創建的現有實例對象中?在weka中添加新實例

下面是一個例子:

ArrayList<Attribute> atts = new ArrayList<Attribute>(2); 
ArrayList<String> classVal = new ArrayList<String>(); 
classVal.add("A"); 
classVal.add("B"); 
atts.add(new Attribute("content",(ArrayList<String>)null)); 
atts.add(new Attribute("@@[email protected]@",classVal)); 

Instances dataRaw = new Instances("TestInstances",atts,0); 

我想一個新的實例添加到dataRaw。據我所知我必須使用dataRaw.add(Instance i)....如果Instance類是一個接口,如何創建一個實例對象?

在此先感謝

+0

傳遞Instance',你可以看到[點擊這裏](HTTP的'的實現:/ /weka.sourceforge.net/doc.dev/weka/core/Instance.html)在__所有已知的實現類___下。 – oldrinb

+0

PS你將無法添加任何東西,因爲你在構造函數中將'0'傳遞給'capacity'參數。 – oldrinb

+0

我遵循這個指南在這裏(http://weka.wikispaces.com/Creating+an+ARFF+file),據我瞭解這是最初的能力。你能給我舉一個例子如何添加一個新的實例到我創建的對象?謝謝... – TeFa

回答

15

讓我們從一些亮點開始。

  • weka將每個實例值存儲爲double []。因此,您可以創建double [] instanceValue1並將值添加到此數組。
  • 即使字符串存儲在這個double []中。你有下面的代碼添加字符串值:

instanceValue1 [0] = dataRaw.attribute(0).addStringValue( 「!這是一個字符串」);

  • 實例是接口,並且它由兩個類,{SparseInstance,DenseInstance}實現。我們用下面的代碼,我們的價值陣列添加到數據集:

dataRaw.add(新DenseInstance(1.0,instanceValue1));

下面是完整的運行示例:

import java.util.ArrayList; 

import weka.core.Attribute; 
import weka.core.DenseInstance; 
import weka.core.Instance; 
import weka.core.Instances; 

public class Program { 
    public static void main(String[] args) { 
     ArrayList<Attribute> atts = new ArrayList<Attribute>(2); 
     ArrayList<String> classVal = new ArrayList<String>(); 
     classVal.add("A"); 
     classVal.add("B"); 
     atts.add(new Attribute("content",(ArrayList<String>)null)); 
     atts.add(new Attribute("@@[email protected]@",classVal)); 

     Instances dataRaw = new Instances("TestInstances",atts,0); 
     System.out.println("Before adding any instance"); 
     System.out.println("--------------------------"); 
     System.out.println(dataRaw); 
     System.out.println("--------------------------"); 

     double[] instanceValue1 = new double[dataRaw.numAttributes()]; 

     instanceValue1[0] = dataRaw.attribute(0).addStringValue("This is a string!"); 
     instanceValue1[1] = 0; 

     dataRaw.add(new DenseInstance(1.0, instanceValue1)); 

     System.out.println("After adding a instance"); 
     System.out.println("--------------------------"); 
     System.out.println(dataRaw); 
     System.out.println("--------------------------"); 

     double[] instanceValue2 = new double[dataRaw.numAttributes()]; 

     instanceValue2[0] = dataRaw.attribute(0).addStringValue("This is second string!"); 
     instanceValue2[1] = 1; 

     dataRaw.add(new DenseInstance(1.0, instanceValue2)); 

     System.out.println("After adding second instance"); 
     System.out.println("--------------------------"); 
     System.out.println(dataRaw); 
     System.out.println("--------------------------"); 


    } 

} 

其輸出如下:

Before adding any instance 
-------------------------- 
@relation TestInstances 

@attribute content string 
@attribute @@[email protected]@ {A,B} 

@data 

-------------------------- 
After adding a instance 
-------------------------- 
@relation TestInstances 

@attribute content string 
@attribute @@[email protected]@ {A,B} 

@data 
'This is a string!',A 
-------------------------- 
After adding second instance 
-------------------------- 
@relation TestInstances 

@attribute content string 
@attribute @@[email protected]@ {A,B} 

@data 
'This is a string!',A 
'This is second string!',B 
-------------------------- 
+0

我可以知道你使用了哪個API嗎? – aceminer

+0

Weka和普通的java集合api。 –

+0

嗨@AtillaOzgur我得到了-1「dataRaw.attribute(0).addStringValue(」This is second string!「);」部分在我的代碼中,當我嘗試分配給double [] var 請給我一個提示...... –