Cómo crear datos de entrenamiento para libsvm (como una estructura svm_node)

Estoy tratando de entrenar un svm para un problema xor simple mediante el uso de libsvm para comprender cómo funciona la biblioteca. El problema (creo) parece ser que construyo svm_node incorrectamente; tal vez tengo problemas para entender todo el tema de los punteros a los indicadores ¿Alguien podría ayudar con esto? Primero construyo una matriz para el problema xor y luego trato de asignar valores de la matriz a svm_node (estoy usando 2 pasos aquí porque mis datos reales estarán en formato de matriz).

Al probar el modelo obtengo valores incorrectos (siempre -1).

En una pregunta anterior recibí ayuda con los parámetros C y gamma; estos deberían estar bien ahora, ya que obtuve las clasificaciones correctas para el problema xor usando otracódigo. Gracias de nuevo Pedrom!

He buscado respuestas en varios lugares, por ejemplo, Readme y en el ejemplo SvmToy; sin embargo sin suerte.

Aquí está el código que produce clasificaciones incorrectas ...

¡Gracias por adelantado!

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

Respuestas a la pregunta(1)

Su respuesta a la pregunta