我想使用svmlib进行分类,但是,当我使用svm_train时,android返回并出错:“引起:java.lang.NullPointerException”。我不知道问题出在哪里我认为我正确地构造了svm_prolem“prob”和svm_param“param”,如下所示。任何帮助将不胜感激,并抱歉通过发布这个长代码打扰你。提前致谢
// Readin the image training set
ArrayList<Photo> photoList2 = new ArrayList<Photo>();
ArrayList<ArrayList<Photo>> BAse = new ArrayList<ArrayList<Photo>>();
int j=0;
for( j=0; j<EventAnnoation.length; j++){
photoList2 = new ArrayList<Photo>();
photoList2.addAll(myBaseLearning.getAllPhotoinCluster(EventAnnoation[j])); //get photos from a specific cluster
BAse.add(photoList2);
}
// Get the number of all images of training set
int size = 0;
for( j=0; j<BAse.size(); j++){
size+= BAse.get(j).size();}
// build a problem
svm_problem prob = new svm_problem();
prob.l =size;
prob.y = new double[prob.l];
prob.x = new svm_node[prob.l][144];
// Fill the problem
for(int i=0; i<BAse.size(); i++){
photoList2 = new ArrayList<Photo>();
photoList2.addAll(BAse.get(i));
for(int t=0; t<photoList2.size(); t++){
Photo p= photoList2.get(t);// get the image
prob.y[i] = i;// La classe
double[] data= getDataInDouble(p.getCEDD()); // convert data/feature from string to double
int count =0;
for ( j=0;j<data.length;j++)
{
prob.x[i][j] = new svm_node();
prob.x[i][j].index =count;
prob.x[i][j].value = data[j];
count++;
}// End data for each image
}// fin de la lecture de toutes les images de la liste
}// fin de la lecture de toutes les images de la base
//********************************************************
svm_parameter param = new svm_parameter();
// default values
param.svm_type = svm_parameter.C_SVC;
param.kernel_type = svm_parameter.RBF;
param.degree = 3;
param.gamma = 0.5; // 1/num_features
param.coef0 = 0;
param.nu = 0.5;
param.cache_size = 100;
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[5];
param.weight = new double[5];
param.weight[0] = 0;
param.weight[1] = 0;
param.weight[2] = 0;
param.weight[3] = 0;
param.weight[4] = 0;
ph+=svm.svm_check_parameter(prob, param);
svm.svm_train(prob, param);
text.setText(ph);
完整的消息错误是:
06-11 20:49:38.348: E/AndroidRuntime(5385): FATAL EXCEPTION: main
06-11 20:49:38.348: E/AndroidRuntime(5385): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.svmlibandr/com.example.svmlibandr.Svmliib}: java.lang.NullPointerException
06-11 20:49:38.348: E/AndroidRuntime(5385): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2071)
06-11 20:49:38.348: E/AndroidRuntime(5385): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2096)
06-11 20:49:38.348: E/AndroidRuntime(5385): at android.app.ActivityThread.access$600(ActivityThread.java:138)
06-11 20:49:38.348: E/AndroidRuntime(5385): at java.lang.reflect.Method.invoke(Method.java:511)
06-11 20:49:38.348: E/AndroidRuntime(5385): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789)
06-11 20:49:38.348: E/AndroidRuntime(5385): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:556)
06-11 20:49:38.348: E/AndroidRuntime(5385): at dalvik.system.NativeStart.main(Native Method)
06-11 20:49:38.348: E/AndroidRuntime(5385): Caused by: java.lang.NullPointerException
06-11 20:49:38.348: E/AndroidRuntime(5385): at libsvm.Kernel.dot(svm.java:212)
06-11 20:49:38.348: E/AndroidRuntime(5385): at libsvm.Kernel.<init>(svm.java:198)
06-11 20:49:38.348: E/AndroidRuntime(5385): at libsvm.SVC_Q.<init>(svm.java:1155)
06-11 20:49:38.348: E/AndroidRuntime(5385): at libsvm.svm.solve_c_svc(svm.java:1332)
06-11 20:49:38.348: E/AndroidRuntime(5385): at libsvm.svm.svm_train_one(svm.java:1509)
06-11 20:49:38.348: E/AndroidRuntime(5385): at libsvm.svm.svm_train(svm.java:2046)
06-11 20:49:38.348: E/AndroidRuntime(5385): at com.example.svmlibandr.Svmliib.onCreate(Svmliib.java:245)
06-11 20:49:38.348: E/AndroidRuntime(5385): at android.app.Activity.performCreate(Activity.java:5008)
06-11 20:49:38.348: E/AndroidRuntime(5385): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079)
06-11 20:49:38.348: E/AndroidRuntime(5385): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2035)
答案 0 :(得分:-1)
我发现错误是关于问题的维度。我让我的代码作为在android上为我这样的bignners使用svmlib的一个例子。我希望其他人有用。
解决方案是:
int count=0;
for(j=0; j<BAse.size(); j++){
photoList2 = new ArrayList<Photo>();
photoList2.addAll(BAse.get(j));
for(int t=0; t<photoList2.size(); t++){
Photo p= new Photo();
p= photoList2.get(t);
prob.y[count]= j;
double[] data= new double[144];
data= getDataInDouble(p.getCEDD());
for(int i=0; i<data.length;i++){
prob.x[count][i]= new svm_node();
prob.x[count][i].index=i;
prob.x[count][i].value=data[i];
}
count++;
}
}