Calcul des coefficients de Lagrange pour SVM en Python

10

J'essaie d'écrire une implémentation SVM complète en Python et j'ai quelques problèmes pour calculer les coefficients Lagrange.

Permettez-moi d'abord de reformuler ce que je comprends de l'algorithme pour m'assurer que je suis sur la bonne voie.

Si est un ensemble de données et est l'étiquette de classe de , alorsx1,x2,...,xnyi{1,1}xi

i,yi(wTxi+b)1

Nous avons donc juste besoin de résoudre un problème d'optimisation pour

minimiserw2

sous réserve de yi(wTxi+b)1

En termes de coefficients de Lagrange, cela se traduit par la recherche de w , b et α=(α1,α2,...αn)0 et 0 minimisant:

L(α,w,b)=12w2-αje(yje(wTX+b)-1)

Puisque

Lw=0w=αjeyjeXje
et
Lb=0yjeαje=0
nous pouvons le réécrire comme
L(α,w,b)=Q(α)=αje-12αjeαjyjeyjXjeTXj
avec des contraintes
αje0 et αjeyje=0

J'essaie donc de résoudre le problème d'optimisation en utilisant Python, et le seul paquet gratuit que j'ai pu trouver s'appelle cvxopt .

J'aimerais avoir de l'aide pour résoudre ce problème, je n'ai trouvé aucun bon exemple à ce sujet, et bien que je comprenne la théorie, j'ai du mal à la traduire en code (je m'attendais à l'inverse depuis que je suis plus d'un contexte de programmation).

Notez qu'à un moment donné, je vais vouloir le résoudre en utilisant les noyaux mais je ne sais pas quelles sont les implications concernant la résolution de ce problème dans le code.

L(α,w,b)=Q(α)=αje-12αjeαjyjeyjK(Xje,Xj)

Toute aide serait grandement appréciée, je suis vraiment perdu sur la façon de l'implémenter en Python. Si vous avez un meilleur module pour résoudre le problème d'optimisation, j'aimerais également en savoir plus.

Charles Menguy
la source

Réponses:

4

J'ai déjà utilisé cvxopt pour implémenter un SVM, cependant dans matlab pas en python. Il servira certainement votre objectif, que son efficacité dépende de l'utilisation que vous en faites. Les SVM les plus efficaces n'utilisent pas de package de solveur QP, ils profitent de certaines optimisations propres à SVM. Beaucoup utilisent un algorithme de style SMO pour le résoudre.

LibSVM est un package SVM qui utilise l'algorithme dans la sélection des ensembles de travail à l'aide des informations de second ordre pour les machines à vecteur de support de formation . Le code est open source, si vous souhaitez voir comment il est implémenté. Il a également une interface python.

SVMLight est un autre package, ils utilisent un algorithme différent (voir leur site pour les références). Il est également open source et possède une interface python.

karenu
la source
Merci pour la réponse informative (qui je pense remplace la mienne), et bienvenue sur scicomp!
Aron Ahmadia
+1 réponse intéressante et j'ai commencé à regarder vos excellents liens qui m'aident beaucoup!
Charles Menguy
2

La forme générale de votre problème d'optimisation est un programme quadratique , que vous utilisiez l' astuce du noyau ou un noyau linéaire. Cela semble cvxoptêtre suffisant pour ce que vous essayez de faire, mais d'autres pythonautes ici ont également eu de la chance avec OpenOpt .

Aron Ahmadia
la source
Aron, savez-vous si le wrapper Ipopt Python a été corrigé?
Geoff Oxberry
Un des étudiants de David Ketcheson l'a fait fonctionner avec OpenOpt (qui peut l'utiliser avec un algorithme quasi-Newton), mais a eu quelques difficultés à faire fonctionner la pile OpenOpt sur OS X.
Aron Ahmadia