LibSvm добавя функции с помощта на JAVA API

Имам текст и искам да обучавам чрез добавяне на функция с помощта на java API. Разглеждайки примерите, основният клас за изграждане на набора за обучение е svm_problem. Изглежда, че svm_node представлява функция (индекс е функция и стойност е теглото на характеристиката).

Това, което направих, е да имам карта (само за да опростя проблема), която поддържа връзка между функцията и индекса. За всеки от моите тегло> примери създавам нов възел:

  svm_node currentNode = new svm_node();
  int index = feature.getIndexInMap();
  double value = feature.getWeight();
  currentNode.index = index;
  currentNode.value = value;

Вярна ли е интуицията ми? За какво се отнася svm_problem.y? Отнася ли се за индекса на етикета? svm_problem.l само дължината на двата вектора ли е?


person pokeRex110    schedule 18.03.2014    source източник
comment
Препоръчвам да смените заглавието. По мое мнение това не представлява истинският въпрос, който се отнася до използването на libsvm и има много малко общо с факта дали са текстови функции или не.   -  person Pedrom    schedule 20.03.2014


Отговори (1)


Вашата интуиция е много близка, но svm_node е модел, а не функция. Променливата svm_problem.y е масив, който съдържа етикетите на всеки модел, а svm_problem.l е размерът на набора за обучение.

Също така имайте предвид, че svm_parameter.nr_weight е теглото на всеки етикет (полезно, ако имате небалансиран тренировъчен набор), но ако няма да го използвате, трябва да зададете тази стойност на нула.

Нека ви покажа прост пример в C++:

#include "svm.h"
#include <iostream>

using namespace std;

int main()
{
    svm_parameter params;


    params.svm_type = C_SVC;
    params.kernel_type = RBF;
    params.C = 1;
    params.gamma = 1;
    params.nr_weight = 0;
    params.p= 0.0001;

    svm_problem problem;
    problem.l = 4;
    problem.y = new double[4]{1,-1,-1,1};
    problem.x = new svm_node*[4];

    {
    problem.x[0] = new svm_node[3];
    problem.x[0][0].index = 1;
    problem.x[0][0].value = 0;
    problem.x[0][1].index = 2;
    problem.x[0][1].value = 0;
    problem.x[0][2].index = -1;

    }

    {
    problem.x[1] = new svm_node[3];
    problem.x[1][0].index = 1;
    problem.x[1][0].value = 1;
    problem.x[1][1].index = 2;
    problem.x[1][1].value = 0;
    problem.x[1][2].index = -1;
    }

    {
    problem.x[2] = new svm_node[3];
    problem.x[2][0].index = 1;
    problem.x[2][0].value = 0;
    problem.x[2][1].index = 2;
    problem.x[2][1].value = 1;
    problem.x[2][2].index = -1;
    }

   {
    problem.x[3] = new svm_node[3];
    problem.x[3][0].index = 1;
    problem.x[3][0].value = 1;
    problem.x[3][1].index = 2;
    problem.x[3][1].value = 1;
    problem.x[3][2].index = -1;

    }

    for(int i=0; i<4; i++)
    {
        cout << problem.y[i] << endl;
    }

    svm_model * model = svm_train(&problem, &params);
    svm_save_model("mymodel.svm", model);

    for(int i=0; i<4; i++)
    {
        double d = svm_predict(model, problem.x[i]);

        cout << "Prediction " << d << endl;
    }
    /* We should free the memory at this point. 
       But this example is large enough already */ 
}
person Pedrom    schedule 20.03.2014