2013-10-09 2 views
0

Насколько я понимаю, я мог бы проанализировать поддерживающие векторы из модели, созданной путем обучения с набором данных с помощью LibSVM.Как классифицировать вручную парсинг векторов поддержки из модели LibSVM?

Какая будет формула для создания классификатора?

ли мне нужны данные в заголовках файла, как следующее (ядро и т.д. ... до перечисленных опорных векторов):

svm_type c_svc 
kernel_type rbf 
gamma 0.125 
nr_class 4 
total_sv 1038 
rho -0.859244 -0.876628 -0.958343 0.543365 -1.10722 -1.79433 
label 2 1 3 0 
nr_sv 364 276 242 156 
SV 

Мой случай

  • Я хочу сделать классификацию из Node.JS. Но для LibSVM для него пока нет привязок.
  • Поскольку мои модели не будут меняться, я хотел бы сделать классификацию в Node.JS, удерживая модель в памяти.
  • Если это окажется медленным, я скорее напишу ту же классификацию с нуля в C++ и создаю модуль-оболочку, если это всего лишь простой расчет (как я подозреваю).

Спасибо.

+0

Если вы все еще пытаетесь использовать libsvm на узле, есть библиотека под названием [node-svm] (https://github.com/nicolaspanel/node-svm) – nicolaspanel

+0

Спасибо, я переписал классификацию в JavaScript от источник libsvm, но не выпустил это. Это должно быть лучше для людей, которые в порядке с бинарной зависимостью. –

ответ

1

Вы должны иметь возможность перевести функцию C в Javascript.

Вот соответствующий код:

double svm_predict_values(const svm_model *model, const svm_node *x, double* dec_values) 
{ 
     int i; 
     int nr_class = model->nr_class; 
     int l = model->l; 

     double *kvalue = Malloc(double,l); 
     for(i=0;i<l;i++) 
       kvalue[i] = Kernel::k_function(x,model->SV[i],model->param); 

     int *start = Malloc(int,nr_class); 
     start[0] = 0; 
     for(i=1;i<nr_class;i++) 
       start[i] = start[i-1]+model->nSV[i-1]; 

     int *vote = Malloc(int,nr_class); 
     for(i=0;i<nr_class;i++) 
       vote[i] = 0; 

     int p=0; 
     for(i=0;i<nr_class;i++) 
       for(int j=i+1;j<nr_class;j++) 
       { 
         double sum = 0; 
         int si = start[i]; 
         int sj = start[j]; 
         int ci = model->nSV[i]; 
         int cj = model->nSV[j]; 

         int k; 
         double *coef1 = model->sv_coef[j-1]; 
         double *coef2 = model->sv_coef[i]; 
         for(k=0;k<ci;k++) 
           sum += coef1[si+k] * kvalue[si+k]; 
         for(k=0;k<cj;k++) 
           sum += coef2[sj+k] * kvalue[sj+k]; 
         sum -= model->rho[p]; 
         dec_values[p] = sum; 

         if(dec_values[p] > 0) 
           ++vote[i]; 
         else 
           ++vote[j]; 
         p++; 
       } 

     int vote_max_idx = 0; 
     for(i=1;i<nr_class;i++) 
       if(vote[i] > vote[vote_max_idx]) 
         vote_max_idx = i; 

     free(kvalue); 
     free(start); 
     free(vote); 
     return model->label[vote_max_idx]; 
} 

Обратите внимание, что вы должны воссоздать это уравнение:

enter image description here

Единственное различие, так как ваша модель имеет 4 класса, вы должны реализовать система голосования, которая в основном является кодом выше.

Надеюсь, это поможет.

+0

Спасибо @Pedrom. Отвечает ли ваш ответ на упомянутое вами уравнение? Что касается кода выше, вы лишили эту функцию из источника LibSVM: https://github.com/arnaudsj/libsvm/blob/master/svm.cpp#L2459 Ницца. :) –

+0

Упс ... по какой-то причине он не появился ... теперь исправлено :) И да ... просто удалили части, которые могли бы сделать некоторый шум, стыдно, что ваша модель не двоичная, потому что это может быть еще проще. – Pedrom

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