2010-09-10 14 views
7

Con las correcciones de StompChicken (¡no calculé correctamente un producto de punto, ugh!) La respuesta parece ser sí. Desde entonces he probado el mismo problema utilizando un kernel precalculado con los mismos resultados correctos. Si está utilizando libsvm StompChickens claro, los cálculos organizados son una muy buena verificación.¿Es preciso libsvm?

Pregunta Original: Estoy a punto de comenzar a usar kernels precalculados en libSVM. Me di cuenta de Vlad's answer a una pregunta y pensé que sería conveniente confirmar que libsvm dio las respuestas correctas. Empecé con núcleos no precalculados, solo un kernel lineal simple con 2 clases y tres puntos de datos en un espacio tridimensional. He utilizado los datos

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

El archivo modelo generado por una llamada a svm-train -s 0 - t 0 contiene

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 

Sin embargo, cuando puedo calcular la solución a mano, eso no es lo que consigo. ¿Alguien sabe si libsvm sufre errores o puede alguien comparar notas y ver si obtienen lo mismo que libsvm?

Los coeficientes a1, a2, a3 devueltos por libsvm son deben ser los valores que hacen

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

lo más grande posible con las restricciones que a1 + a3 = a2 y cada uno de a1, a2, se requiere a3 a se encuentra entre 0 y 1 (el valor predeterminado de C).

El archivo del modelo anterior dice que la respuesta es

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

Pero sólo hay que sustituir a2 = a1 + a3 en el gran fórmula anterior y confirmar las dos derivadas parciales son cero para ver si esta solución es correcta (ya que ninguno de a1 , a2, a3 es 0 o 1) pero no son cero.

¿Estoy haciendo algo mal, o está libsvm dando malos resultados? (Tengo la esperanza de estar haciendo algo mal.)

Respuesta

9

LibSVM es una biblioteca muy utilizada y dudo que nada sea drásticamente erróneo con el código. Dicho esto, creo que es genial que haya personas lo suficientemente paranoicas como para comprobar si es correcto, ¡bien hecho!

La solución parece correcta de acuerdo con el trabajo que doy a continuación. Lo que quiero decir con eso es que satisface el KKT conditions (15.29). También es cierto que las derivadas parciales del doble desaparecen en la solución.

Aquí está mi trabajo ...

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 
Cuestiones relacionadas