Вычисление коэффициентов Лагранжа для SVM в Python

10

Я пытаюсь написать полную реализацию SVM на Python, и у меня есть несколько проблем с вычислением коэффициентов Лагранжа.

Сначала позвольте мне перефразировать то, что я понимаю из алгоритма, чтобы убедиться, что я на правильном пути.

Если x1,x2,...,xn - это набор данных, а yi{1,1} - метка класса xi , тогда

i,yi(wTxi+b)1

Так что нам просто нужно решить проблему оптимизации, чтобы

| |вес| |2

при условииYя(весTИкся+б)1

В терминах коэффициентов Лагранжа это приводит к нахождению минимизации , и и :б α = ( & alpha ; 1 , & alpha ; 2 , . . . α п ) 0 0 L ( α , ш , б ) = 1весбαзнак равно(α1,α2,,,,αN)00

L(α,вес,б)знак равно12| |вес| |2-Σαя(Yя(весTИкс+б)-1)

Теперь, поскольку и мы можем переписать его как L (\ alpha, w, b) = Q (\ alpha) = \ sum \ alpha_i - \ frac12 \ sum \ sum \ alpha_i \ alpha_j y_i y_j x_i ^ T x_j с ограничениями \ alpha_i \ geq 0 \ \ text {and} \ \ sum \ alpha_i y_i = 0L

Lвесзнак равно0весзнак равноΣαяYяИкся
л ( & alpha ; , ш , б ) = Q ( & alpha ; ) = Е & alpha ; я - 1
Lбзнак равно0ΣYяαязнак равно0
L(α,вес,б)знак равноQ(α)знак равноΣαя-12ΣΣαяαJYяYJИксяTИксJ
αя0 а также ΣαяYязнак равно0

Поэтому я пытаюсь решить проблему оптимизации с помощью Python, и единственный бесплатный пакет, который я могу найти, называется cvxopt .

Мне нужна помощь, чтобы решить эту проблему, я не смог найти хорошего примера по этому поводу, и хотя я понимаю теорию, мне трудно перевести ее в код (я бы ожидал обратного, так как больше из опыта программирования).

Обратите внимание, что в какой-то момент я захочу решить ее, используя Ядра но я не уверен, каковы последствия решения этого в коде.

L(α,вес,б)знак равноQ(α)знак равноΣαя-12ΣΣαяαJYяYJК(Икся,ИксJ)

Любая помощь будет принята с благодарностью, я действительно потерялся в том, как реализовать это в Python. Если у вас есть лучший модуль для решения проблемы оптимизации, я бы тоже хотел прочитать об этом.

Чарльз Менгу
источник

Ответы:

4

Я использовал cvxopt для реализации SVM раньше, однако в Matlab не Python. Это определенно будет служить вашей цели, будет ли его эффективность будет зависеть от того, для чего вы его используете. Наиболее эффективные SVM не используют пакет решения QP, они используют преимущества некоторых оптимизаций, уникальных для SVM. Многие используют алгоритм стиля SMO для его решения.

LibSVM - это пакет SVM, который использует алгоритм выбора рабочего набора с использованием информации второго порядка для обучающих векторных машин поддержки . Код с открытым исходным кодом, если вам интересно посмотреть, как он реализован. Он также имеет интерфейс Python.

SVMLight - это еще один пакет, в котором используется другой алгоритм (см. Ссылки на их сайте). Это также с открытым исходным кодом и имеет интерфейс Python.

karenu
источник
Спасибо за информативный ответ (который я думаю, заменяет мой), и добро пожаловать в Scicomp!
Арон Ахмадиа
+1 интересный ответ, и я начал смотреть на ваши замечательные ссылки, которые мне очень помогают!
Чарльз Менгуй
2

Общая форма вашей задачи оптимизации - это квадратичная программа , независимо от того, используете ли вы ядро или линейное ядро. Похоже, cvxoptэтого будет достаточно для того, что вы пытаетесь сделать, но и другим питонавтам здесь повезло и с OpenOpt .

Арон Ахмадия
источник
Арон, ты знаешь, была ли исправлена ​​оболочка Ipopt Python?
Джефф Оксберри
Один из учеников Дэвида Кетчона начал работать с OpenOpt (который может использовать его с квазиньютоновским алгоритмом), но столкнулся с некоторыми трудностями при запуске стека OpenOpt в OS X.
Aron Ahmadia