2012-05-29 11 views
13

मैं libsvm के लिए जावा बाइंडिंग का उपयोग करने के लिए कोशिश कर रहा हूँ:libsvm जावा कार्यान्वयन

http://www.csie.ntu.edu.tw/~cjlin/libsvm/ 

मैं एक 'तुच्छ' उदाहरण है जो आसानी से रैखिक y में वियोज्य है लागू किया है। डेटा को इस प्रकार परिभाषित किया गया है:

double[][] train = new double[1000][]; 
double[][] test = new double[10][]; 

for (int i = 0; i < train.length; i++){ 
    if (i+1 > (train.length/2)){  // 50% positive 
     double[] vals = {1,0,i+i}; 
     train[i] = vals; 
    } else { 
     double[] vals = {0,0,i-i-i-2}; // 50% negative 
     train[i] = vals; 
    }   
} 

जहां पहली 'सुविधा' कक्षा है और प्रशिक्षण सेट समान रूप से परिभाषित किया गया है।

मॉडल को प्रशिक्षित करने के लिए:

private svm_model svmTrain() { 
    svm_problem prob = new svm_problem(); 
    int dataCount = train.length; 
    prob.y = new double[dataCount]; 
    prob.l = dataCount; 
    prob.x = new svm_node[dataCount][];  

    for (int i = 0; i < dataCount; i++){    
     double[] features = train[i]; 
     prob.x[i] = new svm_node[features.length-1]; 
     for (int j = 1; j < features.length; j++){ 
      svm_node node = new svm_node(); 
      node.index = j; 
      node.value = features[j]; 
      prob.x[i][j-1] = node; 
     }   
     prob.y[i] = features[0]; 
    }    

    svm_parameter param = new svm_parameter(); 
    param.probability = 1; 
    param.gamma = 0.5; 
    param.nu = 0.5; 
    param.C = 1; 
    param.svm_type = svm_parameter.C_SVC; 
    param.kernel_type = svm_parameter.LINEAR;  
    param.cache_size = 20000; 
    param.eps = 0.001;  

    svm_model model = svm.svm_train(prob, param); 

    return model; 
} 

फिर मॉडल मैं उपयोग का मूल्यांकन करने के:

public int evaluate(double[] features) { 
    svm_node node = new svm_node(); 
    for (int i = 1; i < features.length; i++){ 
     node.index = i; 
     node.value = features[i]; 
    } 
    svm_node[] nodes = new svm_node[1]; 
    nodes[0] = node; 

    int totalClasses = 2;  
    int[] labels = new int[totalClasses]; 
    svm.svm_get_labels(_model,labels); 

    double[] prob_estimates = new double[totalClasses]; 
    double v = svm.svm_predict_probability(_model, nodes, prob_estimates); 

    for (int i = 0; i < totalClasses; i++){ 
     System.out.print("(" + labels[i] + ":" + prob_estimates[i] + ")"); 
    } 
    System.out.println("(Actual:" + features[0] + " Prediction:" + v + ")");    

    return (int)v; 
} 

कहाँ से पारित कर दिया सरणी परीक्षण सेट से एक बिंदु है।

परिणाम हमेशा साथ सटीक परिणाम जा रहा है वर्ग 0. लौट रहे हैं:

(0:0.9882998314585194)(1:0.011700168541480586)(Actual:0.0 Prediction:0.0) 
(0:0.9883952943701599)(1:0.011604705629839989)(Actual:0.0 Prediction:0.0) 
(0:0.9884899803606306)(1:0.011510019639369528)(Actual:0.0 Prediction:0.0) 
(0:0.9885838957058696)(1:0.011416104294130458)(Actual:0.0 Prediction:0.0) 
(0:0.9886770466322342)(1:0.011322953367765776)(Actual:0.0 Prediction:0.0) 
(0:0.9870913229268679)(1:0.012908677073132284)(Actual:1.0 Prediction:0.0) 
(0:0.9868781382588805)(1:0.013121861741119505)(Actual:1.0 Prediction:0.0) 
(0:0.986661444476744)(1:0.013338555523255982)(Actual:1.0 Prediction:0.0) 
(0:0.9864411843906802)(1:0.013558815609319848)(Actual:1.0 Prediction:0.0) 
(0:0.9862172999068877)(1:0.013782700093112332)(Actual:1.0 Prediction:0.0) 

