2016-08-29 4 views
-1

Может ли кто-нибудь показать мне, как использовать одноклассный SVM в Java? Моя проблема в том, что у меня есть один набор учебных материалов и один тестовый набор, и я хочу использовать одноклассный svm для прогнозирования значения класса. Я попробовал несколько примеров на github, но они не работали для меня.один класс svm в java

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

В результате я получаю java.lang.NullPointerException потому svmClassifier.classify(inst) и inst.classValue() всегда возвращают null. Так что я пытался что-то другое:

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 там. Я не могу объяснить, почему существует только 1.0

+0

В какой библиотеке вы используете? можете ли вы добавить указатель. – Kai

ответ

0

SVM классификатор функции

у = F (X)

, где у = {1, -1} у = 1,0 означает, что данные относятся к классу и -1.0 означает, что данные относятся к другому классу.

x является вектором 1 на n, где n = количество атрибутов каждого набора данных, где - класс данных. из вышеизложенного это может означать, что все данные классифицируются в том же классе, что и ожидаемый класс, который равен 1.0; Данные, принадлежащие другому классу, будут равны -1.0.

Итак, из вашего наблюдения это может означать, что наборы данных классифицированы в одном классе

+0

Спасибо за объяснение. Можете ли вы рассказать мне что-то о «NullpointerException» в коде выше? – Bob

+0

NullPointerException возникает, когда объекту запроса не назначено значение. Необходимо знать тип возврата этого метода или еще лучше, прочитать документацию метода invoke. Это поможет вам узнать, что они должны вернуть. В основном, это должно быть, что вам нужно снабдить classValue с помощью метода get в libSvm. Невыполнение значения перед запросом приведет к исключению NullPointerException. – Positive

Смежные вопросы