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

Что такое SVM?

SVM — это модели обучения с учителем, обычно используемые в задачах бинарной классификации. Машина опорных векторов строит гиперплоскость или набор гиперплоскостей в высоком или бесконечномерном пространстве, которые можно использовать для классификации, регрессии или других задач, таких как обнаружение выбросов.

Мы представляем гиперплоскость, используя w’x=0, где w’ означает wтранспонирование. Это уравнение представляет собой линейную систему, в которой x лежит в нулевом пространстве w’. Но для простоты мы будем использовать обозначение w.x+b=0 в качестве нашей гиперплоскости, которая представляет линию в 2D. Здесь вектор w перпендикулярен гиперплоскости.

SVM не только строит гиперплоскость, но и строит оптимальную гиперплоскость, и именно поэтому она более надежна, чем модели логистической регрессии. Какая гиперплоскость является оптимальной гиперплоскостью? большая часть обсуждения будет отвечать на этот вопрос

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

На изображении есть два класса, один из которых представлен кружками, а другой — треугольниками. Каждая точка данных представляет собой n-мерный вектор (в нашем случае двумерный), который представляет собой наблюдение. На изображении точки данных x_1, x_2, x_3 и x_4 являются опорными векторами, поскольку они являются ближайшими векторами к гиперплоскости H_o, и цель состоит в том, чтобы найти гиперплоскость H_o, чтобы WIDTH была максимальной.

Допустим, круглые точки данных отрицательны, а треугольные точки данных положительны. Чтобы вычислить выражение для WIDTH, нам нужно наложить некоторые ограничения:

  1. Между H_1 и H_2 не должно быть точек данных.
  2. Для каждой положительной точки данных x, w.x+b≥1. Для точки данных, присутствующей на H_2, w.x+b=1
  3. Для каждой отрицательной точки данных x, w.x+b≤-1. Для точки данных, которая присутствует на H_1, w.x+b=-1

Давайте введем новую переменную y_i, которая равна 1 для положительных точек данных и -1 для отрицательных точек данных. Теперь мы можем представить уравнения 1 и 2, используя одно выражение y_i(w.x_i+b)≥1.

На изображении выше легко увидеть, что WIDTH равна проекции разности векторов, присутствующих на H_1 и H_2, на единичный вектор. перпендикулярно H_o. Следовательно

WIDTH = (x_3-x_1).(w/||w||) …уравнение 4

ж/||ж|| — единичный вектор, перпендикулярный гиперплоскостям.

мы знаем, что для x_1: w.x_1+b+1=0 …уравнение 5

мы знаем, что для x_3: w.x_3+b-1=0 …уравнение 6

используя уравнения 5 и 6 w.(x_3-x_1)=2,подставляя этот результат в уравнение 4

w*WIDTH=2(w/||w||)

WIDTH=2/||w||

Чтобы увеличить WIDTH, нам нужно минимизировать||w||. Для математического удобства минимизируйте (1/2)(||w||²). Однако эта проблема оптимизации имеет ограничения, поэтому нам нужно использовать множитель Лагранжа, чтобы учесть ограничения.

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

Это математическое выражение подразумевает, что данная оптимизация зависит только от скалярных произведений пар выборочных векторов x_i и x_j.

Реализация на Python

from sklearn.svm import LinearSVC
from sklearn.svm import SVC
from sklearn.preprocessing import StandardScaler

def train_model(X_train,y_train):
    svc=SVC()
    svc.fit(X_train,y_train)
    return svc

Приведенная выше модель функционального поезда принимает обучающие данные и метки в качестве входных данных, SVC — это класс, определенный в пакете sklearn.svm. Функция svc.fit() принимает обучающие примеры и соответствующие метки в качестве входных данных и обучает модель. Теперь, чтобы предсказать значения с помощью модели

clf=train_model(X_train,y_train)
prediction = clf.predict(features)

используя функцию предсказания(), вы можете определить класс конкретного объекта. Здесь функции — это характеристики объекта, класс которого вы хотите идентифицировать. Этот ноутбук jupyter имеет полную реализацию SVM в контексте обнаружения транспортных средств.

Надеюсь, вам понравился этот пост, и вы узнали что-то новое и полезное. Если вы найдете какие-либо недостатки в моем понимании, не стесняйтесь комментировать.

Спасибо за чтение :)