2017-01-30 3 views
0

文分類タスクのためにlibsvm javaパッケージを使用しています。私は3つのクラスを持っています。すべての文章は、サイズ435のベクトルとして表されます。のベクトル_ファイルの形式は、次のとおりです。libsvm-javaは、いくつかのトレーニングを繰り返して、NullPointerExceptionをスローします。

1 0 0.12 0 0.5 0.24 0.32 0 0 0 ... 0.43 0最初の桁はクラスラベルを示し、残りはベクトルです。

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

パラメータ設定:

次は私がsvm_problem作っていますどのようなプログラムを実行中に

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) 

任意のアイデアを間違って何が起こっているかに?

+0

ブレークポイントを設定し、このコンテキストで正確にnullが何であるかを調べようとしましたか? – rzo

+0

@rzo ** svm_train **関数が例外をスローしています。 – BBHeeMAA

答えて

5

は、行207にsvm.classでスローされます。ソースコードを調べると、

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を構成するコードがライブラリに含まれているため、ボックスから読み取ることができます。

+0

考えてくれてありがとう!私は問題を理解した。 ** svm_problem.l **に不一致があり、** svm_problem **に無効なエントリが発生しました。 – BBHeeMAA

関連する問題