Cálculo de coeficientes de Lagrange para SVM en Python

10

Estoy tratando de escribir una implementación SVM completa en Python y tengo algunos problemas para calcular los coeficientes de Lagrange.

Primero déjame reformular lo que entiendo del algoritmo para asegurarme de que estoy en el camino correcto.

Si es un conjunto de datos e y i{ - 1 , 1 } es la etiqueta de clase de x i , entonces i , y i ( w T x i + b ) 1x1,x2,...,xnyi{1,1}xi

i,yi(wTxi+b)1

Entonces solo necesitamos resolver un problema de optimización para

w2

sujeto ayi(wTxi+b)1

En términos de los coeficientes de Lagrange, esto se traduce en la búsqueda de , y y minimizando:wbα=(α1,α2,...αn)00

L(α,w,b)=12w2αi(yi(wTx+b)1)

Ahora desde y podemos reescribirlo como con restricciones

Lw=0w=αiyixi
Lb=0yiαi=0
L(α,w,b)=Q(α)=αi12αiαjyiyjxiTxj
αi0 and αiyi=0

Así que estoy tratando de resolver el problema de optimización usando Python, y el único paquete gratuito que pude encontrar se llama cvxopt .

Me gustaría recibir ayuda para resolver esto, no pude encontrar ningún buen ejemplo al respecto, y aunque entiendo la teoría, me cuesta traducirlo a código (hubiera esperado lo contrario ya que estoy más de un fondo de programación).

Tenga en cuenta que en algún momento querré resolverlo usando Kernels pero no estoy seguro de cuáles son las implicaciones con respecto a resolver esto en código.

L(α,w,b)=Q(α)=αi12αiαjyiyjK(xi,xj)

Cualquier ayuda sería muy apreciada, estoy realmente perdido en cómo implementar esto en Python. Si tiene un mejor módulo para resolver el problema de optimización, me gustaría leer sobre él también.

Charles Menguy
fuente

Respuestas:

4

He usado cvxopt para implementar un SVM antes, sin embargo, en matlab no python. Definitivamente servirá a su propósito, ya sea que sea lo suficientemente eficiente dependerá de para qué lo esté utilizando. Los SVM más eficientes no usan un paquete de solucionador QP, aprovechan algunas optimizaciones exclusivas de SVM. Muchos usan un algoritmo de estilo SMO para resolverlo.

LibSVM es un paquete SVM que utiliza el algoritmo en la selección del conjunto de trabajo utilizando información de segundo orden para máquinas de vectores de soporte de capacitación . El código es de código abierto, si está interesado en ver cómo se implementa. También tiene una interfaz de Python.

SVMLight es otro paquete, usan un algoritmo diferente (vea su sitio para referencias). También es de código abierto y tiene una interfaz de Python.

karenu
fuente
¡Gracias por la respuesta informativa (que creo que supera a la mía), y bienvenido a scicomp!
Aron Ahmadia
¡+1 respuesta interesante y he comenzado a mirar tus excelentes enlaces que me están ayudando mucho!
Charles Menguy
2

La forma general de su problema de optimización es un programa cuadrático , independientemente de si está utilizando el truco del núcleo o un núcleo lineal. Parece que cvxoptserá suficiente para lo que intentas hacer, pero otros pitonautas aquí también han tenido suerte con OpenOpt .

Aron Ahmadia
fuente
Aron, ¿sabes si alguna vez se arregló el contenedor de Ipopt Python?
Geoff Oxberry
Uno de los estudiantes de David Ketcheson lo consiguió trabajando con OpenOpt (que puede usarlo con un algoritmo cuasi-Newton), pero ha tenido algunas dificultades para poner en marcha la pila de OpenOpt en OS X.
Aron Ahmadia