2012-06-11 2 views
10

Я использую libsvm с предварительно вычисленными ядрами. Я сгенерировал предварительно вычисленный файл ядра для примера набора данных heart_scale и выполнил svm-train. Он работал должным образом, и поддерживающие векторы были идентифицированы правильно, т. Е. Аналогично неперечисленной версии.Предпочитаемые ядра Libsvm

Однако, когда я пытаюсь запустить svm-pred, он дал разные результаты для файла с предварительно вычисленной моделью. После копания кода я заметил, что функция svm_predict_values ​​() требует реальных функций векторов поддержки, которые недоступны в предварительно вычисленном режиме. В предвычисленном режиме, у нас есть только коэффициент и индекс каждого вектора поддержки, который ошибочно принимает за его особенность по SVM предсказуемых.

Это ошибка или проблема с моим пониманием. Если это ошибка с моей стороны, сообщите мне, как запустить svm-pred в предварительно вычисленном режиме.

+1

Насколько я помню, вы должны вручную предсказать значения, если вы используете предварительно вычисленное ядро ​​для обучения SVM. – George

ответ

4

Значения оценки ядра между вектором тестового набора, x и каждым вектором обучающего набора должны использоваться в качестве вектора признаков тестового набора.

Вот соответствующие строки из libsvm ридми:

Новый экземпляр обучение XI:
< метка> 0: я 1: K (Xi, x1) ... L: K (Xi , xL)

Новый испытательный экземпляр для любого x:
< ярлык 0 :? 1: К (х, x1) ... L: К (х, хЬ)

libsvm ридми говорит, что если у вас есть L обучающего множества векторов, где XI представляет собой учебный набор вектор I из [ 1..L] и вектор тестового набора, x, то вектор функции для x должен быть

< метка x> 0: < любое число> 1: K (x^{test}, x1^{ поезд}), 2: K (x^{test}, x2^{train}) ... L: K (x^{test}, xL^{train})

где K (u, v) используется для обозначения вывода функции ядра on с векторами u и v в качестве аргументов.

Я включил некоторый пример кода python ниже.

Результаты первоначального представления векторной функции и предварительно вычисленного (линейного) ядра не совсем то же самое, но это, вероятно, связано с различиями в алгоритме оптимизации.

from svmutil import * 
import numpy as np 

#original example 
y, x = svm_read_problem('.../heart_scale') 
m = svm_train(y[:200], x[:200], '-c 4') 
p_label, p_acc, p_val = svm_predict(y[200:], x[200:], m) 

############## 
#train the SVM using a precomputed linear kernel 

#create dense data 
max_key=np.max([np.max(v.keys()) for v in x]) 
arr=np.zeros((len(x),max_key)) 

for row,vec in enumerate(x): 
    for k,v in vec.iteritems(): 
     arr[row][k-1]=v 
x=arr 

#create a linear kernel matrix with the training data 
K_train=np.zeros((200,201)) 
K_train[:,1:]=np.dot(x[:200],x[:200].T) 
K_train[:,:1]=np.arange(200)[:,np.newaxis]+1 

m = svm_train(y[:200], [list(row) for row in K_train], '-c 4 -t 4') 

#create a linear kernel matrix for the test data 
K_test=np.zeros((len(x)-200,201)) 
K_test[:,1:]=np.dot(x[200:],x[:200].T) 
K_test[:,:1]=np.arange(len(x)-200)[:,np.newaxis]+1 

p_label, p_acc, p_val = svm_predict(y[200:],[list(row) for row in K_test], m) 
Смежные вопросы