Daniel
Daniel

Reputation: 6039

Using libSVM programmatically

I have started using libSVM (java: https://github.com/cjlin1/libsvm) programmatically. I wrote the following code to test it:

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

Since I am testing on the same training data, I'd expect to get 100% accuracy, but the output that I get, is the following:

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

We can see that the following prediction is erroneous: X[0] = 1.0 X[1] = 1.0 Y = 1 The predicton = -1.0

Anyone knows what is the mistake in my code?

Upvotes: 2

Views: 205

Answers (1)

user3439702
user3439702

Reputation: 375

You're using Radial Basis Function (param.kernel_type = svm_parameter.RBF) which uses gamma. Setting 'param.gamma = 1' should yield 100% accuracy.

Upvotes: 1

Related Questions