2016-06-22 2 views
0

메신저 프로그래밍에 꽤 새로운 메신저. 간단한 베이 분류자를 코딩했습니다. 여기에 코드입니다 :Weka 분류기가 작동하지 않습니다

public static void main(String[] args) throws Exception { 
    Attribute Attribute1 = new Attribute("firstNumeric"); 
    Attribute Attribute2 = new Attribute("secondNumeric"); 

    // Declare a nominal attribute along with its values 
    ArrayList<String> fvNominalVal = new ArrayList(3); 
    fvNominalVal.add("blue"); 
    fvNominalVal.add("gray"); 
    fvNominalVal.add("black"); 
    Attribute Attribute3 = new Attribute("aNominal", fvNominalVal); 

    // Declare the class attribute along with its values 
    ArrayList<String> fvClassVal = new ArrayList(2); 
    fvClassVal.add("positive"); 
    fvClassVal.add("negative"); 
    Attribute ClassAttribute = new Attribute("theClass", fvClassVal); 

    // Declare the feature vector 
    ArrayList<Attribute> fvWekaAttributes = new ArrayList(4); 
    fvWekaAttributes.add(Attribute1); 
    fvWekaAttributes.add(Attribute2); 
    fvWekaAttributes.add(Attribute3); 
    fvWekaAttributes.add(ClassAttribute); 

    // Create an empty training set 
    Instances isTrainingSet = new Instances("Rel", fvWekaAttributes, 10); 
    // Set class index 
    isTrainingSet.setClassIndex(3); 

    // Create the instance 
    Instance ex1 = new DenseInstance(4); 
    ex1.setValue((Attribute) fvWekaAttributes.get(0), 1.0); 
    ex1.setValue((Attribute) fvWekaAttributes.get(1), 5.5); 
    ex1.setValue((Attribute) fvWekaAttributes.get(2), "gray"); 
    ex1.setValue((Attribute) fvWekaAttributes.get(3), "positive"); 

    Instance ex2 = new DenseInstance(4); 
    ex1.setValue((Attribute) fvWekaAttributes.get(0), 1.0); 
    ex1.setValue((Attribute) fvWekaAttributes.get(1), 5.5); 
    ex1.setValue((Attribute) fvWekaAttributes.get(2), "blue"); 
    ex1.setValue((Attribute) fvWekaAttributes.get(3), "negative"); 

    // add the instance 
    isTrainingSet.add(ex1); 
    isTrainingSet.add(ex2); 

    // Create a naïve bayes classifier 
    Classifier cModel = (Classifier) new NaiveBayes(); 
    cModel.buildClassifier(isTrainingSet); 

    Instance testData = new DenseInstance(4); 
    testData.setValue((Attribute) fvWekaAttributes.get(0), 1.0); 
    testData.setValue((Attribute) fvWekaAttributes.get(1), 5.5); 
    testData.setValue((Attribute) fvWekaAttributes.get(2), "gray"); 

    Instances testDataSet = new Instances("Rel", fvWekaAttributes, 1); 
    testDataSet.setClassIndex(3); 
    testDataSet.add(testData); 

    double[] a = cModel.distributionForInstance(testDataSet.firstInstance()); 
    for(int i=0;i<a.length;i++){ 
     System.out.println(a[i]); 
    } 
} 

하지만 결과 나던 사실로 보인다. 여기 결과 :

testData.setValue((Attribute) fvWekaAttributes.get(0), 1.0); 
testData.setValue((Attribute) fvWekaAttributes.get(1), 5.5); 
testData.setValue((Attribute) fvWekaAttributes.get(2), "blue"); 

결과는 거의이있다 :이로 testdata로 변경하더라도 1.0

6.702810252023562E-151

. 아래 :

3.351405126011781E-151에서 고급

1.0

감사합니다.

답변

1

내 의견으로는 문제는 훈련에 2 개의 instaneces 만 있고 naiv baies 분류기는 그로부터 가치있는 모델을 배울 수 없다는 것입니다. Thats 왜 당신은 confision 결과를 얻었다. 기차 인스턴스를 100 개 이상 생성하려고 시도하거나 여기에서 ML 방법을 적용하는 방법을 배우기 위해 샘플 데이터 세트를 찾을 수 있습니다.

관련 문제