8

में सिंगल इंस्टेंस को वर्गीकृत करना मैंने WEKA gui का उपयोग करके एक J48 मॉडल को प्रशिक्षित और बनाया। मैंने मॉडल फ़ाइल को अपने कंप्यूटर पर सहेजा और अब मैं इसे अपने जावा कोड में एक उदाहरण को वर्गीकृत करने के लिए उपयोग करना चाहता हूं। मैं विशेषता "क्लस्टर" के लिए भविष्यवाणी करना चाहता हूं।वेका

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); 
} 

हालांकि, मैं लाइन inst_co.setValue(latitude, lat); पर एक IndexArrayOutofBoundsException मिलती है: मुझे क्या निम्नलिखित है। मुझे इस अपवाद का कारण नहीं मिला। अगर कोई मुझे सही दिशा में इंगित कर सकता है तो मैं सराहना करूंगा।

उत्तर

8

आपको अपने इंस्टॉलेशन को अपने डेटा सेट, एक इंस्टेंस ऑब्जेक्ट में जोड़ने की आवश्यकता है। निम्नलिखित कोड काम करना चाहिए।

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); 

मैं बाहरी फ़ाइल से हेडर सूचना और उदाहरण मान रही या केवल एक बार इस जानकारी बनाने का सुझाव।

+0

महान उत्तर के लिए धन्यवाद। बस स्पष्ट करने के लिए, कक्षा ए और कक्षा बी वर्गीकरण के संभावित परिणाम हैं, यानी मेरे क्लस्टर नाम, है ना? मुझे लगता है कि जब मैं मॉडल बना रहा था तब उन्हें इस्तेमाल किए गए लोगों के साथ समान होना चाहिए। – Erol

+0

काम नहीं कर रहा है, मुझे weka.core मिल रहा है। असाइन किया गया डेटासेट अपवाद: DenseInstance के पास डेटासेट तक पहुंच नहीं है! त्रुटि। मान लीजिए मुझे इसे एक डेटासेट में असाइन करना होगा, शायद मैं इसे प्रशिक्षित करने के लिए इस्तेमाल करता हूं? – Erol

+0

@babatenor आपको इसे उसी शीर्षलेख के साथ डेटा सेट पर असाइन करने की आवश्यकता है। उनकी हेडर जानकारी एक ही होनी चाहिए –

3

असल में मैंने अपनी स्थिति में कोशिश की है उदाहरण .setDataSet() विधि, addInstance विधि नहीं है। इसलिए आप कोड inst_co.setDataSet (डेटा) होना चाहिए।