2016-08-29 2 views
-1

Quelqu'un pourrait-il me montrer comment utiliser SVM one-class en Java? Mon problème est, j'ai un jeu de données d'entraînement et un ensemble de test et je veux utiliser svm one-class pour prédire la valeur de la classe. J'ai essayé quelques exemples sur github, mais ils n'ont pas fonctionné pour moi.une classe svm en 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); 
} 

En conséquence je reçois java.lang.NullPointerException parce svmClassifier.classify(inst) et inst.classValue() toujours revenir null. J'ai donc essayé quelque chose d'autre:

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

    } 

Comme il n'y a que les résultats 1.0. Je ne peux pas expliquer pourquoi il n'y a que 1.0

+0

Quelle bibliothèque utilisez-vous? Pouvez-vous s'il vous plaît ajouter un pointeur. – Kai

Répondre

0

La fonction SVM

y = f (x)

où y = {1, -1} y = 1.0 signifie les données appartiennent à la classe et -1,0 signifie que les données appartiennent à une autre classe.

x est le vecteur de 1 par n où n = nombre d'attributs de chaque ensemble de données où est la classe des données. à partir de ce qui précède, cela peut signifier que toutes les données sont classées dans la même classe que la classe attendue qui est 1,0; Les données appartenant à une autre classe seront -1.0. Donc, d'après votre observation, cela peut signifier que les ensembles de données sont tous classés dans la même classe

+0

Merci pour l'explication. Pouvez-vous me dire quelque chose à propos du 'NullpointerException' dans le code ci-dessus? – Bob

+0

NullPointerException se produit lorsqu'aucune valeur n'est affectée à l'objet de requête. Il est nécessaire de connaître le type de retour de ces méthodes ou mieux, lisez la documentation de la méthode invoke. Cela vous aidera à savoir ce qu'ils doivent retourner. Généralement, il faut que vous ayez besoin de fournir la classe classValue via une méthode get dans le fichier libSvm. L'échec de fournir la valeur avant l'interrogation conduira à NullPointerException. – Positive