经过几次训练后,libsvm-java抛出NullPointerException

Ans*_*imu 0 machine-learning svm libsvm

我使用libsvm java包进行句子分类任务.我有3节课.每个句子都表示为大小为435的向量.vector_file的格式如下:

1 0 0.12 0 0.5 0.24 0.32 0 0 0 ... 0.43 0 第一个数字表示类标签,剩余部分是矢量.

以下是我如何制作svm_problem:

public void makeSvmProb(ArrayList<Float> inputVector,float label,int p){
        // p is 0 to 77 (total training sentences)

        int idx=0,count=0;

        svm_prob.y[p]=label;
        for(int i=0;i<inputVector.size();i++){
            if(inputVector.get(i)!=0) {
                count++; // To get the count of non-zero values
            }

        }
        svm_node[] x = new svm_node[count];
        for(int i=0;i<inputVector.size();i++){

          if(inputVector.get(i)!=0){


              x[idx] = new svm_node();
              x[idx].index = i;
              x[idx].value = inputVector.get(i);

                idx++;
           }

        }
        svm_prob.x[p]=x;
}
Run Code Online (Sandbox Code Playgroud)

参数设置:

param.svm_type = svm_parameter.C_SVC;
param.kernel_type = svm_parameter.RBF;
param.degree = 3;
param.gamma = 0.5;
param.coef0 = 0;
param.nu = 0.5;
param.cache_size = 40;
param.C = 1;
param.eps = 1e-3;
param.p = 0.1;
param.shrinking = 1;
param.probability = 0;
param.nr_weight = 0;
param.weight_label = new int[0];
param.weight = new double[0];
Run Code Online (Sandbox Code Playgroud)

在执行程序时,经过2次迭代后,我得到一个NullPointerException.我无法弄清楚出了什么问题.

这是错误:

optimization finished, #iter = 85
nu = 0.07502654779820772
obj = -15.305162227093849, rho = -0.03157808477381625
nSV = 47, nBSV = 1
*
optimization finished, #iter = 88
nu = 0.08576821199868506
obj = -17.83925196551639, rho = 0.1297986754900152
nSV = 51, nBSV = 3
Exception in thread "main" java.lang.NullPointerException
    at libsvm.Kernel.dot(svm.java:207)
    at libsvm.Kernel.<init>(svm.java:199)
    at libsvm.SVC_Q.<init>(svm.java:1156)
    at libsvm.svm.solve_c_svc(svm.java:1333)
    at libsvm.svm.svm_train_one(svm.java:1510)
    at libsvm.svm.svm_train(svm.java:2067)
    at SvmOp.<init>(SvmOp.java:130)
    at Main.main(Main.java:8)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)
Run Code Online (Sandbox Code Playgroud)

什么出错了?

rzo*_*rzo 5

NullPointerException被抛出207线svm.class.调查源代码显示:

static double dot(svm_node[] x, svm_node[] y)
    {
        double sum = 0;
        int xlen = x.length;
        ...
    }
Run Code Online (Sandbox Code Playgroud)

207行是int xlen = x.length;.所以在这种情况下,我们看到,你的一个svm_node(或向量)是null.

出于这个原因,我们在这里无法真正帮助您,因为我们需要更多的信息/源代码来调试它.

我会采取以下策略:

  1. svm_node完成svm_problem在调试器中构建并查找null值后,调查对象.

  2. 检查你的构建过程svm_problem.可能存在问题.

另一种可能性是更改您的数据格式并符合官方LIBSVM格式:

文档中所述,数据格式使用稀疏数据格式,应该是这样的:

<label> 0:i 1:K(xi,x1) ... L:K(xi,xL) 
Run Code Online (Sandbox Code Playgroud)

升序整数是指属性或特征id,它是向量内部表示所必需的.

我先前在这里回答了类似的问题并添加了数据格式的示例.

这种格式可以开箱即用,因为构建它的代码svm_problem包含在库中.