2010-09-10 11 views
7

Z poprawkami StompChickena (pomyliłem jeden produkt, ugh!) Odpowiedź brzmi "tak". Od tego czasu testowałem ten sam problem, używając wstępnie skompilowanego jądra o tych samych poprawnych wynikach. Jeśli używasz libsvm StompChickens jasne, zorganizowane obliczenia są bardzo miłym sprawdzianem.Czy libsvm jest dokładne?

Oryginalne pytanie: Za chwilę zacznę używać prekomputowanych jąder w libSVM. Zauważyłem, Vlad's answer na pytanie i myślałem, że byłoby mądre, aby potwierdzić, że libsvm dał prawidłowe odpowiedzi. Zacząłem od niekomputerowych jądra, po prostu proste liniowe jądro z 2 klasami i trzema punktami danych w przestrzeni trójwymiarowej. Kiedyś dane

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

Plik modelu generowane przez wywołanie svm-train -s 0 - t 0 zawiera

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 

Jednak kiedy obliczyć rozwiązanie ręką, że nie jest to, co dostaję. Czy ktoś wie, czy libsvm cierpi z powodu błędów lub czy ktoś może porównać notatki i zobaczyć, czy robi to samo, co robi program libsvm?

Współczynniki a1, a2, a3 zwracane przez libsvm to powinno wartości, które czynią

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

tak duża, jak to możliwe, z ograniczeniami, że a1 + a3 = a2 i każdy a1, a2, a3 wymagana jest leżą między 0 a 1 (domyślna wartość C).

Powyższy plik modelu mówi, że odpowiedź jest

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

Ale po prostu musi zastąpić a2 = a1 + a3 do wielkiego wzoru powyżej potwierdzają obie pochodne cząstkowe są równe zeru, aby sprawdzić, czy to rozwiązanie jest prawidłowe (ponieważ żaden z a1 , a2, a3 to 0 lub 1), ale nie są one zerowe.

Czy robię coś nie tak, czy też jest to niezgodne z prawdą, co daje złe wyniki? (Mam nadzieję, że coś robię nie tak).

Odpowiedz

9

LibSVM jest bardzo popularną biblioteką i wątpię, by coś było drastycznie nie tak z kodem. To powiedziawszy, myślę, że to wspaniale, że są ludzie, którzy są na tyle paranoiczni, aby faktycznie sprawdzić to pod kątem poprawności - dobrze zrobione!

Rozwiązanie wydaje się być zgodne z działaniem, które podaję poniżej. Mam na myśli to, że spełnia on KKT conditions (15.29). Prawdą jest również, że częściowe pochodne dualu znikają w roztworze.

Oto moja robocza ...

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