java中的一个类svm

时间:2016-08-29 10:48:54

标签: java libsvm

有人能告诉我如何在Java中使用一类SVM吗?我的问题是,我有一个训练数据集和一个测试集,我想使用一级svm来预测类值。我在github上尝试了一些例子,但它们并没有为我工作。

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

1 个答案:

答案 0 :(得分:0)

SVM分类器功能

y = f(x)

其中y = {1,-1} y = 1.0表示数据属于该类,-1.0表示数据属于另一个类。

x是1乘n的向量,其中n =每个数据集的属性数,其中是数据的类。从上面可能意味着所有数据都被分类到与预期类相同的类1.0;属于另一个类的数据将是-1.0。

因此,根据您的观察,这可能意味着数据集都被归类为同一类