AKA
AKA

Reputation: 6935

libsvm-java throws NullPointerException after a few iteration of training

I am using libsvm java package for a sentence classification task. I have 3 classes. Every sentence is represented as a vector of size 435. The format of vector_file is as follows:

1 0 0.12 0 0.5 0.24 0.32 0 0 0 ... 0.43 0 First digit indicates class label and remaining is the vector.

The following is how I am making the 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;
}

Parameter settings:

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];

While executing the program, After 2 iterations, I am getting a NullPointerException. I couldn't figure out what is going wrong.

This is the error coming:

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)

Any idea on what is going wrong?

Upvotes: 0

Views: 122

Answers (1)

rzo1
rzo1

Reputation: 5751

The NullPointerException is thrown in Line 207 in svm.class. Investigating the source code shows:

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

Line 207 is int xlen = x.length;. So in this case, we see, that one of your svm_node (or vectors) is null.

For this reason, we cannot really help you here, as we would need more information / source code to debug it.

I would go for the following strategy:

  1. Investigate the svm_node objects after you completed the building of the svm_problem in a debugger and look for null values.

  2. Check the build process of your svm_problem. The problem might be there.

An other possibility would be to change your data-format and be compliant to the official LIBSVM format:

As stated in the documentation, the data format uses sparse-data format and should be like that:

<label> 0:i 1:K(xi,x1) ... L:K(xi,xL) 

The ascending integer refers to the attribute or feature id, which is necessary for internal representation of the vector.

I previously replied to a similar question here and added an example for the data format.

This format can be read out of the box as the code to construct the svm_problem is included in the library.

Upvotes: 5

Related Questions