8

WEKA GUIを使用してJ48モデルを訓練して作成しました。私はモデルファイルを自分のコンピュータに保存しましたが、今はJavaコードで単一のインスタンスを分類するためにモデルファイルを使用したいと思います。私は属性 "クラスタ"の予測を取得したいと思います。しかし、私はラインinst_co.setValue(latitude, lat);にIndexArrayOutofBoundsExceptionを取得Wekaでの単一インスタンスの分類

public void classify(double lat, double lon, double co) 
{    

// Create attributes to be used with classifiers 
        Attribute latitude = new Attribute("latitude"); 
        Attribute longitude = new Attribute("longitude"); 
        Attribute carbonmonoxide = new Attribute("co"); 

        // Create instances for each pollutant with attribute values latitude, longitude and pollutant itself 
        inst_co = new DenseInstance(4); 

        // Set instance's values for the attributes "latitude", "longitude", and "pollutant concentration" 
        inst_co.setValue(latitude, lat); 
        inst_co.setValue(longitude, lon); 
        inst_co.setValue(carbonmonoxide, co); 
        inst_co.setMissing(cluster); 


    Classifier cls_co = (Classifier) weka.core.SerializationHelper.read("/CO_J48Model.model");//load classifier from file 

        // Test the model 
     double result = cls_co.classifyInstance(inst_co); 
} 

:私は何をするには、次のです。私はこの例外の理由を見つけることができませんでした。私は誰かが正しい方向に私を指すことができれば感謝します。

答えて

8

inst_coをデータセットInstancesオブジェクトに追加する必要があります。次のコードはうまくいくはずです。

import java.util.ArrayList; 

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

public class QuestionInstanceClassifiy { 

    public static void main(String[] args) { 
     QuestionInstanceClassifiy q = new QuestionInstanceClassifiy(); 
     double result = q.classify(1.0d, 1, 1); 
     System.out.println(result); 
    } 

    private Instance inst_co; 

    public double classify(double lat, double lon, double co) { 

     // Create attributes to be used with classifiers 
     // Test the model 
     double result = -1; 
     try { 

      ArrayList<Attribute> attributeList = new ArrayList<Attribute>(2); 

      Attribute latitude = new Attribute("latitude"); 
      Attribute longitude = new Attribute("longitude"); 
      Attribute carbonmonoxide = new Attribute("co"); 

      ArrayList<String> classVal = new ArrayList<String>(); 
      classVal.add("ClassA"); 
      classVal.add("ClassB"); 


      attributeList.add(latitude); 
      attributeList.add(longitude); 
      attributeList.add(carbonmonoxide); 
      attributeList.add(new Attribute("@@[email protected]@",classVal)); 

      Instances data = new Instances("TestInstances",attributeList,0); 


      // Create instances for each pollutant with attribute values latitude, 
      // longitude and pollutant itself 
      inst_co = new DenseInstance(data.numAttributes()); 
      data.add(inst_co); 

      // Set instance's values for the attributes "latitude", "longitude", and 
      // "pollutant concentration" 
      inst_co.setValue(latitude, lat); 
      inst_co.setValue(longitude, lon); 
      inst_co.setValue(carbonmonoxide, co); 
      // inst_co.setMissing(cluster); 

      // load classifier from file 
      Classifier cls_co = (Classifier) weka.core.SerializationHelper 
        .read("/CO_J48Model.model"); 

      result = cls_co.classifyInstance(inst_co); 
     } catch (Exception e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     return result; 
    } 
} 

インスタンスからデータオブジェクトを作成します。このデータにインスタンスを追加します。その後、インスタンスに値を設定できます。

Instances data = new Instances("TestInstances",attributeList,0); 
inst_co = new DenseInstance(data.numAttributes()); 
data.add(inst_co); 

ヘッダー情報とインスタンス値を外部ファイルから取得するか、この情報を1回だけ作成することをお勧めします。

+0

偉大な答えをありがとう。明確にするために、classAとclassBは分類の可能な結果、つまり私のクラスタ名ですか?私は彼らがモデルを作成している間に使用されたものと同じである必要があると思います。 – Erol

+0

私はweka.core.UnassignedDatasetExceptionが発生しています:DenseInstanceはデータセットにアクセスできません!エラー。私はそれをデータセットに割り当てなければならないでしょう。 – Erol

+0

@babatenor同じヘッダーを持つデータセットに割り当てる必要があります。彼らのヘッダー情報は同じでなければなりません –

3

実際に私は私の状況では、インスタンスaddInstanceメソッドではなく、instance.setDataSet()メソッドを呼び出してみました。あなたはコードinst_co.setDataSet(data)でなければなりません。

関連する問題