2016-08-29 6 views
-1

Javaでone-class SVMを使用する方法を教えてもらえますか?私の問題は、私は1つの訓練データセットと1つのテストセットがあり、私はクラス値を予測するために1クラスのSVMを使いたいと思います。私はgithubのいくつかの例を試しましたが、彼らは私のために働いていませんでした。その結果、Javaの1クラス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); 
} 

svmClassifier.classify(inst)inst.classValue()は常にnullを返すので、私はjava.lang.NullPointerExceptionを取得します。

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のベクトルで、nは各データセットの属性の数です。ここで、はデータのクラスです。上記から、それは、すべてのデータが期待されるクラスと同じクラスに分類されることを意味するかもしれない。別のクラスに属するデータは-1.0になります。

あなたの観察によれば、データセットはすべて同じクラスに分類されている可能性があります

+0

ありがとうございます。上のコードで 'NullpointerException'について何か教えていただけますか? – Bob

+0

クエリオブジェクトに割り当てられた値がない場合、NullPointerExceptionが発生します。これらのメソッドの戻り値の型を知る必要がありますが、それでもメソッド呼び出しのドキュメントを読んでください。これは、彼らが何を返すのかを知るのに役立ちます。ほとんどの場合、libSvmのgetメソッドを使用してclassValueを供給する必要があります。クエリを実行する前に値を指定しなければ、NullPointerExceptionが発生します。 – Positive

関連する問題