कोई व्याख्या कर सकते हैं क्यों इस वर्गीकारक काम नहीं कर रहा? क्या कोई कदम है जो मैंने गड़बड़ कर लिया है, या एक कदम जो मुझे याद आ रहा है? https://github.com/syeedibnfaiz/libsvm-java-kernel:

धन्यवाद

उत्तर

13

ऐसा लगता है कि आपकी मूल्यांकन विधि गलत है।

public double evaluate(double[] features, svm_model model) 
{ 
    svm_node[] nodes = new svm_node[features.length-1]; 
    for (int i = 1; i < features.length; i++) 
    { 
     svm_node node = new svm_node(); 
     node.index = i; 
     node.value = features[i]; 

     nodes[i-1] = node; 
    } 

    int totalClasses = 2;  
    int[] labels = new int[totalClasses]; 
    svm.svm_get_labels(model,labels); 

    double[] prob_estimates = new double[totalClasses]; 
    double v = svm.svm_predict_probability(model, nodes, prob_estimates); 

    for (int i = 0; i < totalClasses; i++){ 
     System.out.print("(" + labels[i] + ":" + prob_estimates[i] + ")"); 
    } 
    System.out.println("(Actual:" + features[0] + " Prediction:" + v + ")");    

    return v; 
} 
+4

