2016-08-29 5 views
-1

Java에서 하나의 클래스 SVM을 사용하는 방법을 보여줄 수 있습니까? 내 문제는, 나는 하나의 훈련 Dataset과 하나의 테스트 세트를 가지고 있고 class 값을 예측하기 위해 one-class svm을 사용하고 싶다. 나는 github에 몇 가지 예를 시도했지만 그들은 나를 위해 작동하지 않았다. 항상 null을 반환 java.lang.NullPointerExceptionsvmClassifier.classify(inst) 때문에 inst.classValue()Java에서 하나의 클래스 svm

public static void main(String[] args){  
    DefaultDataset trainingSet = new DefaultDataset(); 
    LibSVM svmClassifier = new LibSVM(); 
    svm_parameter svmParam = new svm_parameter(); 
    svmParam.svm_type = svm_parameter.ONE_CLASS; //set one_class 
    svmParam.kernel_type = svm_parameter.LINEAR; // set type of kernel function 
    svmClassifier.setParameters(svmParam); 
    OneClassSVMTest oneClassSVM = new OneClassSVMTest(); 
    NormalizeMidrange normalizMid = new NormalizeMidrange(); 

    //loadValues loads data from mysql-db 
    //Double[] contains x,y,z values for example [0.123, 1.232, 0.342] 
    ArrayList<Double[]> myTrainValues = oneClassSVM.loadValues(myString1); 
    ArrayList<Double[]> myTestValue = oneClassSVM.loadValues(myString2); 
    for(Double[] value : myTrainValues) 
    { 
     //toRawArray converts Double[] to double[] 
     trainingSet.add(new DenseInstance(toRawArray(value)); 
    } 
    normalizMid.build(trainingSet); 
    normalizMid.filter(trainingSet); 
    svmClassifier.buildClassifier(trainingSet); 

    int correct = 0, wrong = 0; 
    for (Double[] d : myTestValues) 
    { 
     Instance inst = new DenseInstance(toRawArray(d)); 
     normalizMid.filter(inst); 
     //is always null !?!? 
     Object predictedClassValue = svmClassifier.classify(inst); 
     //is always null !?!? 
     Object realClassValue = inst.classValue(); 
     if (predictedClassValue.equals(realClassValue)) //<- Error shows up 
      correct++; 
     else 
      wrong++; 
    } 
    System.out.printf("correct: %d, wrong: %d%n", correct, wrong); 
} 

은 결과적으로 내가 얻을.

Map<Object, Double> classDistributionMap; 
    for (Double[] a : myTestValue) 
    { 
     Instance inst = new DenseInstance(toRawArray(a)); 
     normalizMid.filter(inst); 
     classDistributionMap = svmClassifier.classDistribution(inst); 
     Set<Map.Entry<Object, Double>> entrySet = classDistributionMap.entrySet(); 
     for (Entry<Object, Double> entry : entrySet) 
      System.out.println(entry.getValue()); 

    } 

이 단지 1.0 결과로 : 그래서 나는 다른 무언가를 시도했다. 만 존재 이유를 설명 할 수

+0

어떤 라이브러리를 사용하고 있습니까? 포인터를 추가 할 수 있습니까? – Kai

답변

0

1.0 SVM 분류기 기능

Y = F (X) Y = {1, -1}, Y = 1.0 데이터 클래스에 속하는

-1.0은 데이터가 다른 클래스에 속한다는 것을 의미합니다.

x는 1 by n의 벡터이며, 여기서 n은 각 데이터 세트의 속성 수입니다. 여기서는 데이터의 클래스입니다. 위에서와 같이 모든 데이터가 예상 클래스와 동일한 클래스로 분류된다는 것을 의미 할 수 있습니다. 다른 클래스에 속하는 데이터는 -1.0이됩니다.

귀하의 관찰에서 데이터 세트가 모두 동일한 클래스로 분류된다는 것을 의미 할 수도 있습니다

+0

설명에 감사드립니다. 위 코드에서'NullpointerException'에 대해 뭔가를 말해 줄 수 있습니까? – Bob

+0

쿼리 개체에 할당 된 값이 없을 때 NullPointerException이 발생합니다. 이러한 메서드의 반환 형식을 알고 있어야하며 더 좋은 방법은 호출하는 메서드의 설명서를 읽는 것입니다. 이것은 당신이 그들이 무엇을 돌려야 하는지를 아는 데 도움이 될 것입니다. 주로 libSvm의 get 메소드를 통해 classValue를 제공해야합니다. 쿼리하기 전에 값을 제공하지 않으면 NullPointerException이 발생합니다. – Positive