以编程方式使用libSVM

时间:2014-07-26 00:21:28

标签: libsvm

我已经开始以编程方式使用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 predicton = -1.0

任何人都知道我的代码中有什么错误?

1 个答案:

答案 0 :(得分:1)

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