Формат обучающих данных LIBSVM (x значений в svm_node для svm_problem)

Я использую LIBSVM, чтобы программно выполнить простую классификацию XOR, пытаясь понять, как работают функции. Я установил проблему, следуя инструкциям в файле Readme, как можно ближе. Тем не менее, я получаю неправильный вывод при использовании svm_predict (всегда 1 или -1).

В связанном вопросе кто-то предположил, что проблема может возникнуть при использовании очень немногих обучающих примеров. Я попытался увеличить количество примеров до 20, но это не помогло.

Я подозреваю, что проблема где-то в определении prob.x и / или prob.y, но не могу понять, где. Не могли бы вы уточнить, как определить prob.x и prob.y с помощью svm_node?

Я тщательно искал, но не могу найти ответ … Например. Вот, Вот, Вот, Вот, и здесь.

Заранее спасибо!

Вот мой код:

//Parameters
svm_parameter param;
param.svm_type = C_SVC;
param.kernel_type = RBF;
param.degree = 3;
param.gamma = 0;
param.coef0 = 0;
param.nu = 0.5;
param.cache_size = 100;
param.C = 0.4;
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
prob.l = 4;                             //number of training examples//x values

svm_node** x = new svm_node *[prob.l];  //Array of pointers to pointers to arrays

svm_node* x_space1 = new svm_node[3];   //Fist training example
svm_node* x_space2 = new svm_node[3];   //Second training example
svm_node* x_space3 = new svm_node[3];   //Third training example
svm_node* x_space4 = new svm_node[3];   //Fourth training example

x_space1[0].index = 1;                  //Fist training example
x_space1[0].value = 1;
x_space1[1].index = 2;
x_space1[1].value = 1;
x_space1[2].index = -1;

x_space2[0].index = 1;                  //Second training example
x_space2[0].value = 1;
x_space2[1].index = 2;
x_space2[1].value = 0;
x_space2[2].index = -1;

x_space3[0].index = 1;                  //Third training example
x_space3[0].value = 0;
x_space3[1].index = 2;
x_space3[1].value = 1;
x_space3[2].index = -1;

x_space4[0].index = 1;                  //Fourth training example
x_space4[0].value = 0;
x_space4[1].index = 2;
x_space4[1].value = 0;
x_space4[2].index = -1;

x[0] = x_space1;                        //Set each training example to x
x[1] = x_space2;
x[2] = x_space3;
x[3] = x_space4;

prob.x = x;                             //Assign x to the struct field prob.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 = 1;
testnode[0].value = 1;
testnode[1].index = 2;
testnode[1].value = 0;
testnode[2].index = -1;

double retval = svm_predict(model,testnode);
qDebug()<<retval;                               //Should return +1 but returns -1

0

Решение

Кажется, проблема с вашими параметрами. Например, param.gamma не должен быть нулевым, если вы используете ядро ​​RBF.

1

Другие решения

  1. Почему ваша проблема XOR трехмерная? Вам не нужно третье измерение в каждой точке (на самом деле вы определяете его, но не используете его, я не уверен, что будет делать libSVM, но наверняка это повлияет на выбранную гамму, так как эвристика libSVM выбирает 1 / number_of_dimensions)
  2. Ваш C параметр выглядит подозрительным ( 0.4 может быть путь к низкому, попробуйте 1000)
1

По вопросам рекламы [email protected]