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



我正在使用libsvmjava包执行句子分类任务。我有三节课。每个句子都被表示为大小为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;
}

参数设置:

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

在执行程序时,经过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)

知道出了什么问题吗?

NullPointerExceptionsvm.class的第207行中抛出。调查源代码显示:

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

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

由于这个原因,我们不能在这里真正帮助你,因为我们需要更多的信息/源代码来调试它

我会选择以下策略:

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

  2. 检查svm_problem的构建过程。问题可能就在那里。

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

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

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

升序是指属性或特征id,这对于向量的内部表示是必要的。

我之前在这里回答了一个类似的问题,并添加了一个数据格式的示例。

当构建svm_problem的代码包含在库中时,可以开箱即用地读取这种格式。

最新更新