2014-01-07 3 views
0

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

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

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

Я искал тщательно, но не могу найти ответ ... Например. Here,here,here,here, and here.

Заранее благодарен!

Вот мой код:

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

ответ

1

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

+0

Спасибо Pedrom! Это решило проблему. Я сделаю еще немного чтения на C и гамме. – JCR

+0

@JCR Нет проблем! :) Я бы рекомендовал также прочитать файл README, потому что по крайней мере значение гаммы отличается (обратное) к другим библиотекам. https://github.com/cjlin1/libsvm/blob/master/README – Pedrom

+0

ОК, спасибо за подсказку! – JCR

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

Привет, lejlot и спасибо, что ответили. Согласно Readme для libsvm, каждый пример обучения должен быть завершен с -1 (чтобы указать, что для этого примера больше нет атрибутов). Или вы имеете в виду размеры svm_node ** x? Я пытался увеличить C до 1000, но это не помогло ... – JCR

Смежные вопросы