libsvm的java实现

libsvm的java实现,java,svm,libsvm,Java,Svm,Libsvm,我正在尝试使用libsvm的java绑定: 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))

我正在尝试使用libsvm的java绑定:

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;
    }           
}
有人能解释为什么这个分类器不工作吗? 是否有一个步骤我搞砸了,或一个步骤我错过了


感谢

我对LibSVM的java实现做了一个稍微重构的版本,您可能会发现它更易于使用: .
查看Demo.java类以了解如何使用它

在我看来,你的评估方法是错误的。应该是这样的:

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;
}
公共双重评估(双重[]特征,svm_模型)
{
svm_节点[]节点=新的svm_节点[features.length-1];
对于(int i=1;i
以下是我使用以下R代码中的数据测试的上述示例的重做:


你能解释一下问题代码中的错误吗?我在发现错误时遇到问题!:(非常感谢您提供的有用代码。为什么要使用param.probability=1;?其次,您知道如果一个人的类不平衡,如何设置权重吗?我指的是C参数的权重。调用svm.svm\u predict\u probability()时,prob\u估计值是否会失去范围?这只是一篇帮助开始使用LIBSVM的帖子;从这里开始,用户就可以根据问题确定什么是有效的。有关这方面的问题,我建议您访问此软件包的维护者网站:
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.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)
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;
}
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)