【问题标题】:one class svm in javajava中的一类svm
【发布时间】:2017-01-05 09:02:20
【问题描述】:

有人可以告诉我如何在 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

【问题讨论】:

  • 您使用的是哪个库?你能添加一个指针吗?

标签: java libsvm


【解决方案1】:

SVM分类器函数

y=f(x)

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

x 是 1 x n 的向量,其中 n= 每个数据集的属性数,其中是数据的类别。综上所述,可能意味着所有数据都被归为与预期类别相同的类别,即 1.0;属于另一个类的数据将是 -1.0。

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

【讨论】:

  • 感谢您的解释。你能告诉我上面代码中的NullpointerException吗?
  • NullPointerException 在查询对象没有赋值时发生。需要知道这些方法的返回类型,或者更好的是,阅读方法调用的文档。这将帮助您了解他们要返回的内容。大多数情况下,您必须通过 libSvm 中的 get 方法提供 classValue。在查询之前未能提供值将导致 NullPointerException。
猜你喜欢
  • 2018-02-08
  • 2013-01-13
  • 2015-04-25
  • 2013-11-22
  • 2012-02-15
  • 2012-06-27
  • 2016-08-12
  • 1970-01-01
相关资源
最近更新 更多