क्या आप समझा सकते हैं कि प्रश्न कोड में क्या गलती है? मुझे बग को खोजने में समस्या है! :( – Daniel

1

मैं जो आप आसान उपयोग करने के लिए मिल सकता है LibSVM के जावा कार्यान्वयन के एक से थोड़ा पुनर्संशोधित संस्करण बनाया। डेमो.जावा कक्षा को देखने के लिए इसे देखने के लिए देखें।

2

यहाँ ऊपर के उदाहरण है कि मैं निम्नलिखित आर कोड से डेटा का उपयोग कर परीक्षण किया है की एक rework है: कुछ इस तरह होना चाहिए

: http://cbio.ensmp.fr/~jvert/svn/tutorials/practical/svmbasic/svmbasic_notes.pdf

import libsvm.*; 

public class libsvmTest { 

    public static void main(String [] args) { 

     double[][] xtrain = ... 
     double[][] xtest = ... 
     double[][] ytrain = ... 
     double[][] ytest = ... 

     svm_model m = svmTrain(xtrain,ytrain); 

     double[] ypred = svmPredict(xtest, m); 

     for (int i = 0; i < xtest.length; i++){ 
      System.out.println("(Actual:" + ytest[i][0] + " Prediction:" + ypred[i] + ")"); 
     } 

    } 

    static svm_model svmTrain(double[][] xtrain, double[][] ytrain) { 
     svm_problem prob = new svm_problem(); 
     int recordCount = xtrain.length; 
     int featureCount = xtrain[0].length; 
     prob.y = new double[recordCount]; 
     prob.l = recordCount; 
     prob.x = new svm_node[recordCount][featureCount];  

     for (int i = 0; i < recordCount; i++){    
      double[] features = xtrain[i]; 
      prob.x[i] = new svm_node[features.length]; 
      for (int j = 0; j < features.length; j++){ 
       svm_node node = new svm_node(); 
       node.index = j; 
       node.value = features[j]; 
       prob.x[i][j] = node; 
      }   
      prob.y[i] = ytrain[i][0]; 
     }    

     svm_parameter param = new svm_parameter(); 
     param.probability = 1; 
     param.gamma = 0.5; 
     param.nu = 0.5; 
     param.C = 100; 
     param.svm_type = svm_parameter.C_SVC; 
     param.kernel_type = svm_parameter.LINEAR;  
     param.cache_size = 20000; 
     param.eps = 0.001;  

     svm_model model = svm.svm_train(prob, param); 

     return model; 
    } 

    static double[] svmPredict(double[][] xtest, svm_model model) 
    { 

     double[] yPred = new double[xtest.length]; 

     for(int k = 0; k < xtest.length; k++){ 

     double[] fVector = xtest[k]; 

     svm_node[] nodes = new svm_node[fVector.length]; 
     for (int i = 0; i < fVector.length; i++) 
     { 
      svm_node node = new svm_node(); 
      node.index = i; 
      node.value = fVector[i]; 
      nodes[i] = node; 
     } 

     int totalClasses = 2;  
     int[] labels = new int[totalClasses]; 
     svm.svm_get_labels(model,labels); 

     double[] prob_estimates = new double[totalClasses]; 
     yPred[k] = svm.svm_predict_probability(model, nodes, prob_estimates); 

     } 

     return yPred; 
    } 


} 

यहाँ उत्पादन होता है

(Actual:1.0 Prediction:1.0) 
(Actual:1.0 Prediction:1.0) 
(Actual:1.0 Prediction:1.0) 
(Actual:1.0 Prediction:1.0) 
(Actual:1.0 Prediction:1.0) 
(Actual:1.0 Prediction:1.0) 
(Actual:1.0 Prediction:1.0) 
(Actual:1.0 Prediction:1.0) 
(Actual:1.0 Prediction:1.0) 
(Actual:1.0 Prediction:1.0) 
(Actual:1.0 Prediction:1.0) 
(Actual:1.0 Prediction:1.0) 
(Actual:1.0 Prediction:1.0) 
(Actual:1.0 Prediction:1.0) 
(Actual:1.0 Prediction:1.0) 
(Actual:-1.0 Prediction:-1.0) 
(Actual:-1.0 Prediction:-1.0) 
(Actual:-1.0 Prediction:-1.0) 
(Actual:-1.0 Prediction:-1.0) 
(Actual:-1.0 Prediction:-1.0) 
(Actual:-1.0 Prediction:-1.0) 
(Actual:-1.0 Prediction:-1.0) 
(Actual:-1.0 Prediction:-1.0) 
(Actual:-1.0 Prediction:1.0) 
(Actual:-1.0 Prediction:-1.0) 
(Actual:-1.0 Prediction:-1.0) 
(Actual:-1.0 Prediction:-1.0) 
(Actual:-1.0 Prediction:-1.0) 
(Actual:-1.0 Prediction:-1.0) 
(Actual:-1.0 Prediction:-1.0) 
+0

सहायक कोड के लिए बहुत बहुत धन्यवाद। आपने param.probability = 1 ;? और दूसरा क्यों उपयोग किया, क्या आप जानते हैं कि अगर कोई असंतुलित कक्षाएं हो तो वजन कैसे निर्धारित कर सकता है? मेरा मतलब है कि वजन वाला सी पैरामीटर भारित किया गया है। – machinery

+0

जब आप svm.svm_predict_probability()? – user1040535

+0

पर कॉल करते हैं तो prob_estimates खोने की संभावना नहीं है यह LIBSVM के साथ प्रारंभ करने में सहायता के लिए बस एक पोस्ट है; वहां से, उपयोगकर्ता को यह निर्धारित करने के लिए कि समस्या के अनुसार क्या काम करता है। इसके बारे में प्रश्नों के लिए, मेरा सुझाव है कि आप इस पैकेज के रखरखाव की साइट पर जाएं: https://www.csie.ntu.edu.tw/~cjlin/libsvm/faq.html#/Q06:_Probability_outputs –

संबंधित मुद्दे