【问题标题】:Using libSVM programmatically以编程方式使用 libSVM
【发布时间】:2014-09-17 22:22:13
【问题描述】:

我已经开始以编程方式使用 libSVM (java:https://github.com/cjlin1/libsvm)。我写了以下代码来测试它:

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

    svm_problem prob = new svm_problem();
    prob.l = 4; 
    prob.y = new double[prob.l];
    prob.x = new svm_node[prob.l][2];
    for(int i = 0; i < prob.l; i++)
    {
        prob.x[i][0] = new svm_node();
        prob.x[i][1] = new svm_node();
        prob.x[i][0].index = 1;
        prob.x[i][1].index = 2;
        prob.x[i][0].value = (i%2!=0)?-1:1; 
        prob.x[i][1].value = (i/2%2==0)?-1:1; 
        prob.y[i] = (prob.x[i][0].value == 1 && prob.x[i][1].value == 1)?1:-1;
        System.out.println("X = [ " + prob.x[i][0].value + ", " + prob.x[i][1].value + " ] \t ->  " + prob.y[i] );
    }
    svm_model model = svm.svm_train(prob, param);

    int test_length = 4; 
    for( int i = 0; i < test_length; i++)
    {
        svm_node[] x_test = new svm_node[2];
        x_test[0] = new svm_node(); 
        x_test[1] = new svm_node(); 
        x_test[0].index = 1;
        x_test[0].value = (i%2!=0)?-1:1; 
        x_test[1].index = 2;
        x_test[1].value = (i/2%2==0)?-1:1; 
        double d = svm.svm_predict(model, x_test);
        System.out.println("X[0] = " + x_test[0].value + "  X[1] = " + x_test[1].value + "\t\t\t Y = "
                + ((x_test[0].value == 1 && x_test[1].value == 1)?1:-1) + "\t\t\t The predicton = " + d);
    }

由于我在相同的训练数据上进行测试,我希望获得 100% 的准确率,但我得到的输出如下:

X = [ 1.0, -1.0 ]    ->  -1.0
X = [ -1.0, -1.0 ]   ->  -1.0
X = [ 1.0, 1.0 ]     ->  1.0
X = [ -1.0, 1.0 ]    ->  -1.0
*
optimization finished, #iter = 1
nu = 0.5
obj = -20000.0, rho = 1.0
nSV = 2, nBSV = 2
Total nSV = 2
X[0] = 1.0  X[1] = -1.0          Y = -1          The predicton = -1.0
X[0] = -1.0  X[1] = -1.0             Y = -1          The predicton = -1.0
X[0] = 1.0  X[1] = 1.0           Y = 1           The predicton = -1.0
X[0] = -1.0  X[1] = 1.0          Y = -1          The predicton = -1.0

我们可以看到下面的预测是错误的: X[0] = 1.0 X[1] = 1.0 Y = 1 预测值 = -1.0

有人知道我的代码有什么错误吗?

【问题讨论】:

    标签: libsvm


    【解决方案1】:

    您正在使用使用 gamma 的径向基函数 (param.kernel_type = svm_parameter.RBF)。设置 'param.gamma = 1' 应该会产生 100% 的准确度。

    【讨论】:

      猜你喜欢
      • 2012-07-30
      • 2012-01-25
      • 2012-06-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多