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.)