Является ли libsvm точным? - PullRequest
       28

Является ли libsvm точным?

7 голосов
/ 11 сентября 2010

С поправками StompChicken (я неправильно рассчитал одно точечное произведение, тьфу!) Ответ, кажется, да.С тех пор я тестировал ту же проблему, используя предварительно вычисленное ядро ​​с такими же правильными результатами.Если вы используете libsvm StompChickens clear, организованные вычисления - очень хорошая проверка.

Оригинальный вопрос: Я собираюсь начать использовать предварительно вычисленные ядра в libSVM.Я заметил ответ Влада на вопрос, и я подумал, что было бы разумно подтвердить, что libsvm дал правильные ответы.Я начал с предварительно не вычисленных ядер, просто с линейным ядром с 2 классами и тремя точками данных в 3-мерном пространстве.Я использовал данные

1 1:3 2:1 3:0
2 1:3 2:3 3:1
1 1:7 3:9

Файл модели, сгенерированный при вызове svm-train -s 0 - t 0, содержит

svm_type c_svc
kernel_type linear
nr_class 2
total_sv 3
rho -1.53951
label 1 2
nr_sv 2 1
SV
0.4126650675419768 1:3 2:1 3:0 
0.03174528241667363 1:7 3:9 
-0.4444103499586504 1:3 2:3 3:1 

Однако, когда я вычисляю решение вручную, это не то, что я получаю.Кто-нибудь знает, страдает ли libsvm от ошибок, или кто-то может сравнить заметки и посмотреть, получают ли они то же самое, что libsvm делает?

Коэффициенты a1, a2, a3, возвращаемые libsvm, должны бытьзначения, которые делают

a1 + a2 + a3 - 5*a1*a1 + 12*a1*a2 - 21*a1*a3 - 19*a2*a2/2 + 21*a2*a3 - 65*a3*a3 

максимально возможным с ограничениями, которые a1 + a3 = a2 и каждое из a1, a2, a3 должны находиться в диапазоне от 0 до 1 (значение по умолчанию:C).

В приведенном выше файле модели написано, что ответом является

a1 = .412665...
a2 = .444410...
a3 = .031745...

Но нужно просто подставить a2 = a1 + a3 в большую формулу выше и подтвердить, что обе частные производные равны нулю, чтобы увидеть,Это правильное решение (поскольку ни один из a1, a2, a3 не равен 0 или 1), но они не равны нулю.

Я что-то не так делаю, или libsvm дает плохие результаты?(Я надеюсь, что делаю что-то не так.)

1 Ответ

9 голосов
/ 13 сентября 2010

LibSVM - очень широко используемая библиотека, и я очень сомневаюсь, что с кодом что-то кардинально неправильно.Тем не менее, я думаю, это здорово, что есть люди, которые настолько параноидальны, что на самом деле проверяют правильность - молодец!

Решение кажется правильным в соответствии с работой, которую я даю ниже.Под этим я подразумеваю, что он удовлетворяет условиям KKT (15.29).Также верно, что частные производные двойственного исчезают при решении.

Вот моя работа ...

x1 = (3,1,0)  x2 = (3,3,1)  x3 = (7,0,9)
y1 = -1       y2 = 1        y3 = -1

K = [10   12   21]
    [12   19   30]
    [21   30  130]

L_dual = a1 + a2 + a3 -5a1^2 + 12a1a2 - 21a1a3 - (19/2)a2^2 + 30a2a3 - 65a3^2)

a1 = 0.412  a2 = 0.4444  a3 = 0.0317

Checking KKT:
y1.f(x1) = y1 * (y1*a1*K(x1,x1) + y2*a2*K(x1,x2) + y3*a3*k(x1,x3) - rho)
         = rho + 10*a1 + 21*a3 - 12*a2
         ~= 1
(Similar for the x2 and x3)

Substituting a2 = a1 + a3 into L_dual:
L_dual = 2a1 + 2a3 - 2.5a1^2 + 2a1a3 - 44.5a3^2
dL/da1 = 2 - 5a1 + 2a3 = 0
dL/da3 = 2 + 2a1 - 89a3 = 0
...