gpt4 book ai didi

machine-learning - libsvm-java 经过几次训练迭代后抛出 NullPointerException

转载 作者:行者123 更新时间:2023-11-30 09:26:09 25 4
gpt4 key购买 nike

我正在使用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;
}

参数设置:

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 格式:

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

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

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

我之前回答过类似的问题here并添加了数据格式的示例。

这种格式可以直接读取,因为构建 svm_problem 的代码包含在库中。

关于machine-learning - libsvm-java 经过几次训练迭代后抛出 NullPointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41930429/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com