Объясните алгоритм машинного обучения SVM


Алгоритм SVM (Support Vector Machine, метод опорных векторов) — один из самых мощных и широко используемых алгоритмов машинного обучения для задач классификации и регрессии. Основная идея алгоритма заключается в поиске такой гиперплоскости, которая максимально разделяет классы данных.

🧠 Основная идея

SVM пытается найти оптимальную разделяющую гиперплоскость (в 2D — это линия), которая:

  • Разделяет два класса.

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

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

📐 Математическая постановка задачи (линейный SVM)

Пусть даны обучающие данные:

  • xi∈Rnx_i \in \mathbb{R}^n — вектор признаков;

  • yi∈{−1,+1}y_i \in \{-1, +1\} — метка класса.

Задача: найти такие веса w∈Rnw \in \mathbb{R}^n и смещение bb, чтобы выполнялось:

y_i (w^T x_i + b)  1, для всех i

И минимизировать:

(1/2) ||w||^2

Это задача квадратичной оптимизации. Её цель — найти такую плоскость, которая:

  • Разделяет классы правильно;

  • Имеет максимальный зазор (минимальный ||w||).

📌 Опорные векторы

Опорные векторы — это те точки, которые находятся ближе всего к разделяющей гиперплоскости. Именно они определяют положение этой плоскости.

  • Все остальные точки можно двигать, не меняя гиперплоскость.

  • Опорные векторы — критичны.

🧱 Линейно неразделимые данные и soft margin

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

Поэтому вводится soft margin — допускаются некоторые ошибки классификации, но они штрафуются. Добавляется параметр C, который регулирует компромисс:

  • Большое C → меньше ошибок, но меньший зазор.

  • Малое C → больше ошибок, но больший зазор (лучше обобщение).

Оптимизируем:

minimize: (1/2)||w||^2 + C  ξ_i
subject to: y_i (w^T x_i + b)  1 - ξ_i
and ξ_i  0

🔁 Ядровой трюк (Kernel trick)

Когда данные нелинейно разделимы, SVM использует ядра (kernel functions) для отображения данных в большее пространство признаков, где они становятся линейно разделимыми.

Преимущество: мы не вычисляем сами отображения, а используем ядровую функцию K(x_i, x_j), которая эквивалентна скалярному произведению в новом пространстве.

Примеры ядер:

  • Линейное ядро: K(xi,xj)=xiTxjK(x_i, x_j) = x_i^T x_j

  • Полиномиальное: K(xi,xj)=(xiTxj+r)dK(x_i, x_j) = (x_i^T x_j + r)^d

  • RBF (Gaussian): K(xi,xj)=exp⁡(−γ∣∣xi−xj∣∣2)K(x_i, x_j) = \exp(-\gamma ||x_i - x_j||^2)

  • Sigmoid: K(xi,xj)=tanh⁡(αxiTxj+c)K(x_i, x_j) = \tanh(\alpha x_i^T x_j + c)

🧮 Предсказание

После обучения, предсказание делается с помощью:

f(x) = sign(w^T x + b)

В ядровом виде:

f(x) = sign( α_i y_i K(x_i, x) + b)

Где:

  • αiα_i — лагранжевы множители;

  • xix_i — обучающие точки;

  • Только опорные векторы имеют αi>0α_i > 0.

🔧 Гиперпараметры SVM

  1. C — контроль над зазором vs. ошибками:

    • Высокое значение C: меньше ошибок, модель может переобучаться.

    • Малое значение C: больше ошибок, но лучше обобщает.

  2. Ядро (kernel) — определяет способ преобразования признаков.

  3. Параметры ядра:

    • Для RBF: γ\gamma — ширина гауссианы.

    • Для полиномиального: степень d.

📈 Применение SVM

  • Классификация (бинарная и многоклассовая через One-vs-Rest или One-vs-One).

  • Регрессия (SVR — Support Vector Regression).

  • Обнаружение выбросов (One-Class SVM).

  • Биомедицина, распознавание лиц, текста и др.

⚠ Недостатки SVM

  • Медленно обучается на больших выборках.

  • Не масштабируется так хорошо, как деревья решений или нейронные сети.

  • Зависит от выбора ядра и параметров C и γ.

  • Плохо работает при большом количестве шумов и перекрытий классов.

📘 Пример в Python (scikit-learn)

from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.svm import SVC
X, y = datasets.make_classification(n_samples=100, n_features=2, n_classes=2)
X_train, X_test, y_train, y_test = train_test_split(X, y)
model = SVC(kernel='rbf', C=1.0, gamma='scale')
model.fit(X_train, y_train)
accuracy = model.score(X_test, y_test)

💡 Варианты SVM

  • SVC — классификатор (Support Vector Classifier)

  • SVR — регрессия (Support Vector Regression)

  • LinearSVC — линейная версия, быстрая для больших данных

  • OneClassSVM — для задач новизны и аномалий

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