Calcolo dei coefficienti di Lagrange per SVM in Python


10

Sto cercando di scrivere un'implementazione SVM completa in Python e ho qualche problema nel calcolo dei coefficienti di Lagrange.

Prima di tutto lasciami riformulare ciò che ho capito dall'algoritmo per assicurarmi di essere sulla strada giusta.

Se è un set di dati e è l'etichetta di classe di , quindiy i{ - 1 , 1 } x ii , y i ( w T x i + b ) 1x1,x2,...,xnyi{1,1}xi

i,yi(wTxi+b)1

Quindi dobbiamo solo risolvere un problema di ottimizzazione

minimizzaw2

soggetto a yi(wTxi+b)1

In termini di coefficienti di Lagrange, questo si traduce nella ricerca di w , b e α=(α1,α2,...αn)0 e \ geq0 minimizing0 :

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

Ora poiché

Lw=0w=αiyixi
e
Lb=0yiαi=0
possiamo riscriverlo come
L(α,w,b)=Q(α)=αi12αiαjyiyjxiTxj
con vincoli
αi0 and αiyi=0

Quindi sto provando a risolvere il problema di ottimizzazione usando Python e l'unico pacchetto gratuito che ho trovato si chiama cvxopt .

Vorrei un po 'di aiuto per risolvere questo problema, non sono riuscito a trovare alcun buon esempio a riguardo, e mentre capisco la teoria, sto facendo fatica a tradurla in codice (mi sarei aspettato il contrario dal momento che sono più da un background di programmazione).

Nota che a un certo punto vorrò risolverlo usando Kernels ma non sono sicuro di quali siano le implicazioni per quanto riguarda la risoluzione di questo problema nel codice.

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

Qualsiasi aiuto sarebbe molto apprezzato, mi sono davvero perso su come implementarlo in Python. Se hai un modulo migliore per risolvere il problema di ottimizzazione, mi piacerebbe anche leggerlo.

Risposte:


4

Ho usato cvxopt per implementare un SVM prima, tuttavia in Matlab non in Python. Sicuramente servirà al tuo scopo, se il suo abbastanza efficiente dipenderà da quello per cui lo stai usando. Gli SVM più efficienti non utilizzano un pacchetto risolutore QP, ma sfruttano alcune ottimizzazioni esclusive di SVM. Molti usano un algoritmo in stile SMO per risolverlo.

LibSVM è un pacchetto SVM che utilizza l'algoritmo nella selezione dei set di lavoro utilizzando le informazioni del secondo ordine per macchine vettoriali di supporto alla formazione . Il codice è open source, se sei interessato a vedere come è stato implementato. Ha anche un'interfaccia Python.

SVMLight è un altro pacchetto, usano un algoritmo diverso (vedi il loro sito per i riferimenti). È anche open source e ha un'interfaccia python.


Grazie per la risposta informativa (che credo sostituisca la mia), e benvenuto su scicomp!
Aron Ahmadia

+1 risposta interessante e ho iniziato a guardare i tuoi fantastici link che mi stanno aiutando molto!
Charles Menguy,

2

La forma generale del tuo problema di ottimizzazione è un programma quadratico , indipendentemente dal fatto che tu stia usando il trucco del kernel o un kernel lineare. Sembra che cvxoptsarà sufficiente per quello che stai cercando di fare, ma altri pitoni qui hanno avuto fortuna anche con OpenOpt .


Aron, sai se il wrapper Ipopt Python è mai stato corretto?
Geoff Oxberry,

Uno degli studenti di David Ketcheson l'ha fatto funzionare con OpenOpt (che può usarlo con un algoritmo quasi-Newton), ma ha avuto alcune difficoltà a far funzionare lo stack OpenOpt su OS X.
Aron Ahmadia
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.