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