Вступление

Основное внимание в статье будет уделено реализации SVM для бинарной классификации по сравнению с задействованной математикой. Вот статья, которая объясняет математику SVM для заинтересованных читателей.

Проблема оптимизации - жесткая маржа

Проблема оптимизации SVM при использовании жесткого запаса (не должно быть неправильной классификации) может быть представлена, как указано выше, где w - веса, а b - смещение, которое необходимо изучить. Это можно решить с помощью любого решателя квадратичного программирования, но мы преобразуем эту ограниченную задачу в двойственную, используя множители Лагранжа, как показано ниже:

Здесь лямбда - множители Лагранжа. Итак, мы превратили нашу задачу оптимизации из проблемы с точки зрения w в проблему с точки зрения лямбда.

Проблема оптимизации - мягкая маржа

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

Мягкая маржа также может быть решена с помощью градиентного спуска путем минимизации функции потерь ниже:

Квадратичное программирование с использованием CVXOPT

CVXOPT - это библиотека оптимизации на Python. Мы можем использовать qp-решатель CVXOPT для решения квадратичных задач, таких как наша задача оптимизации SVM. Нам просто нужно создать матрицы P, q, A, G, h и инициализировать значение для b.

Сравнивая наши задачи оптимизации с рисунком выше, мы можем легко вывести значения этих матриц.

Ядра

Решение проблемы с мягким запасом кажется таким простым с помощью градиентного спуска, зачем использовать такой сложный метод, как квадратичное программирование? Ядра содержат ответ, особенно трюк с ядром. Чтобы применить трюк с ядром, нам просто нужно создать матрицу ядра и заменить значения x этой матрицей, и, наконец, мы преобразовали наши данные в новое, более выразительное пространство функций без фактического преобразования данных.

Ниже приведены примеры линейных, полиномиальных и гауссовских ядер:

Приступим к кодированию !!!

Для работы кода обязательно, чтобы целевые метки были -1 и 1. Ниже приведены необходимые библиотеки.

Сначала давайте посмотрим на проблему жесткой маржи:

Для мягкой наценки:

Теперь решим квадратичную задачу и получим значения опорных векторов.

Поскольку мы используем ядро, мы можем вычислить значение смещения b, но мы не можем вычислить значения весов, поскольку нам нужны полные преобразованные данные для их получения. Давайте рассчитаем смещение, как показано ниже:

Удивительно, но для прогнозирования нам нужны только опорные векторы, множители Лагранжа и смещение, а не веса. Вот код для прогнозов:

В приведенном выше коде используется линейное ядро, но работает со всеми типами ядер.

Заключение

Из кода мы можем получить несколько интересных идей. QP-решатель CVXOPT молниеносно быстр, что делает эту SVM такой же быстрой. SVM требуются только опорные векторы и соответствующие им множители Лагранжа, чтобы делать прогнозы, которые делают их очень эффективными с точки зрения памяти. Я призываю читателей поддерживать векторный классификатор sklearn с этим классификатором и экспериментировать с кодом, чтобы сделать его быстрее.