有人能告诉我如何在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
答案 0 :(得分:0)
SVM分类器功能
y = f(x)
其中y = {1,-1} y = 1.0表示数据属于该类,-1.0表示数据属于另一个类。
x是1乘n的向量,其中n =每个数据集的属性数,其中是数据的类。从上面可能意味着所有数据都被分类到与预期类相同的类1.0;属于另一个类的数据将是-1.0。
因此,根据您的观察,这可能意味着数据集都被归类为同一类