如何为LIBSVM创建培训数据(作为SVM_NODE结构)



我正在尝试使用libsvm以编程方式训练一个简单的XOR问题,以了解库的工作方式。问题(我认为)似乎是我错误地构造了svm_node。也许我很难理解整个指针以指示事情。有人可以帮忙吗?我首先为XOR问题构造矩阵,然后尝试将矩阵中的值分配给svm_node(我在这里使用2个步骤,因为我的真实数据将以矩阵格式为单位)。

测试模型时,我会得到不正确的值(总是-1)。

在上一个问题中,我得到了参数C和伽玛的帮助;现在应该可以的,因为我使用其他代码对XOR问题进行了正确的分类。再次感谢PEDROM!

我在几个地方搜索了答案,例如在SVMTOY示例中,读书人;但是没有运气。

这是输出不正确分类的代码...

预先感谢!

//Parameters---------------------------------------------------------------------
svm_parameter param;
param.svm_type = C_SVC;
param.kernel_type = RBF;
param.degree = 3;
param.gamma = 0.5;
param.coef0 = 0;
param.nu = 0.5;
param.cache_size = 100;
param.C = 1;
param.eps = 1e-3;
param.p = 0.1;
param.shrinking = 1;
param.probability = 0;
param.nr_weight = 0;
param.weight_label = NULL;
param.weight = NULL;

//Problem definition-------------------------------------------------------------
svm_problem prob;
//Length, 4 examples
prob.l = 4;
//x values matrix of xor values
QVector< QVector<double> >matrix;
QVector<double>row(2);
row[0] = 1;row[1] = 1;
matrix.push_back(row);
row[0] = 1;row[1] = 0;
matrix.push_back(row);
row[0] = 0;row[1] = 1;
matrix.push_back(row);
row[0] = 0;row[1] = 0;
matrix.push_back(row);
//This part i have trouble understanding
svm_node* x_space = new svm_node[3];
svm_node** x = new svm_node *[prob.l];
//Trying to assign from matrix to svm_node training examples
for (int row = 0;row < matrix.size(); row++){
    for (int col = 0;col < 2;col++){
        x_space[col].index = col;
        x_space[col].value = matrix[row][col];
    }
    x_space[2].index = -1;      //Each row of properties should be terminated with a -1 according to the readme
    x[row] = x_space;
}
prob.x = x;
//yvalues
prob.y = new double[prob.l];
prob.y[0] = -1;
prob.y[1] = 1;
prob.y[2] = 1;
prob.y[3] = -1;
//Train model---------------------------------------------------------------------
svm_model *model = svm_train(&prob,&param);

//Test model----------------------------------------------------------------------
svm_node* testnode = new svm_node[3];
testnode[0].index = 0;
testnode[0].value = 1;
testnode[1].index = 1;
testnode[1].value = 0;
testnode[2].index = -1;
//Should return 1 but returns -1
double retval = svm_predict(model,testnode);
qDebug()<<retval;

看来,您似乎一直在尝试将此示例工作数周。我遵循libsvm随附的SVM-Train.c的样式。我将您的值用于C和伽玛。这是工作。我在XOR示例中尝试了所有要点,它给出了正确的结果。

您遇到的问题的摘要是,您并不是为使用的4个数据点分配空间,因此您只需额定数据即可。这是C中指针的典型错误。它可能会帮助您刷掉C/C 的指针。

这是代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <errno.h>
#include "svm.h"
#define Malloc(type,n) (type *)malloc((n)*sizeof(type))
struct svm_parameter param;     // set by parse_command_line
struct svm_problem prob;        // set by read_problem
struct svm_model *model;
struct svm_node *x_space;
int main(int argc, char **argv)
{
    char input_file_name[1024];
    char model_file_name[1024];
    const char *error_msg;
    param.svm_type = C_SVC;
    param.kernel_type = RBF;
    param.degree = 3;
    param.gamma = 0.5;
    param.coef0 = 0;
    param.nu = 0.5;
    param.cache_size = 100;
    param.C = 1;
    param.eps = 1e-3;
    param.p = 0.1;
    param.shrinking = 1;
    param.probability = 0;
    param.nr_weight = 0;
    param.weight_label = NULL;
    param.weight = NULL;

    //Problem definition-------------------------------------------------------------
    prob.l = 4;
    //x values matrix of xor values
    double matrix[prob.l][2];
    matrix[0][0] = 1;
    matrix[0][1] = 1;
    matrix[1][0] = 1;
    matrix[1][1] = 0;
    matrix[2][0] = 0;
    matrix[2][1] = 1;
    matrix[3][0] = 0;
    matrix[3][1] = 0;

    //This part i have trouble understanding
    svm_node** x = Malloc(svm_node*,prob.l);
    //Trying to assign from matrix to svm_node training examples
    for (int row = 0;row <prob.l; row++){
        svm_node* x_space = Malloc(svm_node,3);
        for (int col = 0;col < 2;col++){
            x_space[col].index = col;
            x_space[col].value = matrix[row][col];
        }
        x_space[2].index = -1;      //Each row of properties should be terminated with a -1 according to the readme
        x[row] = x_space;
    }
    prob.x = x;
    //yvalues
    prob.y = Malloc(double,prob.l);
    prob.y[0] = -1;
    prob.y[1] = 1;
    prob.y[2] = 1;
    prob.y[3] = -1;
    //Train model---------------------------------------------------------------------
    svm_model *model = svm_train(&prob,&param);

    //Test model----------------------------------------------------------------------
    svm_node* testnode = Malloc(svm_node,3);
    testnode[0].index = 0;
    testnode[0].value = 1;
    testnode[1].index = 1;
    testnode[1].value = 0;
    testnode[2].index = -1;
    //This works correctly:
    double retval = svm_predict(model,testnode);
    printf("retval: %fn",retval);

    svm_destroy_param(&param);
    free(prob.y);
    free(prob.x);
    free(x_space);
    return 0;
}

最新更新