<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://neerc.ifmo.ru/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Egormkn</id>
		<title>Викиконспекты - Вклад участника [ru]</title>
		<link rel="self" type="application/atom+xml" href="http://neerc.ifmo.ru/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Egormkn"/>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%92%D0%BA%D0%BB%D0%B0%D0%B4/Egormkn"/>
		<updated>2026-08-03T23:04:11Z</updated>
		<subtitle>Вклад участника</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%BE%D0%BF%D0%BE%D1%80%D0%BD%D1%8B%D1%85_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2_(SVM)&amp;diff=70751</id>
		<title>Метод опорных векторов (SVM)</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%BE%D0%BF%D0%BE%D1%80%D0%BD%D1%8B%D1%85_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2_(SVM)&amp;diff=70751"/>
				<updated>2019-04-04T21:58:15Z</updated>
		
		<summary type="html">&lt;p&gt;Egormkn: Исправлена ссылка на ядра&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Метод опорных векторов''' (англ. ''support vector machine'', ''SVM'') — один из наиболее популярных методов обучения, который применяется для решения задач классификации и регрессии. Основная идея метода заключается в построении гиперплоскости, разделяющей объекты выборки наиболее оптимальным способом. Алгоритм работает в предположении, что чем больше расстояние (зазор) между разделяющей гиперплоскостью и объектами разделяемых классов, тем меньше будет средняя ошибка классификатора.&lt;br /&gt;
&lt;br /&gt;
== Метод опорных векторов в задаче классификации ==&lt;br /&gt;
&lt;br /&gt;
Рассмотрим задачу бинарной классификации, в которой объектам из $X=\mathbb{R}^n$ соответствует один из двух классов $Y = \{-1, +1\}$.&lt;br /&gt;
&lt;br /&gt;
Пусть задана обучающая выборка пар &amp;quot;объект-ответ&amp;quot;: $T^\ell = (\vec{x}_i, y_i)_{i=1}^\ell$. Необходимо построить алгоритм классификации $a(\vec{x}) : X \to Y$.&lt;br /&gt;
&lt;br /&gt;
=== Разделяющая гиперплоскость ===&lt;br /&gt;
&lt;br /&gt;
[[Файл:svm_hyperplane.png|300px|thumb|right|Примеры разделяющих гиперплоскостей в $\mathbb{R}^2$]]&lt;br /&gt;
&lt;br /&gt;
В пространстве $\mathbb{R}^n$ уравнение $\langle \vec{w}, \vec{x} \rangle - b = 0$ при заданных $\vec{w}$ и $b$ определяет гиперплоскость — множество векторов $\vec{x} = (x_1, \ldots, x_n)$, принадлежащих пространству меньшей размерности $\mathbb{R}^{n-1}$. Например, для $\mathbb{R}^1$ гиперплоскостью является точка, для $\mathbb{R}^2$ — прямая, для $\mathbb{R}^3$ — плоскость и т.д. Параметр $\vec{w}$ определяет вектор нормали к гиперплоскости, а через $\frac{b}{\lVert \vec{w} \rVert}$ выражается расстояние от гиперплоскости до начала координат.&lt;br /&gt;
&lt;br /&gt;
Гиперплоскость делит $\mathbb{R}^n$ на два полупространства: $\langle \vec{w}, \vec{x} \rangle - b &amp;gt; 0$ и $\langle \vec{w}, \vec{x} \rangle - b &amp;lt; 0$. &lt;br /&gt;
&lt;br /&gt;
Говорят, что гиперплоскость разделяет два класса $C_1$ и $C_2$, если объекты этих классов лежат по разные стороны от гиперплоскости, то есть выполнено либо&lt;br /&gt;
&lt;br /&gt;
$\begin{cases}\langle \vec{w}, \vec{x} \rangle - b &amp;gt; 0, &amp;amp;&amp;amp; \forall x \in C_1 \\ \langle \vec{w}, \vec{x} \rangle - b &amp;lt; 0, &amp;amp;&amp;amp; \forall x \in C_2\end{cases}$&lt;br /&gt;
&lt;br /&gt;
либо&lt;br /&gt;
&lt;br /&gt;
$\begin{cases}\langle \vec{w}, \vec{x} \rangle - b &amp;lt; 0, &amp;amp;&amp;amp; \forall x \in C_1 \\ \langle \vec{w}, \vec{x} \rangle - b &amp;gt; 0, &amp;amp;&amp;amp; \forall x \in C_2\end{cases}$&lt;br /&gt;
&lt;br /&gt;
=== Линейно разделимая выборка ===&lt;br /&gt;
&lt;br /&gt;
Пусть выборка линейно разделима, то есть существует некоторая гиперплоскость, разделяющая классы $-1$ и $+1$. Тогда в качестве алгоритма классификации можно использовать линейный пороговый классификатор:&lt;br /&gt;
&lt;br /&gt;
$a(\vec{x}) = sign(\langle \vec{w}, \vec{x} \rangle - b) = sign\left(\sum\limits_{i=1}^\ell w_i x_i - b\right)$&lt;br /&gt;
&lt;br /&gt;
где $\vec{x} = (x_1, \ldots, x_n)$ — вектор значений признаков объекта, а $\vec{w} = (w_1, \ldots, w_n) \in \mathbb{R}^n$ и $b \in \mathbb{R}$ — параметры гиперплоскости.&lt;br /&gt;
&lt;br /&gt;
Но для двух линейно разделимых классов возможны различные варианты построения разделяющих гиперплоскостей. Метод опорных векторов выбирает ту гиперплоскость, которая максимизирует отступ между классами:&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
'''Отступ''' (англ. ''margin'') — характеристика, оценивающая, насколько объект &amp;quot;погружён&amp;quot; в свой класс, насколько типичным представителем класса он является. Чем меньше значение отступа $M_i$, тем ближе объект $\vec{x}_i$ подходит к границе классов и тем выше становится вероятность ошибки. Отступ $M_i$ отрицателен тогда и только тогда, когда алгоритм $a(x)$ допускает ошибку на объекте $\vec{x}_i$. &amp;lt;br&amp;gt;&amp;lt;br&amp;gt; Для линейного классификатора отступ определяется уравнением: $M_i(\vec{w}, b) = y_i(\langle \vec{w}, \vec{x}_i \rangle - b)$&lt;br /&gt;
}}&lt;br /&gt;
Если выборка линейно разделима, то существует такая гиперплоскость, отступ от которой до каждого объекта положителен:&lt;br /&gt;
&lt;br /&gt;
$\exists \vec{w}, b : \; M_i(\vec{w}, b) = y_i(\langle \vec{w}, \vec{x}_i \rangle - b) &amp;gt; 0, \; i = 1\ldots\ell$&lt;br /&gt;
&lt;br /&gt;
Мы хотим построить такую разделяющую гиперплоскость, чтобы объекты обучающей выборки находились на наибольшем расстоянии от неё.&lt;br /&gt;
&lt;br /&gt;
[[Файл:SVM_margin.png|300px|thumb|right|Оптимальная разделяющая гиперплоскость в $\mathbb{R}^2$]]&lt;br /&gt;
Заметим, что при умножении $\vec{w}$ и $b$ на константу $c \neq 0$ уравнение $\langle c\vec{w}, \vec{x} \rangle - cb = 0$ определяет ту же самую гиперплоскость, что и $\langle \vec{w}, \vec{x} \rangle - b = 0$. Для удобства проведём нормировку: выберем константу $c$ таким образом, чтобы $\min M_i(\vec{w}, b) = 1$. При этом в каждом из двух классов найдётся хотя бы один &amp;quot;граничный&amp;quot; объект обучающей выборки, отступ которого равен этому минимуму: иначе можно было бы сместить гиперплоскость в сторону класса с большим отступом, тем самым увеличив минимальное расстояние от гиперплоскости до объектов обучающей выборки. &lt;br /&gt;
&lt;br /&gt;
Обозначим любой &amp;quot;граничный&amp;quot; объект из класса $+1$ как $\vec{x}_+$, из класса $-1$ как $\vec{x}_-$. Их отступ равен единице, то есть&lt;br /&gt;
&lt;br /&gt;
$\begin{cases}&lt;br /&gt;
M_+(\vec{w}, b) = (+1)(\langle \vec{w}, \vec{x}_+ \rangle - b) = 1 \\&lt;br /&gt;
M_-(\vec{w}, b) = (-1)(\langle \vec{w}, \vec{x}_- \rangle - b) = 1&lt;br /&gt;
\end{cases}$&lt;br /&gt;
&lt;br /&gt;
Нормировка позволяет ограничить разделяющую полосу между классами: $\{x: -1 &amp;lt; \langle \vec{w}, \vec{x}_i \rangle - b &amp;lt; 1\}$. Внутри неё не может лежать ни один объект обучающей выборки. Ширину разделяющей полосы можно выразить как проекцию вектора $\vec{x}_+ - \vec{x}_-$ на нормаль к гиперплоскости $\vec{w}$. Чтобы разделяющая гиперплоскость находилась на наибольшем расстоянии от точек выборки, ширина полосы должна быть максимальной: &lt;br /&gt;
&lt;br /&gt;
$\frac{\langle \vec{x}_+ - \vec{x}_-, \vec{w} \rangle}{\lVert w \rVert} = \frac{\langle \vec{x}_+, \vec{w} \rangle - \langle \vec{x}_-, \vec{w} \rangle - b + b}{\lVert w \rVert} = \frac{(+1)\left(\langle \vec{x}_+, \vec{w} \rangle - b\right) \, + \, (-1)\left(\langle \vec{x}_-, \vec{w} \rangle - b\right)}{\lVert w \rVert} = \\ = \frac{M_+(\vec{w}, b) \, + \, M_-(\vec{w}, b)}{\lVert w \rVert} = \frac{2}{\lVert w \rVert} \to \max \; \Rightarrow \; \lVert w \rVert \to \min$&lt;br /&gt;
&lt;br /&gt;
Это приводит нас к постановке задачи оптимизации в терминах квадратичного программирования:&lt;br /&gt;
&lt;br /&gt;
$\begin{cases}&lt;br /&gt;
\lVert \vec{w} \rVert^2 \to \min\limits_{w,b} \\&lt;br /&gt;
M_i(\vec{w}, b) \geq 1, \quad i = 1, \ldots, \ell&lt;br /&gt;
\end{cases}$&lt;br /&gt;
&lt;br /&gt;
=== Линейно неразделимая выборка ===&lt;br /&gt;
&lt;br /&gt;
На практике линейно разделимые выборки практически не встречаются: в данных возможны выбросы и нечёткие границы между классами. В таком случае поставленная выше задача не имеет решений, и необходимо ослабить ограничения, позволив некоторым объектам попадать на &amp;quot;территорию&amp;quot; другого класса. Для каждого объекта отнимем от отступа некоторую положительную величину $\xi_i$, но потребуем чтобы эти введённые поправки были минимальны. Это приведёт к следующей постановке задачи, называемой также ''SVM с мягким отступом'' (англ. ''soft-margin SVM''):&lt;br /&gt;
&lt;br /&gt;
$\begin{cases}&lt;br /&gt;
\frac{1}{2} \lVert \vec{w} \rVert^2 \color{brown}{+ C \sum\limits_{i=1}^\ell \xi_i} \to \min\limits_{w, b, \color{brown}{\xi}} \\&lt;br /&gt;
M_i(\vec{w}, b) \geq 1 \color{brown}{- \xi_i}, \quad i = 1, \ldots, \ell \\&lt;br /&gt;
\color{brown}{\xi_i \geq 0, \quad i = 1, \ldots, \ell} \\&lt;br /&gt;
\end{cases}$&lt;br /&gt;
&lt;br /&gt;
Мы не знаем, какой из функционалов $\frac{1}{2} \lVert \vec{w} \rVert^2$ и $\sum\limits_{i=1}^\ell \xi_i$ важнее, поэтому вводим коэффициент $C$, который будем оптимизировать с помощью кросс-валидации. В итоге мы получили задачу, у которой всегда есть единственное решение.&lt;br /&gt;
&lt;br /&gt;
Заметим, что мы можем упростить постановку задачи:&lt;br /&gt;
&lt;br /&gt;
$\begin{cases}&lt;br /&gt;
\xi_i \geq 0 \\&lt;br /&gt;
\xi_i \geq 1 - M_i(\vec{w}, b) \\&lt;br /&gt;
\sum\limits_{i=1}^\ell \xi_i \to \min&lt;br /&gt;
\end{cases} &lt;br /&gt;
\,\Rightarrow\,&lt;br /&gt;
\begin{cases} &lt;br /&gt;
\xi_i \geq \max(0, 1 - M_i(\vec{w}, b)) \\&lt;br /&gt;
\sum\limits_{i=1}^\ell \xi_i \to \min&lt;br /&gt;
\end{cases}&lt;br /&gt;
\,\Rightarrow\,&lt;br /&gt;
\xi_i = (1- M_i(\vec{w}, b))_+$&lt;br /&gt;
&lt;br /&gt;
Получим эквивалентную задачу безусловной минимизации:&lt;br /&gt;
&lt;br /&gt;
$\frac{1}{2} \lVert \vec{w} \rVert^2 + C \sum\limits_{i=1}^\ell \left(1 - M_i(\vec{w}, b)\right)_+ \to \min\limits_{w, b}$&lt;br /&gt;
&lt;br /&gt;
Теперь научимся её решать.&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|id=kkt&lt;br /&gt;
|author=Условия Каруша—Куна—Таккера&lt;br /&gt;
|statement=&lt;br /&gt;
Пусть поставлена задача нелинейного программирования с ограничениями:&lt;br /&gt;
$$&lt;br /&gt;
\begin{cases}&lt;br /&gt;
f(x) \to \min\limits_{x \in X} \\&lt;br /&gt;
g_i(x) \leq 0,\;i=1\ldots m \\&lt;br /&gt;
h_j(x) = 0,\;j=1\ldots k&lt;br /&gt;
\end{cases}&lt;br /&gt;
$$&lt;br /&gt;
&lt;br /&gt;
Если $x$ — точка локального минимума при наложенных ограничениях, то существуют такие множители $\mu_i, i = 1\ldots m$, $\;\lambda_j, j = 1\ldots k$, что для функции Лагранжа $L(x; \mu, \lambda)$ выполняются условия:&lt;br /&gt;
&lt;br /&gt;
$$\begin{cases}\frac{\partial L}{\partial x} = 0, \quad L(x; \mu, \lambda) = f(x) + \sum\limits_{i=1}^m \mu_i g_i(x) + \sum\limits_{j=1}^k \lambda_j h_j(x) \\ g_i(x) \leq 0,\;h_j(x) = 0 \quad \text{(исходные ограничения)} \\ \mu_i \geq 0 \quad \text{(двойственные ограничения)} \\ \mu_i g_i(x) = 0 \quad \text{(условие дополняющей нежёсткости)} \end{cases}$$&lt;br /&gt;
&lt;br /&gt;
При этом искомая точка является седловой точкой функции Лагранжа: минимумом по $x$ и максимумом по двойственным переменным $\mu$.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
По теореме Каруша—Куна—Таккера, поставленная нами задача минимизации эквивалентна двойственной задаче поиска седловой точки функции Лагранжа:&lt;br /&gt;
&lt;br /&gt;
$\mathscr{L}(\vec{w},b,\xi; \lambda, \eta) = \frac{1}{2} \lVert w \rVert^2 - \sum\limits_{i=1}^\ell \lambda_i \left(M_i(\vec{w}, b) - 1\right) - \sum\limits_{i=1}^\ell \xi_i \left(\lambda_i + \eta_i - C\right)$&lt;br /&gt;
&lt;br /&gt;
$\lambda_i$ — переменные, двойственные к ограничениям $M_i \geq 1 - \xi_i$&lt;br /&gt;
&lt;br /&gt;
$\eta_i$ — переменные, двойственные к ограничениям $\xi_i \geq 0$&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Запишем необходимые условия седловой точки функции Лагранжа:&lt;br /&gt;
&lt;br /&gt;
$\begin{cases}&lt;br /&gt;
\frac{\partial \mathscr{L}}{\partial w} = 0, \quad \frac{\partial \mathscr{L}}{\partial b} = 0, \quad \frac{\partial \mathscr{L}}{\partial \xi} = 0 \\&lt;br /&gt;
\xi_i \geq 0, \quad \lambda_i \geq 0, \quad \eta_i \geq 0, &amp;amp;&amp;amp; i = 1, \ldots, \ell \\&lt;br /&gt;
\lambda_i = 0 \;\text{либо}\; M_i(\vec{w},b) = 1 - \xi_i, &amp;amp;&amp;amp; i = 1, \ldots, \ell \\&lt;br /&gt;
\eta_i = 0 \;\text{либо}\; \xi_i = 0, &amp;amp;&amp;amp; i = 1, \ldots, \ell&lt;br /&gt;
\end{cases}$&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Продифференцируем функцию Лагранжа и приравняем к нулю производные. Получим следующие ограничения:&lt;br /&gt;
&lt;br /&gt;
$\begin{array}{lcl}&lt;br /&gt;
\frac{\partial \mathscr{L}}{\partial w} = \vec{w} - \sum\limits_{i=1}^\ell \lambda_i y_i \vec{x}_i = 0 &amp;amp; \Rightarrow &amp;amp; \vec{w} = \sum\limits_{i=1}^\ell \lambda_i y_i \vec{x}_i \\&lt;br /&gt;
\frac{\partial \mathscr{L}}{\partial b} = -\sum\limits_{i=1}^\ell \lambda_i y_i = 0 &amp;amp; \Rightarrow &amp;amp; \sum\limits_{i=1}^\ell \lambda_i y_i = 0 \\&lt;br /&gt;
\frac{\partial \mathscr{L}}{\partial \xi_i} = -\lambda_i - \eta_i + C = 0 &amp;amp; \Rightarrow &amp;amp; \eta_i + \lambda_i = C, \quad i = 1, \ldots, \ell&lt;br /&gt;
\end{array}$&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Заметим, что $\eta_i \geq 0$, $\lambda_i \geq 0$, $C &amp;gt; 0$, поэтому из последнего ограничения получаем $0 \leq \eta_i \leq C$, $0 \leq \lambda_i \leq C$. &lt;br /&gt;
&lt;br /&gt;
Диапазон значений $\lambda_i$ (которые, как указано выше, соответствуют ограничениям на величину отступа) позволяет нам разделить объекты обучающей выборки на три типа:&lt;br /&gt;
&lt;br /&gt;
# $\lambda_i = 0 \; \Rightarrow \; \eta_i = C; \; \xi_i = 0; \; M_i \geq 1 \;$ — периферийные (неинформативные) объекты &amp;lt;br&amp;gt; Эти объекты лежат в своём классе, классифицируются верно и не влияют на выбор разделяющей гиперплоскости (см. уравнение для $\vec{w}$)&lt;br /&gt;
# $0 &amp;lt; \lambda_i &amp;lt; C \; \Rightarrow \; 0 &amp;lt; \eta_i &amp;lt; C; \; \xi_i = 0; \; M_i = 1 \;$ — опорные граничные объекты &amp;lt;br&amp;gt; Эти объекты лежат ровно на границе разделяющей полосы на стороне своего класса&lt;br /&gt;
# $\lambda_i = C \; \Rightarrow \; \eta_i = 0; \; \xi_i &amp;gt; 0; \; M_i &amp;lt; 1 \;$ — опорные объекты-нарушители &amp;lt;br&amp;gt; Эти объекты лежат внутри разделяющей полосы или на стороне чужого класса&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
'''Опорный объект''' (опорный вектор, англ. ''support vector'') — объект $\vec{x}_i$, соответствующий которому множитель Лагранжа отличен от нуля: $\lambda_i \neq 0$.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Теперь подставим ограничения, которые мы получили при дифференцировании, в функцию Лагранжа. Получим следующую постановку двойственной задачи, которая зависит только от двойственных переменных $\lambda$:&lt;br /&gt;
&lt;br /&gt;
$\begin{cases}&lt;br /&gt;
-\mathscr{L}(\lambda) = -\sum\limits_{i=1}^\ell \lambda_i + \frac{1}{2} \sum\limits_{i=1}^\ell \sum\limits_{j=1}^\ell \lambda_i \lambda_j y_i y_j \langle \vec{x}_i, \vec{x}_j \rangle \to \min\limits_\lambda \\&lt;br /&gt;
0 \leq \lambda_i \leq C, \quad i = 1, \ldots, \ell \\&lt;br /&gt;
\sum\limits_{i=1}^\ell \lambda_i y_i = 0&lt;br /&gt;
\end{cases}$&lt;br /&gt;
&lt;br /&gt;
Это также задача квадратичного программирования. Решение задачи лежит в пересечении $\ell$-мерного куба с ребром $C$ и гиперплоскости $\langle \lambda, y \rangle = 0$, что является выпуклым многогранником размерности $\ell-1$. В этом многограннике нужно найти минимум выпуклого квадратичного функционала. Следовательно, данная задача имеет единственное решение.&lt;br /&gt;
&lt;br /&gt;
Существуют различные методы поиска решения: можно воспользоваться универсальным солвером задачи квадратичного программирования ([https://www.ibm.com/analytics/cplex-optimizer CPLEX], [http://www.gurobi.com/ Gurobi]), либо алгоритмом, учитывающим специфические особенности SVM ([https://www.microsoft.com/en-us/research/publication/sequential-minimal-optimization-a-fast-algorithm-for-training-support-vector-machines/ SMO], [http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.10.9956 INCAS]).&lt;br /&gt;
&lt;br /&gt;
После того, как мы получили вектор коэффициентов $\vec{\lambda}$, можем выразить решение прямой задачи через решение двойственной:&lt;br /&gt;
&lt;br /&gt;
$\begin{cases}&lt;br /&gt;
\vec{w} = \sum\limits_{i=1}^\ell \lambda_i y_i \vec{x}_i \\&lt;br /&gt;
b = \langle \vec{w}, \vec{x}_i \rangle - y_i, \quad \forall i: \lambda_i &amp;gt; 0, M_i = 1&lt;br /&gt;
\end{cases}$&lt;br /&gt;
&lt;br /&gt;
На практике для повышения вычислительной устойчивости рекомендуется при расчёте $b$ брать медиану по опорным граничным объектам:&lt;br /&gt;
&lt;br /&gt;
$b = med\{ \langle \vec{w}, \vec{x}_i \rangle - y_i : \lambda_i &amp;gt; 0, M_i = 1, i = 1, \ldots, \ell\}$&lt;br /&gt;
&lt;br /&gt;
Теперь можем переписать наш линейный классификатор, выразив $\vec{w}$ через $\vec{\lambda}$:&lt;br /&gt;
&lt;br /&gt;
$a(x) = sign \left(\sum\limits_{i=1}^\ell \lambda_i y_i \langle \vec{x}_i, \vec{x} \rangle - b\right)$&lt;br /&gt;
&lt;br /&gt;
=== Нелинейное обобщение, kernel trick ===&lt;br /&gt;
&lt;br /&gt;
Существует ещё один подход к решению проблемы линейной разделимости, известный как трюк с ядром (kernel trick). Если выборка объектов с признаковым описанием из $X = \mathbb{R}^n$ не является линейно разделимой, мы можем предположить, что существует некоторое пространство $H$, вероятно, большей размерности, при переходе в которое выборка станет линейно разделимой. Пространство $H$ здесь называют спрямляющим, а функцию перехода $\psi : X \to H$ — спрямляющим отображением. Построение SVM в таком случае происходит так же, как и раньше, но в качестве векторов признаковых описаний используются векторы $\psi(\vec{x})$, а не $\vec{x}$. Соответственно, скалярное произведение $\langle \vec{x}_1, \vec{x}_2 \rangle$ в пространстве $X$ везде заменяется скалярным произведением $\langle \psi(\vec{x}_1), \psi(\vec{x}_2) \rangle$ в пространстве $H$. Отсюда следует, что пространство $H$ должно быть гильбертовым, так как в нём должно быть определено скалярное произведение.&lt;br /&gt;
&lt;br /&gt;
Обратим внимание на то, что постановка задачи и алгоритм классификации не используют в явном виде признаковое описание и оперируют только скалярными произведениями признаков объектов. Это даёт возможность заменить скалярное произведение в пространстве $X$ на [[Ядра|ядро]] — функцию, являющуюся скалярным произведением в некотором $H$. При этом можно вообще не строить спрямляющее пространство в явном виде, и вместо подбора $\psi$ подбирать непосредственно ядро. &lt;br /&gt;
&lt;br /&gt;
Постановка задачи с применением ядер приобретает вид:&lt;br /&gt;
&lt;br /&gt;
$\begin{cases}&lt;br /&gt;
-\mathscr{L}(\lambda) = -\sum\limits_{i=1}^\ell \lambda_i + \frac{1}{2} \sum\limits_{i=1}^\ell \sum\limits_{j=1}^\ell \lambda_i \lambda_j y_i y_j \color{brown}{K(\vec{x}_i, \vec{x}_j)} \to \min\limits_\lambda \\&lt;br /&gt;
0 \leq \lambda_i \leq C, \quad i = 1, \ldots, \ell \\&lt;br /&gt;
\sum\limits_{i=1}^\ell \lambda_i y_i = 0&lt;br /&gt;
\end{cases}$&lt;br /&gt;
&lt;br /&gt;
$a(x) = sign \left(\sum\limits_{i=1}^\ell \lambda_i y_i \color{brown}{K(\vec{x}_i, \vec{x})} - b\right)$&lt;br /&gt;
&lt;br /&gt;
== Преимущества и недостатки SVM ==&lt;br /&gt;
&lt;br /&gt;
Преимущества SVM перед методом стохастического градиента и нейронными сетями:&lt;br /&gt;
&lt;br /&gt;
* Задача выпуклого квадратичного программирования хорошо изучена и имеет единственное решение.&lt;br /&gt;
* Метод опорных векторов эквивалентен двухслойной нейронной сети, где число нейронов на скрытом слое определяется автоматически как число опорных векторов.&lt;br /&gt;
* Принцип оптимальной разделяющей гиперплоскости приводит к максимизации ширины разделяющей полосы, а следовательно, к более уверенной классификации.&lt;br /&gt;
&lt;br /&gt;
Недостатки классического SVM:&lt;br /&gt;
&lt;br /&gt;
* Неустойчивость к шуму: выбросы в исходных данных становятся опорными объектами-нарушителями и напрямую влияют на построение разделяющей гиперплоскости.&lt;br /&gt;
* Не описаны общие методы построения ядер и спрямляющих пространств, наиболее подходящих для конкретной задачи.&lt;br /&gt;
* Нет отбора признаков.&lt;br /&gt;
* Необходимо подбирать константу $C$ при помощи кросс-валидации.&lt;br /&gt;
&lt;br /&gt;
== Модификации ==&lt;br /&gt;
&lt;br /&gt;
Существуют различные дополнения и модификации метода опорных векторов, направленные на устранение описанных недостатков:&lt;br /&gt;
&lt;br /&gt;
* [http://jmlr.csail.mit.edu/papers/v1/tipping01a.html Метод релевантных векторов (Relevance Vector Machine, RVM)]&lt;br /&gt;
* [https://papers.nips.cc/paper/2450-1-norm-support-vector-machines.pdf 1-norm SVM (LASSO SVM)]&lt;br /&gt;
* [http://www3.stat.sinica.edu.tw/statistica/oldpdf/A16n214.pdf Doubly Regularized SVM (ElasticNet SVM)]&lt;br /&gt;
* [https://arxiv.org/abs/1901.09643v1 Support Features Machine (SFM)]&lt;br /&gt;
* [http://www.robots.ox.ac.uk/~minhhoai/papers/SVMFeatureWeight_PR.pdf Relevance Features Machine (RFM)]&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
* [[Общие понятия]]&lt;br /&gt;
* [[Ядра]]&lt;br /&gt;
* [[Обзор библиотек для машинного обучения на Python]]&lt;br /&gt;
&lt;br /&gt;
== Примечания ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
* [http://www.machinelearning.ru/wiki/index.php?title=%D0%9C%D0%B0%D1%88%D0%B8%D0%BD%D0%B0_%D0%BE%D0%BF%D0%BE%D1%80%D0%BD%D1%8B%D1%85_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2 machinelearning.ru — Машина опорных векторов]&lt;br /&gt;
* [https://www.youtube.com/watch?v=Adi67_94_gc&amp;amp;list=PLJOzdkh8T5kp99tGTEFjH_b9zqEQiiBtC&amp;amp;index=5 Лекция &amp;quot;Линейные методы классификации: метод опорных векторов&amp;quot;]  — К.В. Воронцов, курс &amp;quot;Машинное обучение&amp;quot; 2014&lt;br /&gt;
* [https://ru.wikipedia.org/wiki/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%BE%D0%BF%D0%BE%D1%80%D0%BD%D1%8B%D1%85_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2 Wikipedia — Метод опорных векторов]&lt;br /&gt;
* Alexey Nefedov — [https://svmtutorial.online/ Support Vector Machines: A Simple Tutorial]&lt;br /&gt;
* John Platt — [https://www.microsoft.com/en-us/research/publication/sequential-minimal-optimization-a-fast-algorithm-for-training-support-vector-machines/ Sequential Minimal Optimization: A Fast Algorithm for Training Support Vector Machines]&lt;br /&gt;
* Shai Fine, Katya Scheinberg — [http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.10.9956 INCAS: An Incremental Active Set Method for SVM]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Машинное обучение]]&lt;br /&gt;
[[Категория: Классификация]]&lt;br /&gt;
[[Категория: Регрессия]]&lt;/div&gt;</summary>
		<author><name>Egormkn</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%AF%D0%B4%D1%80%D0%B0&amp;diff=70750</id>
		<title>Ядра</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%AF%D0%B4%D1%80%D0%B0&amp;diff=70750"/>
				<updated>2019-04-04T21:56:45Z</updated>
		
		<summary type="html">&lt;p&gt;Egormkn: Оформлено определение&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
'''Ядро''' (англ. ''kernel'') — функция $K: X \times X \to \mathbb{R}$, которая является скалярным произведением в некотором спрямляющем пространстве: $K(\vec{x}_1, \vec{x}_2) = \langle \psi(\vec{x}_1), \psi(\vec{x}_2) \rangle$ при некотором $\psi : X \to H$, где $H$ — пространство со скалярным произведением.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Выбор ядра ==&lt;br /&gt;
&lt;br /&gt;
Теорема Мерсера определяет условия, при которых функция может являться ядром:&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|id=kernel&lt;br /&gt;
|author=Мерсер&lt;br /&gt;
|statement=&lt;br /&gt;
Функция $K(\vec{x}_1, \vec{x}_2)$ является ядром тогда и только тогда, когда выполнены условия: &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
$\begin{cases}K(\vec{x}_1, \vec{x}_2) = K(\vec{x}_2, \vec{x}_1) &amp;amp; \text{(симметричность)} \\[1ex] \forall g: X \to \mathbb{R} \quad \int\limits_X \int\limits_X K(\vec{x}_1, \vec{x}_2) g(\vec{x}_1) g(\vec{x}_2) d \vec{x}_1 d \vec{x}_2 \geq 0 &amp;amp; \text{(неотрицательная определенность)}\end{cases}$&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Проверка неотрицательной определённости является довольно трудоёмкой, поэтому на практике теорема явно не используется. Проблема выбора лучшего ядра на сегодняшний день остаётся открытой, лучшие из известных на данный момент решений основываются на генетических алгоритмах&amp;lt;ref&amp;gt;[https://www.researchgate.net/publication/221080223_An_Evolutionary_Approach_to_Automatic_Kernel_Construction T.Howley, M.G.Madden — An Evolutionary Approach to Automatic Kernel Construction]&amp;lt;/ref&amp;gt;). Обычно в практических реализациях ограничиваются перебором нескольких функций, про которые известно, что они являются ядрами, и выбирают среди них лучшую при помощи кросс-валидации. Кроме того, существуют правила порождения ядер, которые также применяются для расширения пространства перебираемых функций.&lt;br /&gt;
&lt;br /&gt;
== Конструктивные методы синтеза ядер ==&lt;br /&gt;
&lt;br /&gt;
В целях достижения большей гибкости, и как следствие, более точных результатов, простые ядра могут быть объединены в более сложные функции, которые также будут являться ядром. Для этого используются следующие методы синтеза ядер:&lt;br /&gt;
&lt;br /&gt;
# $K(\vec{x}_1, \vec{x}_2) = \langle \vec{x}_1, \vec{x}_2 \rangle \quad$ (скалярное произведение)&lt;br /&gt;
# $K(\vec{x}_1, \vec{x}_2) = \alpha \quad$ (константа $\alpha \in \mathbb{R}_+$)&lt;br /&gt;
# $K(\vec{x}_1, \vec{x}_2) = K_1(\vec{x}_1, \vec{x}_2) + K_2(\vec{x}_1, \vec{x}_2) \quad$ (сумма ядер)&lt;br /&gt;
# $K(\vec{x}_1, \vec{x}_2) = K_1(\vec{x}_1, \vec{x}_2) * K_2(\vec{x}_1, \vec{x}_2) \quad$ (произведение ядер)&lt;br /&gt;
# $K(\vec{x}_1, \vec{x}_2) = \psi(\vec{x}_1) * \psi(\vec{x}_2) \quad$ (произведение функций $\psi : X \to \mathbb{R}$)&lt;br /&gt;
# $K(\vec{x}_1, \vec{x}_2) = K_1(\phi(\vec{x}_1), \phi(\vec{x}_2)) \quad$ (композиция ядра и функции $\phi : X \to X$)&lt;br /&gt;
# $K(\vec{x}_1, \vec{x}_2) = \int\limits_X s(\vec{x}_1, \vec{z}) s(\vec{x}_2, \vec{z}) d \vec{z} \quad$ ($s : X \times X \to \mathbb{R}$ — симметричная интегрируемая функция)&lt;br /&gt;
# $K(\vec{x}_1, \vec{x}_2) = f(K_1(\vec{x}_1, \vec{x}_2)) \quad$ ($f: \mathbb{R} \to \mathbb{R}$ представима в виде сходящегося степенного ряда с неотрицательными коэффициентами)&lt;br /&gt;
&lt;br /&gt;
== Стандартные ядра ==&lt;br /&gt;
&lt;br /&gt;
Существует несколько &amp;quot;стандартных&amp;quot; ядер, которые соответствуют известным алгоритмам классификации:&lt;br /&gt;
&lt;br /&gt;
* $K(\vec{x}_1, \vec{x}_2) = (\langle \vec{x}_1, \vec{x}_2 \rangle + c)^d, \quad c, d \in \mathbb{R}$ — полиномиальное ядро&lt;br /&gt;
* $K(\vec{x}_1, \vec{x}_2) = \sigma(\langle \vec{x}_1, \vec{x}_2 \rangle)$ — нейросеть с заданной функцией активации $\sigma(z)$ (не при всех $\sigma$ является ядром)&lt;br /&gt;
* $K(\vec{x}_1, \vec{x}_2) = \exp(-\beta \lVert \vec{x}_1 - \vec{x}_2 \rVert^2)$ — сеть радиальных базисных функций (англ. ''RBF'')&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
* [[Метод опорных векторов (SVM)]]&lt;br /&gt;
&lt;br /&gt;
== Примечания ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
* [http://www.machinelearning.ru/wiki/index.php?title=%D0%9C%D0%B0%D1%88%D0%B8%D0%BD%D0%B0_%D0%BE%D0%BF%D0%BE%D1%80%D0%BD%D1%8B%D1%85_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2 machinelearning.ru — Машина опорных векторов]&lt;br /&gt;
* [https://www.youtube.com/watch?v=Adi67_94_gc&amp;amp;list=PLJOzdkh8T5kp99tGTEFjH_b9zqEQiiBtC&amp;amp;index=5 Лекция &amp;quot;Линейные методы классификации: метод опорных векторов&amp;quot;]  — К.В. Воронцов, курс &amp;quot;Машинное обучение&amp;quot; 2014&lt;br /&gt;
&lt;br /&gt;
[[Категория: Машинное обучение]]&lt;br /&gt;
[[Категория: Классификация]]&lt;br /&gt;
[[Категория: Регрессия]]&lt;/div&gt;</summary>
		<author><name>Egormkn</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%AF%D0%B4%D1%80%D0%B0&amp;diff=70748</id>
		<title>Ядра</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%AF%D0%B4%D1%80%D0%B0&amp;diff=70748"/>
				<updated>2019-04-04T21:43:53Z</updated>
		
		<summary type="html">&lt;p&gt;Egormkn: Первая версия конспекта&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Ядро''' (англ. ''kernel'') — функция $K: X \times X \to \mathbb{R}$, которая является скалярным произведением в некотором спрямляющем пространстве: $K(\vec{x}_1, \vec{x}_2) = \langle \psi(\vec{x}_1), \psi(\vec{x}_2) \rangle$ при некотором $\psi : X \to H$, где $H$ — пространство со скалярным произведением.&lt;br /&gt;
&lt;br /&gt;
== Выбор ядра ==&lt;br /&gt;
&lt;br /&gt;
Теорема Мерсера определяет условия, при которых функция может являться ядром:&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|id=kernel&lt;br /&gt;
|author=Мерсер&lt;br /&gt;
|statement=&lt;br /&gt;
Функция $K(\vec{x}_1, \vec{x}_2)$ является ядром тогда и только тогда, когда выполнены условия: &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
$\begin{cases}K(\vec{x}_1, \vec{x}_2) = K(\vec{x}_2, \vec{x}_1) &amp;amp; \text{(симметричность)} \\[1ex] \forall g: X \to \mathbb{R} \quad \int\limits_X \int\limits_X K(\vec{x}_1, \vec{x}_2) g(\vec{x}_1) g(\vec{x}_2) d \vec{x}_1 d \vec{x}_2 \geq 0 &amp;amp; \text{(неотрицательная определенность)}\end{cases}$&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Проверка неотрицательной определённости является довольно трудоёмкой, поэтому на практике теорема явно не используется. Проблема выбора лучшего ядра на сегодняшний день остаётся открытой, лучшие из известных на данный момент решений основываются на генетических алгоритмах&amp;lt;ref&amp;gt;[https://www.researchgate.net/publication/221080223_An_Evolutionary_Approach_to_Automatic_Kernel_Construction T.Howley, M.G.Madden — An Evolutionary Approach to Automatic Kernel Construction]&amp;lt;/ref&amp;gt;). Обычно в практических реализациях ограничиваются перебором нескольких функций, про которые известно, что они являются ядрами, и выбирают среди них лучшую при помощи кросс-валидации. Кроме того, существуют правила порождения ядер, которые также применяются для расширения пространства перебираемых функций.&lt;br /&gt;
&lt;br /&gt;
== Конструктивные методы синтеза ядер ==&lt;br /&gt;
&lt;br /&gt;
В целях достижения большей гибкости, и как следствие, более точных результатов, простые ядра могут быть объединены в более сложные функции, которые также будут являться ядром. Для этого используются следующие методы синтеза ядер:&lt;br /&gt;
&lt;br /&gt;
# $K(\vec{x}_1, \vec{x}_2) = \langle \vec{x}_1, \vec{x}_2 \rangle \quad$ (скалярное произведение)&lt;br /&gt;
# $K(\vec{x}_1, \vec{x}_2) = \alpha \quad$ (константа $\alpha \in \mathbb{R}_+$)&lt;br /&gt;
# $K(\vec{x}_1, \vec{x}_2) = K_1(\vec{x}_1, \vec{x}_2) + K_2(\vec{x}_1, \vec{x}_2) \quad$ (сумма ядер)&lt;br /&gt;
# $K(\vec{x}_1, \vec{x}_2) = K_1(\vec{x}_1, \vec{x}_2) * K_2(\vec{x}_1, \vec{x}_2) \quad$ (произведение ядер)&lt;br /&gt;
# $K(\vec{x}_1, \vec{x}_2) = \psi(\vec{x}_1) * \psi(\vec{x}_2) \quad$ (произведение функций $\psi : X \to \mathbb{R}$)&lt;br /&gt;
# $K(\vec{x}_1, \vec{x}_2) = K_1(\phi(\vec{x}_1), \phi(\vec{x}_2)) \quad$ (композиция ядра и функции $\phi : X \to X$)&lt;br /&gt;
# $K(\vec{x}_1, \vec{x}_2) = \int\limits_X s(\vec{x}_1, \vec{z}) s(\vec{x}_2, \vec{z}) d \vec{z} \quad$ ($s : X \times X \to \mathbb{R}$ — симметричная интегрируемая функция)&lt;br /&gt;
# $K(\vec{x}_1, \vec{x}_2) = f(K_1(\vec{x}_1, \vec{x}_2)) \quad$ ($f: \mathbb{R} \to \mathbb{R}$ представима в виде сходящегося степенного ряда с неотрицательными коэффициентами)&lt;br /&gt;
&lt;br /&gt;
== Стандартные ядра ==&lt;br /&gt;
&lt;br /&gt;
Существует несколько &amp;quot;стандартных&amp;quot; ядер, которые соответствуют известным алгоритмам классификации:&lt;br /&gt;
&lt;br /&gt;
* $K(\vec{x}_1, \vec{x}_2) = (\langle \vec{x}_1, \vec{x}_2 \rangle + c)^d, \quad c, d \in \mathbb{R}$ — полиномиальное ядро&lt;br /&gt;
* $K(\vec{x}_1, \vec{x}_2) = \sigma(\langle \vec{x}_1, \vec{x}_2 \rangle)$ — нейросеть с заданной функцией активации $\sigma(z)$ (не при всех $\sigma$ является ядром)&lt;br /&gt;
* $K(\vec{x}_1, \vec{x}_2) = \exp(-\beta \lVert \vec{x}_1 - \vec{x}_2 \rVert^2)$ — сеть радиальных базисных функций (англ. ''RBF'')&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
* [[Метод опорных векторов (SVM)]]&lt;br /&gt;
&lt;br /&gt;
== Примечания ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
* [http://www.machinelearning.ru/wiki/index.php?title=%D0%9C%D0%B0%D1%88%D0%B8%D0%BD%D0%B0_%D0%BE%D0%BF%D0%BE%D1%80%D0%BD%D1%8B%D1%85_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2 machinelearning.ru — Машина опорных векторов]&lt;br /&gt;
* [https://www.youtube.com/watch?v=Adi67_94_gc&amp;amp;list=PLJOzdkh8T5kp99tGTEFjH_b9zqEQiiBtC&amp;amp;index=5 Лекция &amp;quot;Линейные методы классификации: метод опорных векторов&amp;quot;]  — К.В. Воронцов, курс &amp;quot;Машинное обучение&amp;quot; 2014&lt;br /&gt;
&lt;br /&gt;
[[Категория: Машинное обучение]]&lt;br /&gt;
[[Категория: Классификация]]&lt;br /&gt;
[[Категория: Регрессия]]&lt;/div&gt;</summary>
		<author><name>Egormkn</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%AF%D0%B4%D1%80%D0%B0&amp;diff=70747</id>
		<title>Ядра</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%AF%D0%B4%D1%80%D0%B0&amp;diff=70747"/>
				<updated>2019-04-04T21:32:54Z</updated>
		
		<summary type="html">&lt;p&gt;Egormkn: Перенос информации из статьи про SVM&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ В разработке }}&lt;br /&gt;
&lt;br /&gt;
'''Ядро''' (англ. ''kernel'') — функция $K: X \times X \to \mathbb{R}$, которая является скалярным произведением в некотором спрямляющем пространстве: $K(\vec{x}_1, \vec{x}_2) = \langle \psi(\vec{x}_1), \psi(\vec{x}_2) \rangle$ при некотором $\psi : X \to H$, где $H$ — пространство со скалярным произведением.&lt;br /&gt;
&lt;br /&gt;
Теорема Мерсера определяет условия, при которых функция может являться ядром:&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|id=kernel&lt;br /&gt;
|author=Мерсер&lt;br /&gt;
|statement=&lt;br /&gt;
Функция $K(\vec{x}_1, \vec{x}_2)$ является ядром тогда и только тогда, когда выполнены условия: &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
$\begin{cases}K(\vec{x}_1, \vec{x}_2) = K(\vec{x}_2, \vec{x}_1) &amp;amp; \text{(симметричность)} \\[1ex] \forall g: X \to \mathbb{R} \quad \int\limits_X \int\limits_X K(\vec{x}_1, \vec{x}_2) g(\vec{x}_1) g(\vec{x}_2) d \vec{x}_1 d \vec{x}_2 \geq 0 &amp;amp; \text{(неотрицательная определенность)}\end{cases}$&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Проверка неотрицательной определённости является довольно трудоёмкой, поэтому на практике теорема явно не используется. Проблема выбора лучшего ядра на сегодняшний день остаётся открытой, лучшие из известных на данный момент решений основываются на генетических алгоритмах&amp;lt;ref&amp;gt;[https://www.researchgate.net/publication/221080223_An_Evolutionary_Approach_to_Automatic_Kernel_Construction T.Howley, M.G.Madden — An Evolutionary Approach to Automatic Kernel Construction]&amp;lt;/ref&amp;gt;). Обычно в практических реализациях ограничиваются перебором нескольких функций, про которые известно, что они являются ядрами, и выбирают среди них лучшую при помощи кросс-валидации. Кроме того, существуют правила порождения ядер, которые также применяются для расширения пространства перебираемых функций.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Конструктивные методы синтеза ядер:&lt;br /&gt;
&lt;br /&gt;
# $K(\vec{x}_1, \vec{x}_2) = \langle \vec{x}_1, \vec{x}_2 \rangle \quad$ (скалярное произведение)&lt;br /&gt;
# $K(\vec{x}_1, \vec{x}_2) = \alpha \quad$ (константа $\alpha \in \mathbb{R}_+$)&lt;br /&gt;
# $K(\vec{x}_1, \vec{x}_2) = K_1(\vec{x}_1, \vec{x}_2) + K_2(\vec{x}_1, \vec{x}_2) \quad$ (сумма ядер)&lt;br /&gt;
# $K(\vec{x}_1, \vec{x}_2) = K_1(\vec{x}_1, \vec{x}_2) * K_2(\vec{x}_1, \vec{x}_2) \quad$ (произведение ядер)&lt;br /&gt;
# $K(\vec{x}_1, \vec{x}_2) = \psi(\vec{x}_1) * \psi(\vec{x}_2) \quad$ (произведение функций $\psi : X \to \mathbb{R}$)&lt;br /&gt;
# $K(\vec{x}_1, \vec{x}_2) = K_1(\phi(\vec{x}_1), \phi(\vec{x}_2)) \quad$ (композиция ядра и функции $\phi : X \to X$)&lt;br /&gt;
# $K(\vec{x}_1, \vec{x}_2) = \int\limits_X s(\vec{x}_1, \vec{z}) s(\vec{x}_2, \vec{z}) d \vec{z} \quad$ ($s : X \times X \to \mathbb{R}$ — симметричная интегрируемая функция)&lt;br /&gt;
# $K(\vec{x}_1, \vec{x}_2) = f(K_1(\vec{x}_1, \vec{x}_2)) \quad$ ($f: \mathbb{R} \to \mathbb{R}$ представима в виде сходящегося степенного ряда с неотрицательными коэффициентами)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Существует несколько &amp;quot;стандартных&amp;quot; ядер, которые соответствуют известным алгоритмам классификации:&lt;br /&gt;
&lt;br /&gt;
* $K(\vec{x}_1, \vec{x}_2) = (\langle \vec{x}_1, \vec{x}_2 \rangle + c)^d, \quad c, d \in \mathbb{R}$ — полиномиальное ядро&lt;br /&gt;
* $K(\vec{x}_1, \vec{x}_2) = \sigma(\langle \vec{x}_1, \vec{x}_2 \rangle)$ — нейросеть с заданной функцией активации $\sigma(z)$ (не при всех $\sigma$ является ядром)&lt;br /&gt;
* $K(\vec{x}_1, \vec{x}_2) = \exp(-\beta \lVert \vec{x}_1 - \vec{x}_2 \rVert^2)$ — сеть радиальных базисных функций (англ. ''RBF'')&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категория: Машинное обучение]]&lt;br /&gt;
[[Категория: Классификация]]&lt;br /&gt;
[[Категория: Регрессия]]&lt;/div&gt;</summary>
		<author><name>Egormkn</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%BE%D0%BF%D0%BE%D1%80%D0%BD%D1%8B%D1%85_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2_(SVM)&amp;diff=70746</id>
		<title>Метод опорных векторов (SVM)</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%BE%D0%BF%D0%BE%D1%80%D0%BD%D1%8B%D1%85_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2_(SVM)&amp;diff=70746"/>
				<updated>2019-04-04T21:29:39Z</updated>
		
		<summary type="html">&lt;p&gt;Egormkn: Правки по оформлению&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Метод опорных векторов''' (англ. ''support vector machine'', ''SVM'') — один из наиболее популярных методов обучения, который применяется для решения задач классификации и регрессии. Основная идея метода заключается в построении гиперплоскости, разделяющей объекты выборки наиболее оптимальным способом. Алгоритм работает в предположении, что чем больше расстояние (зазор) между разделяющей гиперплоскостью и объектами разделяемых классов, тем меньше будет средняя ошибка классификатора.&lt;br /&gt;
&lt;br /&gt;
== Метод опорных векторов в задаче классификации ==&lt;br /&gt;
&lt;br /&gt;
Рассмотрим задачу бинарной классификации, в которой объектам из $X=\mathbb{R}^n$ соответствует один из двух классов $Y = \{-1, +1\}$.&lt;br /&gt;
&lt;br /&gt;
Пусть задана обучающая выборка пар &amp;quot;объект-ответ&amp;quot;: $T^\ell = (\vec{x}_i, y_i)_{i=1}^\ell$. Необходимо построить алгоритм классификации $a(\vec{x}) : X \to Y$.&lt;br /&gt;
&lt;br /&gt;
=== Разделяющая гиперплоскость ===&lt;br /&gt;
&lt;br /&gt;
[[Файл:svm_hyperplane.png|300px|thumb|right|Примеры разделяющих гиперплоскостей в $\mathbb{R}^2$]]&lt;br /&gt;
&lt;br /&gt;
В пространстве $\mathbb{R}^n$ уравнение $\langle \vec{w}, \vec{x} \rangle - b = 0$ при заданных $\vec{w}$ и $b$ определяет гиперплоскость — множество векторов $\vec{x} = (x_1, \ldots, x_n)$, принадлежащих пространству меньшей размерности $\mathbb{R}^{n-1}$. Например, для $\mathbb{R}^1$ гиперплоскостью является точка, для $\mathbb{R}^2$ — прямая, для $\mathbb{R}^3$ — плоскость и т.д. Параметр $\vec{w}$ определяет вектор нормали к гиперплоскости, а через $\frac{b}{\lVert \vec{w} \rVert}$ выражается расстояние от гиперплоскости до начала координат.&lt;br /&gt;
&lt;br /&gt;
Гиперплоскость делит $\mathbb{R}^n$ на два полупространства: $\langle \vec{w}, \vec{x} \rangle - b &amp;gt; 0$ и $\langle \vec{w}, \vec{x} \rangle - b &amp;lt; 0$. &lt;br /&gt;
&lt;br /&gt;
Говорят, что гиперплоскость разделяет два класса $C_1$ и $C_2$, если объекты этих классов лежат по разные стороны от гиперплоскости, то есть выполнено либо&lt;br /&gt;
&lt;br /&gt;
$\begin{cases}\langle \vec{w}, \vec{x} \rangle - b &amp;gt; 0, &amp;amp;&amp;amp; \forall x \in C_1 \\ \langle \vec{w}, \vec{x} \rangle - b &amp;lt; 0, &amp;amp;&amp;amp; \forall x \in C_2\end{cases}$&lt;br /&gt;
&lt;br /&gt;
либо&lt;br /&gt;
&lt;br /&gt;
$\begin{cases}\langle \vec{w}, \vec{x} \rangle - b &amp;lt; 0, &amp;amp;&amp;amp; \forall x \in C_1 \\ \langle \vec{w}, \vec{x} \rangle - b &amp;gt; 0, &amp;amp;&amp;amp; \forall x \in C_2\end{cases}$&lt;br /&gt;
&lt;br /&gt;
=== Линейно разделимая выборка ===&lt;br /&gt;
&lt;br /&gt;
Пусть выборка линейно разделима, то есть существует некоторая гиперплоскость, разделяющая классы $-1$ и $+1$. Тогда в качестве алгоритма классификации можно использовать линейный пороговый классификатор:&lt;br /&gt;
&lt;br /&gt;
$a(\vec{x}) = sign(\langle \vec{w}, \vec{x} \rangle - b) = sign\left(\sum\limits_{i=1}^\ell w_i x_i - b\right)$&lt;br /&gt;
&lt;br /&gt;
где $\vec{x} = (x_1, \ldots, x_n)$ — вектор значений признаков объекта, а $\vec{w} = (w_1, \ldots, w_n) \in \mathbb{R}^n$ и $b \in \mathbb{R}$ — параметры гиперплоскости.&lt;br /&gt;
&lt;br /&gt;
Но для двух линейно разделимых классов возможны различные варианты построения разделяющих гиперплоскостей. Метод опорных векторов выбирает ту гиперплоскость, которая максимизирует отступ между классами:&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
'''Отступ''' (англ. ''margin'') — характеристика, оценивающая, насколько объект &amp;quot;погружён&amp;quot; в свой класс, насколько типичным представителем класса он является. Чем меньше значение отступа $M_i$, тем ближе объект $\vec{x}_i$ подходит к границе классов и тем выше становится вероятность ошибки. Отступ $M_i$ отрицателен тогда и только тогда, когда алгоритм $a(x)$ допускает ошибку на объекте $\vec{x}_i$. &amp;lt;br&amp;gt;&amp;lt;br&amp;gt; Для линейного классификатора отступ определяется уравнением: $M_i(\vec{w}, b) = y_i(\langle \vec{w}, \vec{x}_i \rangle - b)$&lt;br /&gt;
}}&lt;br /&gt;
Если выборка линейно разделима, то существует такая гиперплоскость, отступ от которой до каждого объекта положителен:&lt;br /&gt;
&lt;br /&gt;
$\exists \vec{w}, b : \; M_i(\vec{w}, b) = y_i(\langle \vec{w}, \vec{x}_i \rangle - b) &amp;gt; 0, \; i = 1\ldots\ell$&lt;br /&gt;
&lt;br /&gt;
Мы хотим построить такую разделяющую гиперплоскость, чтобы объекты обучающей выборки находились на наибольшем расстоянии от неё.&lt;br /&gt;
&lt;br /&gt;
[[Файл:SVM_margin.png|300px|thumb|right|Оптимальная разделяющая гиперплоскость в $\mathbb{R}^2$]]&lt;br /&gt;
Заметим, что при умножении $\vec{w}$ и $b$ на константу $c \neq 0$ уравнение $\langle c\vec{w}, \vec{x} \rangle - cb = 0$ определяет ту же самую гиперплоскость, что и $\langle \vec{w}, \vec{x} \rangle - b = 0$. Для удобства проведём нормировку: выберем константу $c$ таким образом, чтобы $\min M_i(\vec{w}, b) = 1$. При этом в каждом из двух классов найдётся хотя бы один &amp;quot;граничный&amp;quot; объект обучающей выборки, отступ которого равен этому минимуму: иначе можно было бы сместить гиперплоскость в сторону класса с большим отступом, тем самым увеличив минимальное расстояние от гиперплоскости до объектов обучающей выборки. &lt;br /&gt;
&lt;br /&gt;
Обозначим любой &amp;quot;граничный&amp;quot; объект из класса $+1$ как $\vec{x}_+$, из класса $-1$ как $\vec{x}_-$. Их отступ равен единице, то есть&lt;br /&gt;
&lt;br /&gt;
$\begin{cases}&lt;br /&gt;
M_+(\vec{w}, b) = (+1)(\langle \vec{w}, \vec{x}_+ \rangle - b) = 1 \\&lt;br /&gt;
M_-(\vec{w}, b) = (-1)(\langle \vec{w}, \vec{x}_- \rangle - b) = 1&lt;br /&gt;
\end{cases}$&lt;br /&gt;
&lt;br /&gt;
Нормировка позволяет ограничить разделяющую полосу между классами: $\{x: -1 &amp;lt; \langle \vec{w}, \vec{x}_i \rangle - b &amp;lt; 1\}$. Внутри неё не может лежать ни один объект обучающей выборки. Ширину разделяющей полосы можно выразить как проекцию вектора $\vec{x}_+ - \vec{x}_-$ на нормаль к гиперплоскости $\vec{w}$. Чтобы разделяющая гиперплоскость находилась на наибольшем расстоянии от точек выборки, ширина полосы должна быть максимальной: &lt;br /&gt;
&lt;br /&gt;
$\frac{\langle \vec{x}_+ - \vec{x}_-, \vec{w} \rangle}{\lVert w \rVert} = \frac{\langle \vec{x}_+, \vec{w} \rangle - \langle \vec{x}_-, \vec{w} \rangle - b + b}{\lVert w \rVert} = \frac{(+1)\left(\langle \vec{x}_+, \vec{w} \rangle - b\right) \, + \, (-1)\left(\langle \vec{x}_-, \vec{w} \rangle - b\right)}{\lVert w \rVert} = \\ = \frac{M_+(\vec{w}, b) \, + \, M_-(\vec{w}, b)}{\lVert w \rVert} = \frac{2}{\lVert w \rVert} \to \max \; \Rightarrow \; \lVert w \rVert \to \min$&lt;br /&gt;
&lt;br /&gt;
Это приводит нас к постановке задачи оптимизации в терминах квадратичного программирования:&lt;br /&gt;
&lt;br /&gt;
$\begin{cases}&lt;br /&gt;
\lVert \vec{w} \rVert^2 \to \min\limits_{w,b} \\&lt;br /&gt;
M_i(\vec{w}, b) \geq 1, \quad i = 1, \ldots, \ell&lt;br /&gt;
\end{cases}$&lt;br /&gt;
&lt;br /&gt;
=== Линейно неразделимая выборка ===&lt;br /&gt;
&lt;br /&gt;
На практике линейно разделимые выборки практически не встречаются: в данных возможны выбросы и нечёткие границы между классами. В таком случае поставленная выше задача не имеет решений, и необходимо ослабить ограничения, позволив некоторым объектам попадать на &amp;quot;территорию&amp;quot; другого класса. Для каждого объекта отнимем от отступа некоторую положительную величину $\xi_i$, но потребуем чтобы эти введённые поправки были минимальны. Это приведёт к следующей постановке задачи, называемой также ''SVM с мягким отступом'' (англ. ''soft-margin SVM''):&lt;br /&gt;
&lt;br /&gt;
$\begin{cases}&lt;br /&gt;
\frac{1}{2} \lVert \vec{w} \rVert^2 \color{brown}{+ C \sum\limits_{i=1}^\ell \xi_i} \to \min\limits_{w, b, \color{brown}{\xi}} \\&lt;br /&gt;
M_i(\vec{w}, b) \geq 1 \color{brown}{- \xi_i}, \quad i = 1, \ldots, \ell \\&lt;br /&gt;
\color{brown}{\xi_i \geq 0, \quad i = 1, \ldots, \ell} \\&lt;br /&gt;
\end{cases}$&lt;br /&gt;
&lt;br /&gt;
Мы не знаем, какой из функционалов $\frac{1}{2} \lVert \vec{w} \rVert^2$ и $\sum\limits_{i=1}^\ell \xi_i$ важнее, поэтому вводим коэффициент $C$, который будем оптимизировать с помощью кросс-валидации. В итоге мы получили задачу, у которой всегда есть единственное решение.&lt;br /&gt;
&lt;br /&gt;
Заметим, что мы можем упростить постановку задачи:&lt;br /&gt;
&lt;br /&gt;
$\begin{cases}&lt;br /&gt;
\xi_i \geq 0 \\&lt;br /&gt;
\xi_i \geq 1 - M_i(\vec{w}, b) \\&lt;br /&gt;
\sum\limits_{i=1}^\ell \xi_i \to \min&lt;br /&gt;
\end{cases} &lt;br /&gt;
\,\Rightarrow\,&lt;br /&gt;
\begin{cases} &lt;br /&gt;
\xi_i \geq \max(0, 1 - M_i(\vec{w}, b)) \\&lt;br /&gt;
\sum\limits_{i=1}^\ell \xi_i \to \min&lt;br /&gt;
\end{cases}&lt;br /&gt;
\,\Rightarrow\,&lt;br /&gt;
\xi_i = (1- M_i(\vec{w}, b))_+$&lt;br /&gt;
&lt;br /&gt;
Получим эквивалентную задачу безусловной минимизации:&lt;br /&gt;
&lt;br /&gt;
$\frac{1}{2} \lVert \vec{w} \rVert^2 + C \sum\limits_{i=1}^\ell \left(1 - M_i(\vec{w}, b)\right)_+ \to \min\limits_{w, b}$&lt;br /&gt;
&lt;br /&gt;
Теперь научимся её решать.&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|id=kkt&lt;br /&gt;
|author=Условия Каруша—Куна—Таккера&lt;br /&gt;
|statement=&lt;br /&gt;
Пусть поставлена задача нелинейного программирования с ограничениями:&lt;br /&gt;
$$&lt;br /&gt;
\begin{cases}&lt;br /&gt;
f(x) \to \min\limits_{x \in X} \\&lt;br /&gt;
g_i(x) \leq 0,\;i=1\ldots m \\&lt;br /&gt;
h_j(x) = 0,\;j=1\ldots k&lt;br /&gt;
\end{cases}&lt;br /&gt;
$$&lt;br /&gt;
&lt;br /&gt;
Если $x$ — точка локального минимума при наложенных ограничениях, то существуют такие множители $\mu_i, i = 1\ldots m$, $\;\lambda_j, j = 1\ldots k$, что для функции Лагранжа $L(x; \mu, \lambda)$ выполняются условия:&lt;br /&gt;
&lt;br /&gt;
$$\begin{cases}\frac{\partial L}{\partial x} = 0, \quad L(x; \mu, \lambda) = f(x) + \sum\limits_{i=1}^m \mu_i g_i(x) + \sum\limits_{j=1}^k \lambda_j h_j(x) \\ g_i(x) \leq 0,\;h_j(x) = 0 \quad \text{(исходные ограничения)} \\ \mu_i \geq 0 \quad \text{(двойственные ограничения)} \\ \mu_i g_i(x) = 0 \quad \text{(условие дополняющей нежёсткости)} \end{cases}$$&lt;br /&gt;
&lt;br /&gt;
При этом искомая точка является седловой точкой функции Лагранжа: минимумом по $x$ и максимумом по двойственным переменным $\mu$.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
По теореме Каруша—Куна—Таккера, поставленная нами задача минимизации эквивалентна двойственной задаче поиска седловой точки функции Лагранжа:&lt;br /&gt;
&lt;br /&gt;
$\mathscr{L}(\vec{w},b,\xi; \lambda, \eta) = \frac{1}{2} \lVert w \rVert^2 - \sum\limits_{i=1}^\ell \lambda_i \left(M_i(\vec{w}, b) - 1\right) - \sum\limits_{i=1}^\ell \xi_i \left(\lambda_i + \eta_i - C\right)$&lt;br /&gt;
&lt;br /&gt;
$\lambda_i$ — переменные, двойственные к ограничениям $M_i \geq 1 - \xi_i$&lt;br /&gt;
&lt;br /&gt;
$\eta_i$ — переменные, двойственные к ограничениям $\xi_i \geq 0$&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Запишем необходимые условия седловой точки функции Лагранжа:&lt;br /&gt;
&lt;br /&gt;
$\begin{cases}&lt;br /&gt;
\frac{\partial \mathscr{L}}{\partial w} = 0, \quad \frac{\partial \mathscr{L}}{\partial b} = 0, \quad \frac{\partial \mathscr{L}}{\partial \xi} = 0 \\&lt;br /&gt;
\xi_i \geq 0, \quad \lambda_i \geq 0, \quad \eta_i \geq 0, &amp;amp;&amp;amp; i = 1, \ldots, \ell \\&lt;br /&gt;
\lambda_i = 0 \;\text{либо}\; M_i(\vec{w},b) = 1 - \xi_i, &amp;amp;&amp;amp; i = 1, \ldots, \ell \\&lt;br /&gt;
\eta_i = 0 \;\text{либо}\; \xi_i = 0, &amp;amp;&amp;amp; i = 1, \ldots, \ell&lt;br /&gt;
\end{cases}$&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Продифференцируем функцию Лагранжа и приравняем к нулю производные. Получим следующие ограничения:&lt;br /&gt;
&lt;br /&gt;
$\begin{array}{lcl}&lt;br /&gt;
\frac{\partial \mathscr{L}}{\partial w} = \vec{w} - \sum\limits_{i=1}^\ell \lambda_i y_i \vec{x}_i = 0 &amp;amp; \Rightarrow &amp;amp; \vec{w} = \sum\limits_{i=1}^\ell \lambda_i y_i \vec{x}_i \\&lt;br /&gt;
\frac{\partial \mathscr{L}}{\partial b} = -\sum\limits_{i=1}^\ell \lambda_i y_i = 0 &amp;amp; \Rightarrow &amp;amp; \sum\limits_{i=1}^\ell \lambda_i y_i = 0 \\&lt;br /&gt;
\frac{\partial \mathscr{L}}{\partial \xi_i} = -\lambda_i - \eta_i + C = 0 &amp;amp; \Rightarrow &amp;amp; \eta_i + \lambda_i = C, \quad i = 1, \ldots, \ell&lt;br /&gt;
\end{array}$&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Заметим, что $\eta_i \geq 0$, $\lambda_i \geq 0$, $C &amp;gt; 0$, поэтому из последнего ограничения получаем $0 \leq \eta_i \leq C$, $0 \leq \lambda_i \leq C$. &lt;br /&gt;
&lt;br /&gt;
Диапазон значений $\lambda_i$ (которые, как указано выше, соответствуют ограничениям на величину отступа) позволяет нам разделить объекты обучающей выборки на три типа:&lt;br /&gt;
&lt;br /&gt;
# $\lambda_i = 0 \; \Rightarrow \; \eta_i = C; \; \xi_i = 0; \; M_i \geq 1 \;$ — периферийные (неинформативные) объекты &amp;lt;br&amp;gt; Эти объекты лежат в своём классе, классифицируются верно и не влияют на выбор разделяющей гиперплоскости (см. уравнение для $\vec{w}$)&lt;br /&gt;
# $0 &amp;lt; \lambda_i &amp;lt; C \; \Rightarrow \; 0 &amp;lt; \eta_i &amp;lt; C; \; \xi_i = 0; \; M_i = 1 \;$ — опорные граничные объекты &amp;lt;br&amp;gt; Эти объекты лежат ровно на границе разделяющей полосы на стороне своего класса&lt;br /&gt;
# $\lambda_i = C \; \Rightarrow \; \eta_i = 0; \; \xi_i &amp;gt; 0; \; M_i &amp;lt; 1 \;$ — опорные объекты-нарушители &amp;lt;br&amp;gt; Эти объекты лежат внутри разделяющей полосы или на стороне чужого класса&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
'''Опорный объект''' (опорный вектор, англ. ''support vector'') — объект $\vec{x}_i$, соответствующий которому множитель Лагранжа отличен от нуля: $\lambda_i \neq 0$.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Теперь подставим ограничения, которые мы получили при дифференцировании, в функцию Лагранжа. Получим следующую постановку двойственной задачи, которая зависит только от двойственных переменных $\lambda$:&lt;br /&gt;
&lt;br /&gt;
$\begin{cases}&lt;br /&gt;
-\mathscr{L}(\lambda) = -\sum\limits_{i=1}^\ell \lambda_i + \frac{1}{2} \sum\limits_{i=1}^\ell \sum\limits_{j=1}^\ell \lambda_i \lambda_j y_i y_j \langle \vec{x}_i, \vec{x}_j \rangle \to \min\limits_\lambda \\&lt;br /&gt;
0 \leq \lambda_i \leq C, \quad i = 1, \ldots, \ell \\&lt;br /&gt;
\sum\limits_{i=1}^\ell \lambda_i y_i = 0&lt;br /&gt;
\end{cases}$&lt;br /&gt;
&lt;br /&gt;
Это также задача квадратичного программирования. Решение задачи лежит в пересечении $\ell$-мерного куба с ребром $C$ и гиперплоскости $\langle \lambda, y \rangle = 0$, что является выпуклым многогранником размерности $\ell-1$. В этом многограннике нужно найти минимум выпуклого квадратичного функционала. Следовательно, данная задача имеет единственное решение.&lt;br /&gt;
&lt;br /&gt;
Существуют различные методы поиска решения: можно воспользоваться универсальным солвером задачи квадратичного программирования ([https://www.ibm.com/analytics/cplex-optimizer CPLEX], [http://www.gurobi.com/ Gurobi]), либо алгоритмом, учитывающим специфические особенности SVM ([https://www.microsoft.com/en-us/research/publication/sequential-minimal-optimization-a-fast-algorithm-for-training-support-vector-machines/ SMO], [http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.10.9956 INCAS]).&lt;br /&gt;
&lt;br /&gt;
После того, как мы получили вектор коэффициентов $\vec{\lambda}$, можем выразить решение прямой задачи через решение двойственной:&lt;br /&gt;
&lt;br /&gt;
$\begin{cases}&lt;br /&gt;
\vec{w} = \sum\limits_{i=1}^\ell \lambda_i y_i \vec{x}_i \\&lt;br /&gt;
b = \langle \vec{w}, \vec{x}_i \rangle - y_i, \quad \forall i: \lambda_i &amp;gt; 0, M_i = 1&lt;br /&gt;
\end{cases}$&lt;br /&gt;
&lt;br /&gt;
На практике для повышения вычислительной устойчивости рекомендуется при расчёте $b$ брать медиану по опорным граничным объектам:&lt;br /&gt;
&lt;br /&gt;
$b = med\{ \langle \vec{w}, \vec{x}_i \rangle - y_i : \lambda_i &amp;gt; 0, M_i = 1, i = 1, \ldots, \ell\}$&lt;br /&gt;
&lt;br /&gt;
Теперь можем переписать наш линейный классификатор, выразив $\vec{w}$ через $\vec{\lambda}$:&lt;br /&gt;
&lt;br /&gt;
$a(x) = sign \left(\sum\limits_{i=1}^\ell \lambda_i y_i \langle \vec{x}_i, \vec{x} \rangle - b\right)$&lt;br /&gt;
&lt;br /&gt;
=== Нелинейное обобщение, kernel trick ===&lt;br /&gt;
&lt;br /&gt;
Существует ещё один подход к решению проблемы линейной разделимости, известный как трюк с ядром (kernel trick). Если выборка объектов с признаковым описанием из $X = \mathbb{R}^n$ не является линейно разделимой, мы можем предположить, что существует некоторое пространство $H$, вероятно, большей размерности, при переходе в которое выборка станет линейно разделимой. Пространство $H$ здесь называют спрямляющим, а функцию перехода $\psi : X \to H$ — спрямляющим отображением. Построение SVM в таком случае происходит так же, как и раньше, но в качестве векторов признаковых описаний используются векторы $\psi(\vec{x})$, а не $\vec{x}$. Соответственно, скалярное произведение $\langle \vec{x}_1, \vec{x}_2 \rangle$ в пространстве $X$ везде заменяется скалярным произведением $\langle \psi(\vec{x}_1), \psi(\vec{x}_2) \rangle$ в пространстве $H$. Отсюда следует, что пространство $H$ должно быть гильбертовым, так как в нём должно быть определено скалярное произведение.&lt;br /&gt;
&lt;br /&gt;
Обратим внимание на то, что постановка задачи и алгоритм классификации не используют в явном виде признаковое описание и оперируют только скалярными произведениями признаков объектов. Это даёт возможность заменить скалярное произведение в пространстве $X$ на [[Ядро|ядро]] — функцию, являющуюся скалярным произведением в некотором $H$. При этом можно вообще не строить спрямляющее пространство в явном виде, и вместо подбора $\psi$ подбирать непосредственно ядро. &lt;br /&gt;
&lt;br /&gt;
Постановка задачи с применением ядер приобретает вид:&lt;br /&gt;
&lt;br /&gt;
$\begin{cases}&lt;br /&gt;
-\mathscr{L}(\lambda) = -\sum\limits_{i=1}^\ell \lambda_i + \frac{1}{2} \sum\limits_{i=1}^\ell \sum\limits_{j=1}^\ell \lambda_i \lambda_j y_i y_j \color{brown}{K(\vec{x}_i, \vec{x}_j)} \to \min\limits_\lambda \\&lt;br /&gt;
0 \leq \lambda_i \leq C, \quad i = 1, \ldots, \ell \\&lt;br /&gt;
\sum\limits_{i=1}^\ell \lambda_i y_i = 0&lt;br /&gt;
\end{cases}$&lt;br /&gt;
&lt;br /&gt;
$a(x) = sign \left(\sum\limits_{i=1}^\ell \lambda_i y_i \color{brown}{K(\vec{x}_i, \vec{x})} - b\right)$&lt;br /&gt;
&lt;br /&gt;
== Преимущества и недостатки SVM ==&lt;br /&gt;
&lt;br /&gt;
Преимущества SVM перед методом стохастического градиента и нейронными сетями:&lt;br /&gt;
&lt;br /&gt;
* Задача выпуклого квадратичного программирования хорошо изучена и имеет единственное решение.&lt;br /&gt;
* Метод опорных векторов эквивалентен двухслойной нейронной сети, где число нейронов на скрытом слое определяется автоматически как число опорных векторов.&lt;br /&gt;
* Принцип оптимальной разделяющей гиперплоскости приводит к максимизации ширины разделяющей полосы, а следовательно, к более уверенной классификации.&lt;br /&gt;
&lt;br /&gt;
Недостатки классического SVM:&lt;br /&gt;
&lt;br /&gt;
* Неустойчивость к шуму: выбросы в исходных данных становятся опорными объектами-нарушителями и напрямую влияют на построение разделяющей гиперплоскости.&lt;br /&gt;
* Не описаны общие методы построения ядер и спрямляющих пространств, наиболее подходящих для конкретной задачи.&lt;br /&gt;
* Нет отбора признаков.&lt;br /&gt;
* Необходимо подбирать константу $C$ при помощи кросс-валидации.&lt;br /&gt;
&lt;br /&gt;
== Модификации ==&lt;br /&gt;
&lt;br /&gt;
Существуют различные дополнения и модификации метода опорных векторов, направленные на устранение описанных недостатков:&lt;br /&gt;
&lt;br /&gt;
* [http://jmlr.csail.mit.edu/papers/v1/tipping01a.html Метод релевантных векторов (Relevance Vector Machine, RVM)]&lt;br /&gt;
* [https://papers.nips.cc/paper/2450-1-norm-support-vector-machines.pdf 1-norm SVM (LASSO SVM)]&lt;br /&gt;
* [http://www3.stat.sinica.edu.tw/statistica/oldpdf/A16n214.pdf Doubly Regularized SVM (ElasticNet SVM)]&lt;br /&gt;
* [https://arxiv.org/abs/1901.09643v1 Support Features Machine (SFM)]&lt;br /&gt;
* [http://www.robots.ox.ac.uk/~minhhoai/papers/SVMFeatureWeight_PR.pdf Relevance Features Machine (RFM)]&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
* [[Общие понятия]]&lt;br /&gt;
* [[Ядра]]&lt;br /&gt;
* [[Обзор библиотек для машинного обучения на Python]]&lt;br /&gt;
&lt;br /&gt;
== Примечания ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
* [http://www.machinelearning.ru/wiki/index.php?title=%D0%9C%D0%B0%D1%88%D0%B8%D0%BD%D0%B0_%D0%BE%D0%BF%D0%BE%D1%80%D0%BD%D1%8B%D1%85_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2 machinelearning.ru — Машина опорных векторов]&lt;br /&gt;
* [https://www.youtube.com/watch?v=Adi67_94_gc&amp;amp;list=PLJOzdkh8T5kp99tGTEFjH_b9zqEQiiBtC&amp;amp;index=5 Лекция &amp;quot;Линейные методы классификации: метод опорных векторов&amp;quot;]  — К.В. Воронцов, курс &amp;quot;Машинное обучение&amp;quot; 2014&lt;br /&gt;
* [https://ru.wikipedia.org/wiki/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%BE%D0%BF%D0%BE%D1%80%D0%BD%D1%8B%D1%85_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2 Wikipedia — Метод опорных векторов]&lt;br /&gt;
* Alexey Nefedov — [https://svmtutorial.online/ Support Vector Machines: A Simple Tutorial]&lt;br /&gt;
* John Platt — [https://www.microsoft.com/en-us/research/publication/sequential-minimal-optimization-a-fast-algorithm-for-training-support-vector-machines/ Sequential Minimal Optimization: A Fast Algorithm for Training Support Vector Machines]&lt;br /&gt;
* Shai Fine, Katya Scheinberg — [http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.10.9956 INCAS: An Incremental Active Set Method for SVM]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Машинное обучение]]&lt;br /&gt;
[[Категория: Классификация]]&lt;br /&gt;
[[Категория: Регрессия]]&lt;/div&gt;</summary>
		<author><name>Egormkn</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%BE%D0%BF%D0%BE%D1%80%D0%BD%D1%8B%D1%85_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2_(SVM)&amp;diff=70698</id>
		<title>Метод опорных векторов (SVM)</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%BE%D0%BF%D0%BE%D1%80%D0%BD%D1%8B%D1%85_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2_(SVM)&amp;diff=70698"/>
				<updated>2019-04-02T22:43:44Z</updated>
		
		<summary type="html">&lt;p&gt;Egormkn: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{в разработке}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Метод опорных векторов''' (англ. ''support vector machine'', ''SVM'') — один из наиболее популярных методов обучения, который применяется для решения задач классификации и регрессии. Основная идея метода заключается в построении гиперплоскости, разделяющей объекты выборки наиболее оптимальным способом. Алгоритм работает в предположении, что чем больше расстояние (зазор) между разделяющей гиперплоскостью и объектами разделяемых классов, тем меньше будет средняя ошибка классификатора.&lt;br /&gt;
&lt;br /&gt;
== Метод опорных векторов в задаче классификации ==&lt;br /&gt;
&lt;br /&gt;
Рассмотрим задачу бинарной классификации, в которой объектам из $X=\mathbb{R}^n$ соответствует один из двух классов $Y = \{-1, +1\}$.&lt;br /&gt;
&lt;br /&gt;
Пусть задана обучающая выборка пар &amp;quot;объект-ответ&amp;quot;: $T^\ell = (\vec{x}_i, y_i)_{i=1}^\ell$. Необходимо построить алгоритм классификации $a(\vec{x}) : X \to Y$.&lt;br /&gt;
&lt;br /&gt;
=== Разделяющая гиперплоскость ===&lt;br /&gt;
&lt;br /&gt;
[[Файл:svm_hyperplane.png|300px|thumb|right|Примеры разделяющих гиперплоскостей в $\mathbb{R}^2$]]&lt;br /&gt;
&lt;br /&gt;
В пространстве $\mathbb{R}^n$ уравнение $\langle \vec{w}, \vec{x} \rangle - b = 0$ при заданных $\vec{w}$ и $b$ определяет гиперплоскость — множество векторов $\vec{x} = (x_1, \ldots, x_n)$, принадлежащих пространству меньшей размерности $\mathbb{R}^{n-1}$. Например, для $\mathbb{R}^1$ гиперплоскостью является точка, для $\mathbb{R}^2$ — прямая, для $\mathbb{R}^3$ — плоскость и т.д. Параметр $\vec{w}$ определяет вектор нормали к гиперплоскости, а через $\frac{b}{\lVert \vec{w} \rVert}$ выражается расстояние от гиперплоскости до начала координат.&lt;br /&gt;
&lt;br /&gt;
Гиперплоскость делит $\mathbb{R}^n$ на два полупространства: $\langle \vec{w}, \vec{x} \rangle - b &amp;gt; 0$ и $\langle \vec{w}, \vec{x} \rangle - b &amp;lt; 0$. &lt;br /&gt;
&lt;br /&gt;
Говорят, что гиперплоскость разделяет два класса $C_1$ и $C_2$, если объекты этих классов лежат по разные стороны от гиперплоскости, то есть выполнено либо&lt;br /&gt;
&lt;br /&gt;
$\begin{cases}\langle \vec{w}, \vec{x} \rangle - b &amp;gt; 0, &amp;amp;&amp;amp; \forall x \in C_1 \\ \langle \vec{w}, \vec{x} \rangle - b &amp;lt; 0, &amp;amp;&amp;amp; \forall x \in C_2\end{cases}$&lt;br /&gt;
&lt;br /&gt;
либо&lt;br /&gt;
&lt;br /&gt;
$\begin{cases}\langle \vec{w}, \vec{x} \rangle - b &amp;lt; 0, &amp;amp;&amp;amp; \forall x \in C_1 \\ \langle \vec{w}, \vec{x} \rangle - b &amp;gt; 0, &amp;amp;&amp;amp; \forall x \in C_2\end{cases}$&lt;br /&gt;
&lt;br /&gt;
=== Линейно разделимая выборка ===&lt;br /&gt;
&lt;br /&gt;
Пусть выборка линейно разделима, то есть существует некоторая гиперплоскость, разделяющая классы $-1$ и $+1$. Тогда в качестве алгоритма классификации можно использовать линейный пороговый классификатор:&lt;br /&gt;
&lt;br /&gt;
$a(\vec{x}) = sign(\langle \vec{w}, \vec{x} \rangle - b) = sign\left(\sum\limits_{i=1}^\ell w_i x_i - b\right)$&lt;br /&gt;
&lt;br /&gt;
где $\vec{x} = (x_1, \ldots, x_n)$ — вектор значений признаков объекта, а $\vec{w} = (w_1, \ldots, w_n) \in \mathbb{R}^n$ и $b \in \mathbb{R}$ — параметры гиперплоскости.&lt;br /&gt;
&lt;br /&gt;
Но для двух линейно разделимых классов возможны различные варианты построения разделяющих гиперплоскостей. Метод опорных векторов выбирает ту гиперплоскость, которая максимизирует отступ между классами:&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
'''Отступ''' (англ. ''margin'') — характеристика, оценивающая, насколько объект &amp;quot;погружён&amp;quot; в свой класс, насколько типичным представителем класса он является. Чем меньше значение отступа $M_i$, тем ближе объект $\vec{x}_i$ подходит к границе классов и тем выше становится вероятность ошибки. Отступ $M_i$ отрицателен тогда и только тогда, когда алгоритм $a(x)$ допускает ошибку на объекте $\vec{x}_i$. &amp;lt;br&amp;gt;&amp;lt;br&amp;gt; Для линейного классификатора отступ определяется уравнением: $M_i(\vec{w}, b) = y_i(\langle \vec{w}, \vec{x}_i \rangle - b)$&lt;br /&gt;
}}&lt;br /&gt;
Если выборка линейно разделима, то существует такая гиперплоскость, отступ от которой до каждого объекта положителен:&lt;br /&gt;
&lt;br /&gt;
$\exists \vec{w}, b : \; M_i(\vec{w}, b) = y_i(\langle \vec{w}, \vec{x}_i \rangle - b) &amp;gt; 0, \; i = 1\ldots\ell$&lt;br /&gt;
&lt;br /&gt;
Мы хотим построить такую разделяющую гиперплоскость, чтобы объекты обучающей выборки находились на наибольшем расстоянии от неё.&lt;br /&gt;
&lt;br /&gt;
[[Файл:SVM_margin.png|300px|thumb|right|Оптимальная разделяющая гиперплоскость в $\mathbb{R}^2$]]&lt;br /&gt;
Заметим, что при умножении $\vec{w}$ и $b$ на константу $c \neq 0$ уравнение $\langle c\vec{w}, \vec{x} \rangle - cb = 0$ определяет ту же самую гиперплоскость, что и $\langle \vec{w}, \vec{x} \rangle - b = 0$. Для удобства проведём нормировку: выберем константу $c$ таким образом, чтобы $\min M_i(\vec{w}, b) = 1$. При этом в каждом из двух классов найдётся хотя бы один &amp;quot;граничный&amp;quot; объект обучающей выборки, отступ которого равен этому минимуму: иначе можно было бы сместить гиперплоскость в сторону класса с большим отступом, тем самым увеличив минимальное расстояние от гиперплоскости до объектов обучающей выборки. &lt;br /&gt;
&lt;br /&gt;
Обозначим любой &amp;quot;граничный&amp;quot; объект из класса $+1$ как $\vec{x}_+$, из класса $-1$ как $\vec{x}_-$. Их отступ равен единице, то есть&lt;br /&gt;
&lt;br /&gt;
$\begin{cases}&lt;br /&gt;
M_+(\vec{w}, b) = (+1)(\langle \vec{w}, \vec{x}_+ \rangle - b) = 1 \\&lt;br /&gt;
M_-(\vec{w}, b) = (-1)(\langle \vec{w}, \vec{x}_- \rangle - b) = 1&lt;br /&gt;
\end{cases}$&lt;br /&gt;
&lt;br /&gt;
Нормировка позволяет ограничить разделяющую полосу между классами: $\{x: -1 &amp;lt; \langle \vec{w}, \vec{x}_i \rangle - b &amp;lt; 1\}$. Внутри неё не может лежать ни один объект обучающей выборки. Ширину разделяющей полосы можно выразить как проекцию вектора $\vec{x}_+ - \vec{x}_-$ на нормаль к гиперплоскости $\vec{w}$. Чтобы разделяющая гиперплоскость находилась на наибольшем расстоянии от точек выборки, ширина полосы должна быть максимальной: &lt;br /&gt;
&lt;br /&gt;
$\frac{\langle \vec{x}_+ - \vec{x}_-, \vec{w} \rangle}{\lVert w \rVert} = \frac{\langle \vec{x}_+, \vec{w} \rangle - \langle \vec{x}_-, \vec{w} \rangle - b + b}{\lVert w \rVert} = \frac{(+1)\left(\langle \vec{x}_+, \vec{w} \rangle - b\right) \, + \, (-1)\left(\langle \vec{x}_-, \vec{w} \rangle - b\right)}{\lVert w \rVert} = \\ = \frac{M_+(\vec{w}, b) \, + \, M_-(\vec{w}, b)}{\lVert w \rVert} = \frac{2}{\lVert w \rVert} \to \max \; \Rightarrow \; \lVert w \rVert \to \min$&lt;br /&gt;
&lt;br /&gt;
Это приводит нас к постановке задачи оптимизации в терминах квадратичного программирования:&lt;br /&gt;
&lt;br /&gt;
$\begin{cases}&lt;br /&gt;
\lVert \vec{w} \rVert^2 \to \min\limits_{w,b} \\&lt;br /&gt;
M_i(\vec{w}, b) \geq 1, \quad i = 1, \ldots, \ell&lt;br /&gt;
\end{cases}$&lt;br /&gt;
&lt;br /&gt;
=== Линейно неразделимая выборка ===&lt;br /&gt;
&lt;br /&gt;
На практике линейно разделимые выборки практически не встречаются: в данных возможны выбросы и нечёткие границы между классами. В таком случае поставленная выше задача не имеет решений, и необходимо ослабить ограничения, позволив некоторым объектам попадать на &amp;quot;территорию&amp;quot; другого класса. Для каждого объекта отнимем от отступа некоторую положительную величину $\xi_i$, но потребуем чтобы эти введённые поправки были минимальны. Это приведёт к следующей постановке задачи, называемой также ''SVM с мягким отступом'' (англ. ''soft-margin SVM''):&lt;br /&gt;
&lt;br /&gt;
$\begin{cases}&lt;br /&gt;
\frac{1}{2} \lVert \vec{w} \rVert^2 \color{brown}{+ C \sum\limits_{i=1}^\ell \xi_i} \to \min\limits_{w, b, \color{brown}{\xi}} \\&lt;br /&gt;
M_i(\vec{w}, b) \geq 1 \color{brown}{- \xi_i}, \quad i = 1, \ldots, \ell \\&lt;br /&gt;
\color{brown}{\xi_i \geq 0, \quad i = 1, \ldots, \ell} \\&lt;br /&gt;
\end{cases}$&lt;br /&gt;
&lt;br /&gt;
Мы не знаем, какой из функционалов $\frac{1}{2} \lVert \vec{w} \rVert^2$ и $\sum\limits_{i=1}^\ell \xi_i$ важнее, поэтому вводим коэффициент $C$, который будем оптимизировать с помощью кросс-валидации. В итоге мы получили задачу, у которой всегда есть единственное решение.&lt;br /&gt;
&lt;br /&gt;
Заметим, что мы можем упростить постановку задачи:&lt;br /&gt;
&lt;br /&gt;
$\begin{cases}&lt;br /&gt;
\xi_i \geq 0 \\&lt;br /&gt;
\xi_i \geq 1 - M_i(\vec{w}, b) \\&lt;br /&gt;
\sum\limits_{i=1}^\ell \xi_i \to \min&lt;br /&gt;
\end{cases} &lt;br /&gt;
\,\Rightarrow\,&lt;br /&gt;
\begin{cases} &lt;br /&gt;
\xi_i \geq \max(0, 1 - M_i(\vec{w}, b)) \\&lt;br /&gt;
\sum\limits_{i=1}^\ell \xi_i \to \min&lt;br /&gt;
\end{cases}&lt;br /&gt;
\,\Rightarrow\,&lt;br /&gt;
\xi_i = (1- M_i(\vec{w}, b))_+$&lt;br /&gt;
&lt;br /&gt;
Получим эквивалентную задачу безусловной минимизации:&lt;br /&gt;
&lt;br /&gt;
$\frac{1}{2} \lVert \vec{w} \rVert^2 + C \sum\limits_{i=1}^\ell \left(1 - M_i(\vec{w}, b)\right)_+ \to \min\limits_{w, b}$&lt;br /&gt;
&lt;br /&gt;
Теперь научимся её решать.&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|id=kkt&lt;br /&gt;
|author=Условия Каруша—Куна—Таккера&lt;br /&gt;
|statement=&lt;br /&gt;
Пусть поставлена задача нелинейного программирования с ограничениями:&lt;br /&gt;
$$&lt;br /&gt;
\begin{cases}&lt;br /&gt;
f(x) \to \min\limits_{x \in X} \\&lt;br /&gt;
g_i(x) \leq 0,\;i=1\ldots m \\&lt;br /&gt;
h_j(x) = 0,\;j=1\ldots k&lt;br /&gt;
\end{cases}&lt;br /&gt;
$$&lt;br /&gt;
&lt;br /&gt;
Если $x$ — точка локального минимума при наложенных ограничениях, то существуют такие множители $\mu_i, i = 1\ldots m$, $\;\lambda_j, j = 1\ldots k$, что для функции Лагранжа $L(x; \mu, \lambda)$ выполняются условия:&lt;br /&gt;
&lt;br /&gt;
$$\begin{cases}\frac{\partial L}{\partial x} = 0, \quad L(x; \mu, \lambda) = f(x) + \sum\limits_{i=1}^m \mu_i g_i(x) + \sum\limits_{j=1}^k \lambda_j h_j(x) \\ g_i(x) \leq 0,\;h_j(x) = 0 \quad \text{(исходные ограничения)} \\ \mu_i \geq 0 \quad \text{(двойственные ограничения)} \\ \mu_i g_i(x) = 0 \quad \text{(условие дополняющей нежёсткости)} \end{cases}$$&lt;br /&gt;
&lt;br /&gt;
При этом искомая точка является седловой точкой функции Лагранжа: минимумом по $x$ и максимумом по двойственным переменным $\mu$.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
По теореме Каруша—Куна—Таккера, поставленная нами задача минимизации эквивалентна двойственной задаче поиска седловой точки функции Лагранжа:&lt;br /&gt;
&lt;br /&gt;
$\mathscr{L}(\vec{w},b,\xi; \lambda, \eta) = \frac{1}{2} \lVert w \rVert^2 - \sum\limits_{i=1}^\ell \lambda_i \left(M_i(\vec{w}, b) - 1\right) - \sum\limits_{i=1}^\ell \xi_i \left(\lambda_i + \eta_i - C\right)$&lt;br /&gt;
&lt;br /&gt;
$\lambda_i$ — переменные, двойственные к ограничениям $M_i \geq 1 - \xi_i$&lt;br /&gt;
&lt;br /&gt;
$\eta_i$ — переменные, двойственные к ограничениям $\xi_i \geq 0$&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Запишем необходимые условия седловой точки функции Лагранжа:&lt;br /&gt;
&lt;br /&gt;
$\begin{cases}&lt;br /&gt;
\frac{\partial \mathscr{L}}{\partial w} = 0, \quad \frac{\partial \mathscr{L}}{\partial b} = 0, \quad \frac{\partial \mathscr{L}}{\partial \xi} = 0 \\&lt;br /&gt;
\xi_i \geq 0, \quad \lambda_i \geq 0, \quad \eta_i \geq 0, &amp;amp;&amp;amp; i = 1, \ldots, \ell \\&lt;br /&gt;
\lambda_i = 0 \;\text{либо}\; M_i(\vec{w},b) = 1 - \xi_i, &amp;amp;&amp;amp; i = 1, \ldots, \ell \\&lt;br /&gt;
\eta_i = 0 \;\text{либо}\; \xi_i = 0, &amp;amp;&amp;amp; i = 1, \ldots, \ell&lt;br /&gt;
\end{cases}$&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Продифференцируем функцию Лагранжа и приравняем к нулю производные. Получим следующие ограничения:&lt;br /&gt;
&lt;br /&gt;
$\begin{array}{lcl}&lt;br /&gt;
\frac{\partial \mathscr{L}}{\partial w} = \vec{w} - \sum\limits_{i=1}^\ell \lambda_i y_i \vec{x}_i = 0 &amp;amp; \Rightarrow &amp;amp; \vec{w} = \sum\limits_{i=1}^\ell \lambda_i y_i \vec{x}_i \\&lt;br /&gt;
\frac{\partial \mathscr{L}}{\partial b} = -\sum\limits_{i=1}^\ell \lambda_i y_i = 0 &amp;amp; \Rightarrow &amp;amp; \sum\limits_{i=1}^\ell \lambda_i y_i = 0 \\&lt;br /&gt;
\frac{\partial \mathscr{L}}{\partial \xi_i} = -\lambda_i - \eta_i + C = 0 &amp;amp; \Rightarrow &amp;amp; \eta_i + \lambda_i = C, \quad i = 1, \ldots, \ell&lt;br /&gt;
\end{array}$&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Заметим, что $\eta_i \geq 0$, $\lambda_i \geq 0$, $C &amp;gt; 0$, поэтому из последнего ограничения получаем $0 \leq \eta_i \leq C$, $0 \leq \lambda_i \leq C$. &lt;br /&gt;
&lt;br /&gt;
Диапазон значений $\lambda_i$ (которые, как указано выше, соответствуют ограничениям на величину отступа) позволяет нам разделить объекты обучающей выборки на три типа:&lt;br /&gt;
&lt;br /&gt;
# $\lambda_i = 0 \; \Rightarrow \; \eta_i = C; \; \xi_i = 0; \; M_i \geq 1 \;$ — периферийные (неинформативные) объекты &amp;lt;br&amp;gt; Эти объекты лежат в своём классе, классифицируются верно и не влияют на выбор разделяющей гиперплоскости (см. уравнение для $\vec{w}$)&lt;br /&gt;
# $0 &amp;lt; \lambda_i &amp;lt; C \; \Rightarrow \; 0 &amp;lt; \eta_i &amp;lt; C; \; \xi_i = 0; \; M_i = 1 \;$ — опорные граничные объекты &amp;lt;br&amp;gt; Эти объекты лежат ровно на границе разделяющей полосы на стороне своего класса&lt;br /&gt;
# $\lambda_i = C \; \Rightarrow \; \eta_i = 0; \; \xi_i &amp;gt; 0; \; M_i &amp;lt; 1 \;$ — опорные объекты-нарушители &amp;lt;br&amp;gt; Эти объекты лежат внутри разделяющей полосы или на стороне чужого класса&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
'''Опорный объект''' (опорный вектор, англ. ''support vector'') — объект $\vec{x}_i$, соответствующий которому множитель Лагранжа отличен от нуля: $\lambda_i \neq 0$.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Теперь подставим ограничения, которые мы получили при дифференцировании, в функцию Лагранжа. Получим следующую постановку двойственной задачи, которая зависит только от двойственных переменных $\lambda$:&lt;br /&gt;
&lt;br /&gt;
$\begin{cases}&lt;br /&gt;
-\mathscr{L}(\lambda) = -\sum\limits_{i=1}^\ell \lambda_i + \frac{1}{2} \sum\limits_{i=1}^\ell \sum\limits_{j=1}^\ell \lambda_i \lambda_j y_i y_j \langle \vec{x}_i, \vec{x}_j \rangle \to \min\limits_\lambda \\&lt;br /&gt;
0 \leq \lambda_i \leq C, \quad i = 1, \ldots, \ell \\&lt;br /&gt;
\sum\limits_{i=1}^\ell \lambda_i y_i = 0&lt;br /&gt;
\end{cases}$&lt;br /&gt;
&lt;br /&gt;
Это также задача квадратичного программирования. Решение задачи лежит в пересечении $\ell$-мерного куба с ребром $C$ и гиперплоскости $\langle \lambda, y \rangle = 0$, что является выпуклым многогранником размерности $\ell-1$. В этом многограннике нужно найти минимум выпуклого квадратичного функционала. Следовательно, данная задача имеет единственное решение.&lt;br /&gt;
&lt;br /&gt;
Существуют различные методы поиска решения: можно воспользоваться универсальным солвером задачи квадратичного программирования ([[CPLEX]], [[Gurobi]]), либо алгоритмом, учитывающим специфические особенности SVM ([[SMO]], [[INCAS]]).&lt;br /&gt;
&lt;br /&gt;
После того, как мы получили вектор коэффициентов $\vec{\lambda}$, можем выразить решение прямой задачи через решение двойственной:&lt;br /&gt;
&lt;br /&gt;
$\begin{cases}&lt;br /&gt;
\vec{w} = \sum\limits_{i=1}^\ell \lambda_i y_i \vec{x}_i \\&lt;br /&gt;
b = \langle \vec{w}, \vec{x}_i \rangle - y_i, \quad \text{для любого}\; i: \lambda_i &amp;gt; 0, M_i = 1&lt;br /&gt;
\end{cases}$&lt;br /&gt;
&lt;br /&gt;
На практике для повышения вычислительной устойчивости рекомендуется при расчёте $b$ брать медиану по опорным граничным объектам:&lt;br /&gt;
&lt;br /&gt;
$b = med\{ \langle \vec{w}, \vec{x}_i \rangle - y_i : \lambda_i &amp;gt; 0, M_i = 1, i = 1, \ldots, \ell\}$&lt;br /&gt;
&lt;br /&gt;
Теперь можем переписать наш линейный классификатор, выразив $\vec{w}$ через $\vec{\lambda}$:&lt;br /&gt;
&lt;br /&gt;
$a(x) = sign \left(\sum\limits_{i=1}^\ell \lambda_i y_i \langle \vec{x}_i, \vec{x} \rangle - b\right)$&lt;br /&gt;
&lt;br /&gt;
=== Нелинейное обобщение, kernel trick ===&lt;br /&gt;
&lt;br /&gt;
Существует ещё один подход к решению проблемы линейной разделимости, известный как трюк с ядом (kernel trick). Если выборка объектов с признаковым описанием из $X = \mathbb{R}^n$ не является линейно разделимой, мы можем предположить, что существует некоторое пространство $H$, вероятно, большей размерности, при переходе в которое выборка станет линейно разделимой. Пространство $H$ здесь называют спрямляющим, а функцию перехода $\psi : X \to H$ — спрямляющим отображением. Построение SVM в таком случае происходит так же, как и раньше, но в качестве векторов признаковых описаний используются векторы $\psi(\vec{x})$, а не $\vec{x}$. Соответственно, скалярное произведение $\langle \vec{x}_1, \vec{x}_2 \rangle$ в пространстве $X$ везде заменяется скалярным произведением $\langle \psi(\vec{x}_1), \psi(\vec{x}_2) \rangle$ в пространстве $H$. Отсюда следует, что пространство $H$ должно быть гильбертовым, так как в нём должно быть определено скалярное произведение.&lt;br /&gt;
&lt;br /&gt;
Обратим внимание на то, что постановка задачи и алгоритм классификации не используют в явном виде признаковое описание и оперируют только скалярными произведениями признаков объектов. Это даёт возможность заменить скалярное произведение в пространстве $X$ на скалярное произведение в $H$:&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
'''Ядро''' (англ. ''kernel'') — функция $K: X \times X \to \mathbb{R}$, которая является скалярным произведением в некотором спрямляющем пространстве: $K(\vec{x}_1, \vec{x}_2) = \langle \psi(\vec{x}_1), \psi(\vec{x}_2) \rangle$ при некотором $\psi : X \to H$, где $H$ — пространство со скалярным произведением.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Более того, можно вообще не строить спрямляющее пространство $H$ в явном виде, и вместо подбора $\psi$ подбирать непосредственно ядро. &lt;br /&gt;
&lt;br /&gt;
Постановка задачи с применением ядер приобретает вид:&lt;br /&gt;
&lt;br /&gt;
$\begin{cases}&lt;br /&gt;
-\mathscr{L}(\lambda) = -\sum\limits_{i=1}^\ell \lambda_i + \frac{1}{2} \sum\limits_{i=1}^\ell \sum\limits_{j=1}^\ell \lambda_i \lambda_j y_i y_j \color{brown}{K(\vec{x}_i, \vec{x}_j)} \to \min\limits_\lambda \\&lt;br /&gt;
0 \leq \lambda_i \leq C, \quad i = 1, \ldots, \ell \\&lt;br /&gt;
\sum\limits_{i=1}^\ell \lambda_i y_i = 0&lt;br /&gt;
\end{cases}$&lt;br /&gt;
&lt;br /&gt;
$a(x) = sign \left(\sum\limits_{i=1}^\ell \lambda_i y_i \color{brown}{K(\vec{x}_i, \vec{x})} - b\right)$&lt;br /&gt;
&lt;br /&gt;
Теперь осталось рассмотреть вопрос выбора ядра для задачи. Теорема Мерсера определяет условия, при которых функция может являться ядром:&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|id=kernel&lt;br /&gt;
|author=Мерсер&lt;br /&gt;
|statement=&lt;br /&gt;
Функция $K(\vec{x}_1, \vec{x}_2)$ является ядром тогда и только тогда, когда выполнены условия: &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
$\begin{cases}K(\vec{x}_1, \vec{x}_2) = K(\vec{x}_2, \vec{x}_1) &amp;amp; \text{(симметричность)} \\[1ex] \forall g: X \to \mathbb{R} \quad \int\limits_X \int\limits_X K(\vec{x}_1, \vec{x}_2) g(\vec{x}_1) g(\vec{x}_2) d \vec{x}_1 d \vec{x}_2 \geq 0 &amp;amp; \text{(неотрицательная определенность)}\end{cases}$&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Проверка неотрицательной определённости является довольно трудоёмкой, поэтому на практике теорема явно не используется. Проблема выбора лучшего ядра на сегодняшний день остаётся открытой, лучшие из известных на данный момент решений основываются на генетических алгоритмах&amp;lt;ref&amp;gt;[https://www.researchgate.net/publication/221080223_An_Evolutionary_Approach_to_Automatic_Kernel_Construction T.Howley, M.G.Madden — An Evolutionary Approach to Automatic Kernel Construction]&amp;lt;/ref&amp;gt;). Обычно в практических реализациях ограничиваются перебором нескольких функций, про которые известно, что они являются ядрами, и выбирают среди них лучшую при помощи кросс-валидации. Кроме того, существуют правила порождения ядер, которые также применяются для расширения пространства перебираемых функций.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Конструктивные методы синтеза ядер:&lt;br /&gt;
&lt;br /&gt;
# $K(\vec{x}_1, \vec{x}_2) = \langle \vec{x}_1, \vec{x}_2 \rangle \quad$ (скалярное произведение)&lt;br /&gt;
# $K(\vec{x}_1, \vec{x}_2) = \alpha \quad$ (константа $\alpha \in \mathbb{R}_+$)&lt;br /&gt;
# $K(\vec{x}_1, \vec{x}_2) = K_1(\vec{x}_1, \vec{x}_2) + K_2(\vec{x}_1, \vec{x}_2) \quad$ (сумма ядер)&lt;br /&gt;
# $K(\vec{x}_1, \vec{x}_2) = K_1(\vec{x}_1, \vec{x}_2) * K_2(\vec{x}_1, \vec{x}_2) \quad$ (произведение ядер)&lt;br /&gt;
# $K(\vec{x}_1, \vec{x}_2) = \psi(\vec{x}_1) * \psi(\vec{x}_2) \quad$ (произведение функций $\psi : X \to \mathbb{R}$)&lt;br /&gt;
# $K(\vec{x}_1, \vec{x}_2) = K_1(\phi(\vec{x}_1), \phi(\vec{x}_2)) \quad$ (композиция ядра и функции $\phi : X \to X$)&lt;br /&gt;
# $K(\vec{x}_1, \vec{x}_2) = \int\limits_X s(\vec{x}_1, \vec{z}) s(\vec{x}_2, \vec{z}) d \vec{z} \quad$ ($s : X \times X \to \mathbb{R}$ — симметричная интегрируемая функция)&lt;br /&gt;
# $K(\vec{x}_1, \vec{x}_2) = f(K_1(\vec{x}_1, \vec{x}_2)) \quad$ ($f: \mathbb{R} \to \mathbb{R}$ представима в виде сходящегося степенного ряда с неотрицательными коэффициентами)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Существует несколько &amp;quot;стандартных&amp;quot; ядер, которые соответствуют известным алгоритмам классификации:&lt;br /&gt;
&lt;br /&gt;
* $K(\vec{x}_1, \vec{x}_2) = (\langle \vec{x}_1, \vec{x}_2 \rangle + c)^d, \quad c, d \in \mathbb{R}$ — полиномиальное ядро&lt;br /&gt;
* $K(\vec{x}_1, \vec{x}_2) = \sigma(\langle \vec{x}_1, \vec{x}_2 \rangle)$ — нейросеть с заданной функцией активации $\sigma(z)$ (не при всех $\sigma$ является ядром)&lt;br /&gt;
* $K(\vec{x}_1, \vec{x}_2) = \exp(-\beta \lVert \vec{x}_1 - \vec{x}_2 \rVert^2)$ — сеть радиальных базисных функций (англ. ''RBF'')&lt;br /&gt;
&lt;br /&gt;
== Преимущества и недостатки SVM ==&lt;br /&gt;
&lt;br /&gt;
Преимущества SVM перед методом стохастического градиента и нейронными сетями:&lt;br /&gt;
&lt;br /&gt;
* Задача выпуклого квадратичного программирования хорошо изучена и имеет единственное решение&lt;br /&gt;
* Метод опорных векторов эквивалентен двухслойной нейронной сети, где число нейронов на скрытом слое определяется автоматически как число опорных векторов&lt;br /&gt;
* Принцип оптимальной разделяющей гиперплоскости приводит к максимизации ширины разделяющей полосы, а следовательно, к более уверенной классификации&lt;br /&gt;
&lt;br /&gt;
Недостатки классического SVM:&lt;br /&gt;
&lt;br /&gt;
* Неустойчивость к шуму: выбросы в исходных данных становятся опорными объектами-нарушителями и напрямую влияют на построение разделяющей гиперплоскости&lt;br /&gt;
* Не описаны общие методы построения ядер и спрямляющих пространств, наиболее подходящих для конкретной задачи&lt;br /&gt;
* Нет отбора признаков&lt;br /&gt;
* Необходимо подбирать константу $C$ при помощи кросс-валидации&lt;br /&gt;
&lt;br /&gt;
== Модификации ==&lt;br /&gt;
&lt;br /&gt;
Существуют различные дополнения и модификации метода опорных векторов, направленные на устранение описанных недостатков:&lt;br /&gt;
&lt;br /&gt;
* [[Метод релевантных векторов (Relevance Vector Machine, RVM)]]&lt;br /&gt;
* [[1-norm SVM (LASSO SVM)]]&lt;br /&gt;
* [[Doubly Regularized SVM (ElasticNet SVM)]]&lt;br /&gt;
* [[Support Features Machine (SFM)]]&lt;br /&gt;
* [[Relevance Features Machine (RFM)]]&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
* [[Обзор библиотек для машинного обучения на Python]]&lt;br /&gt;
* [[Общие понятия]]&lt;br /&gt;
&lt;br /&gt;
== Примечания ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
* [http://www.machinelearning.ru/wiki/index.php?title=%D0%9C%D0%B0%D1%88%D0%B8%D0%BD%D0%B0_%D0%BE%D0%BF%D0%BE%D1%80%D0%BD%D1%8B%D1%85_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2 machinelearning.ru — Машина опорных векторов]&lt;br /&gt;
* [https://www.youtube.com/watch?v=Adi67_94_gc&amp;amp;list=PLJOzdkh8T5kp99tGTEFjH_b9zqEQiiBtC&amp;amp;index=5 Лекция &amp;quot;Линейные методы классификации: метод опорных векторов&amp;quot;]  — К.В. Воронцов, курс &amp;quot;Машинное обучение&amp;quot; 2014&lt;br /&gt;
* [https://ru.wikipedia.org/wiki/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%BE%D0%BF%D0%BE%D1%80%D0%BD%D1%8B%D1%85_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2 Wikipedia — Метод опорных векторов]&lt;br /&gt;
* Alexey Nefedov — [https://svmtutorial.online/ Support Vector Machines: A Simple Tutorial]&lt;br /&gt;
* John Platt — [https://www.microsoft.com/en-us/research/publication/sequential-minimal-optimization-a-fast-algorithm-for-training-support-vector-machines/ Sequential Minimal Optimization: A Fast Algorithm for Training Support Vector Machines]&lt;br /&gt;
* Shai Fine, Katya Scheinberg — [http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.10.9956 INCAS: An Incremental Active Set Method for SVM]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Машинное обучение]]&lt;br /&gt;
[[Категория: Классификация]]&lt;br /&gt;
[[Категория: Регрессия]]&lt;/div&gt;</summary>
		<author><name>Egormkn</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%BE%D0%BF%D0%BE%D1%80%D0%BD%D1%8B%D1%85_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2_(SVM)&amp;diff=70697</id>
		<title>Метод опорных векторов (SVM)</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%BE%D0%BF%D0%BE%D1%80%D0%BD%D1%8B%D1%85_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2_(SVM)&amp;diff=70697"/>
				<updated>2019-04-02T22:20:12Z</updated>
		
		<summary type="html">&lt;p&gt;Egormkn: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{в разработке}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Метод опорных векторов''' (англ. ''support vector machine'', ''SVM'') — один из наиболее популярных методов обучения, который применяется для решения задач классификации и регрессии. Основная идея метода заключается в построении гиперплоскости, разделяющей объекты выборки наиболее оптимальным способом. Алгоритм работает в предположении, что чем больше расстояние (зазор) между разделяющей гиперплоскостью и объектами разделяемых классов, тем меньше будет средняя ошибка классификатора.&lt;br /&gt;
&lt;br /&gt;
== Метод опорных векторов в задаче классификации ==&lt;br /&gt;
&lt;br /&gt;
Рассмотрим задачу бинарной классификации, в которой объектам из $X=\mathbb{R}^n$ соответствует один из двух классов $Y = \{-1, +1\}$.&lt;br /&gt;
&lt;br /&gt;
Пусть задана обучающая выборка пар &amp;quot;объект-ответ&amp;quot;: $T^\ell = (\vec{x}_i, y_i)_{i=1}^\ell$. Необходимо построить алгоритм классификации $a(\vec{x}) : X \to Y$.&lt;br /&gt;
&lt;br /&gt;
=== Разделяющая гиперплоскость ===&lt;br /&gt;
&lt;br /&gt;
[[Файл:svm_hyperplane.png|300px|thumb|right|Примеры разделяющих гиперплоскостей в $\mathbb{R}^2$]]&lt;br /&gt;
&lt;br /&gt;
В пространстве $\mathbb{R}^n$ уравнение $\langle \vec{w}, \vec{x} \rangle - b = 0$ при заданных $\vec{w}$ и $b$ определяет гиперплоскость — множество векторов $\vec{x} = (x_1, \ldots, x_n)$, принадлежащих пространству меньшей размерности $\mathbb{R}^{n-1}$. Например, для $\mathbb{R}^1$ гиперплоскостью является точка, для $\mathbb{R}^2$ — прямая, для $\mathbb{R}^3$ — плоскость и т.д. Параметр $\vec{w}$ определяет вектор нормали к гиперплоскости, а через $\frac{b}{\lVert \vec{w} \rVert}$ выражается расстояние от гиперплоскости до начала координат.&lt;br /&gt;
&lt;br /&gt;
Гиперплоскость делит $\mathbb{R}^n$ на два полупространства: $\langle \vec{w}, \vec{x} \rangle - b &amp;gt; 0$ и $\langle \vec{w}, \vec{x} \rangle - b &amp;lt; 0$. &lt;br /&gt;
&lt;br /&gt;
Говорят, что гиперплоскость разделяет два класса $C_1$ и $C_2$, если объекты этих классов лежат по разные стороны от гиперплоскости, то есть выполнено либо&lt;br /&gt;
&lt;br /&gt;
$\begin{cases}\langle \vec{w}, \vec{x} \rangle - b &amp;gt; 0, &amp;amp;&amp;amp; \forall x \in C_1 \\ \langle \vec{w}, \vec{x} \rangle - b &amp;lt; 0, &amp;amp;&amp;amp; \forall x \in C_2\end{cases}$&lt;br /&gt;
&lt;br /&gt;
либо&lt;br /&gt;
&lt;br /&gt;
$\begin{cases}\langle \vec{w}, \vec{x} \rangle - b &amp;lt; 0, &amp;amp;&amp;amp; \forall x \in C_1 \\ \langle \vec{w}, \vec{x} \rangle - b &amp;gt; 0, &amp;amp;&amp;amp; \forall x \in C_2\end{cases}$&lt;br /&gt;
&lt;br /&gt;
=== Линейно разделимая выборка ===&lt;br /&gt;
&lt;br /&gt;
Пусть выборка линейно разделима, то есть существует некоторая гиперплоскость, разделяющая классы $-1$ и $+1$. Тогда в качестве алгоритма классификации можно использовать линейный пороговый классификатор:&lt;br /&gt;
&lt;br /&gt;
$a(\vec{x}) = sign(\langle \vec{w}, \vec{x} \rangle - b) = sign\left(\sum\limits_{i=1}^\ell w_i x_i - b\right)$&lt;br /&gt;
&lt;br /&gt;
где $\vec{x} = (x_1, \ldots, x_n)$ — вектор значений признаков объекта, а $\vec{w} = (w_1, \ldots, w_n) \in \mathbb{R}^n$ и $b \in \mathbb{R}$ — параметры гиперплоскости.&lt;br /&gt;
&lt;br /&gt;
Но для двух линейно разделимых классов возможны различные варианты построения разделяющих гиперплоскостей. Метод опорных векторов выбирает ту гиперплоскость, которая максимизирует отступ между классами:&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
'''Отступ''' (англ. ''margin'') — характеристика, оценивающая, насколько объект &amp;quot;погружён&amp;quot; в свой класс, насколько типичным представителем класса он является. Чем меньше значение отступа $M_i$, тем ближе объект $\vec{x}_i$ подходит к границе классов и тем выше становится вероятность ошибки. Отступ $M_i$ отрицателен тогда и только тогда, когда алгоритм $a(x)$ допускает ошибку на объекте $\vec{x}_i$. &amp;lt;br&amp;gt;&amp;lt;br&amp;gt; Для линейного классификатора отступ определяется уравнением: $M_i(\vec{w}, b) = y_i(\langle \vec{w}, \vec{x}_i \rangle - b)$&lt;br /&gt;
}}&lt;br /&gt;
Если выборка линейно разделима, то существует такая гиперплоскость, отступ от которой до каждого объекта положителен:&lt;br /&gt;
&lt;br /&gt;
$\exists \vec{w}, b : \; M_i(\vec{w}, b) = y_i(\langle \vec{w}, \vec{x}_i \rangle - b) &amp;gt; 0, \; i = 1\ldots\ell$&lt;br /&gt;
&lt;br /&gt;
Мы хотим построить такую разделяющую гиперплоскость, чтобы объекты обучающей выборки находились на наибольшем расстоянии от неё.&lt;br /&gt;
&lt;br /&gt;
[[Файл:SVM_margin.png|300px|thumb|right|Оптимальная разделяющая гиперплоскость в $\mathbb{R}^2$]]&lt;br /&gt;
Заметим, что при умножении $\vec{w}$ и $b$ на константу $c \neq 0$ уравнение $\langle c\vec{w}, \vec{x} \rangle - cb = 0$ определяет ту же самую гиперплоскость, что и $\langle \vec{w}, \vec{x} \rangle - b = 0$. Для удобства проведём нормировку: выберем константу $c$ таким образом, чтобы $\min M_i(\vec{w}, b) = 1$. При этом в каждом из двух классов найдётся хотя бы один &amp;quot;граничный&amp;quot; объект обучающей выборки, отступ которого равен этому минимуму: иначе можно было бы сместить гиперплоскость в сторону класса с большим отступом, тем самым увеличив минимальное расстояние от гиперплоскости до объектов обучающей выборки. &lt;br /&gt;
&lt;br /&gt;
Обозначим любой &amp;quot;граничный&amp;quot; объект из класса $+1$ как $\vec{x}_+$, из класса $-1$ как $\vec{x}_-$. Их отступ равен единице, то есть&lt;br /&gt;
&lt;br /&gt;
$\begin{cases}&lt;br /&gt;
M_+(\vec{w}, b) = (+1)(\langle \vec{w}, \vec{x}_+ \rangle - b) = 1 \\&lt;br /&gt;
M_-(\vec{w}, b) = (-1)(\langle \vec{w}, \vec{x}_- \rangle - b) = 1&lt;br /&gt;
\end{cases}$&lt;br /&gt;
&lt;br /&gt;
Нормировка позволяет ограничить разделяющую полосу между классами: $\{x: -1 &amp;lt; \langle \vec{w}, \vec{x}_i \rangle - b &amp;lt; 1\}$. Внутри неё не может лежать ни один объект обучающей выборки. Ширину разделяющей полосы можно выразить как проекцию вектора $\vec{x}_+ - \vec{x}_-$ на нормаль к гиперплоскости $\vec{w}$. Чтобы разделяющая гиперплоскость находилась на наибольшем расстоянии от точек выборки, ширина полосы должна быть максимальной: &lt;br /&gt;
&lt;br /&gt;
$\frac{\langle \vec{x}_+ - \vec{x}_-, \vec{w} \rangle}{\lVert w \rVert} = \frac{\langle \vec{x}_+, \vec{w} \rangle - \langle \vec{x}_-, \vec{w} \rangle - b + b}{\lVert w \rVert} = \frac{(+1)\left(\langle \vec{x}_+, \vec{w} \rangle - b\right) \, + \, (-1)\left(\langle \vec{x}_-, \vec{w} \rangle - b\right)}{\lVert w \rVert} = \\ = \frac{M_+(\vec{w}, b) \, + \, M_-(\vec{w}, b)}{\lVert w \rVert} = \frac{2}{\lVert w \rVert} \to \max \; \Rightarrow \; \lVert w \rVert \to \min$&lt;br /&gt;
&lt;br /&gt;
Это приводит нас к постановке задачи оптимизации в терминах квадратичного программирования:&lt;br /&gt;
&lt;br /&gt;
$\begin{cases}&lt;br /&gt;
\lVert \vec{w} \rVert^2 \to \min\limits_{w,b} \\&lt;br /&gt;
M_i(\vec{w}, b) \geq 1, \quad i = 1, \ldots, \ell&lt;br /&gt;
\end{cases}$&lt;br /&gt;
&lt;br /&gt;
=== Линейно неразделимая выборка ===&lt;br /&gt;
&lt;br /&gt;
На практике линейно разделимые выборки практически не встречаются: в данных возможны выбросы и нечёткие границы между классами. В таком случае поставленная выше задача не имеет решений, и необходимо ослабить ограничения, позволив некоторым объектам попадать на &amp;quot;территорию&amp;quot; другого класса. Для каждого объекта отнимем от отступа некоторую положительную величину $\xi_i$, но потребуем чтобы эти введённые поправки были минимальны. Это приведёт к следующей постановке задачи, называемой также ''SVM с мягким отступом'' (англ. ''soft-margin SVM''):&lt;br /&gt;
&lt;br /&gt;
$\begin{cases}&lt;br /&gt;
\frac{1}{2} \lVert \vec{w} \rVert^2 \color{brown}{+ C \sum\limits_{i=1}^\ell \xi_i} \to \min\limits_{w, b, \color{brown}{\xi}} \\&lt;br /&gt;
M_i(\vec{w}, b) \geq 1 \color{brown}{- \xi_i}, \quad i = 1, \ldots, \ell \\&lt;br /&gt;
\color{brown}{\xi_i \geq 0, \quad i = 1, \ldots, \ell} \\&lt;br /&gt;
\end{cases}$&lt;br /&gt;
&lt;br /&gt;
Мы не знаем, какой из функционалов $\frac{1}{2} \lVert \vec{w} \rVert^2$ и $\sum\limits_{i=1}^\ell \xi_i$ важнее, поэтому вводим коэффициент $C$, который будем оптимизировать с помощью кросс-валидации. В итоге мы получили задачу, у которой всегда есть единственное решение.&lt;br /&gt;
&lt;br /&gt;
Заметим, что мы можем упростить постановку задачи:&lt;br /&gt;
&lt;br /&gt;
$\begin{cases}&lt;br /&gt;
\xi_i \geq 0 \\&lt;br /&gt;
\xi_i \geq 1 - M_i(\vec{w}, b) \\&lt;br /&gt;
\sum\limits_{i=1}^\ell \xi_i \to \min&lt;br /&gt;
\end{cases} &lt;br /&gt;
\,\Rightarrow\,&lt;br /&gt;
\begin{cases} &lt;br /&gt;
\xi_i \geq \max(0, 1 - M_i(\vec{w}, b)) \\&lt;br /&gt;
\sum\limits_{i=1}^\ell \xi_i \to \min&lt;br /&gt;
\end{cases}&lt;br /&gt;
\,\Rightarrow\,&lt;br /&gt;
\xi_i = (1- M_i(\vec{w}, b))_+$&lt;br /&gt;
&lt;br /&gt;
Получим эквивалентную задачу безусловной минимизации:&lt;br /&gt;
&lt;br /&gt;
$\frac{1}{2} \lVert \vec{w} \rVert^2 + C \sum\limits_{i=1}^\ell \left(1 - M_i(\vec{w}, b)\right)_+ \to \min\limits_{w, b}$&lt;br /&gt;
&lt;br /&gt;
Теперь научимся её решать.&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|id=kkt&lt;br /&gt;
|author=Условия Каруша—Куна—Таккера&lt;br /&gt;
|statement=&lt;br /&gt;
Пусть поставлена задача нелинейного программирования с ограничениями:&lt;br /&gt;
$$&lt;br /&gt;
\begin{cases}&lt;br /&gt;
f(x) \to \min\limits_{x \in X} \\&lt;br /&gt;
g_i(x) \leq 0,\;i=1\ldots m \\&lt;br /&gt;
h_j(x) = 0,\;j=1\ldots k&lt;br /&gt;
\end{cases}&lt;br /&gt;
$$&lt;br /&gt;
&lt;br /&gt;
Если $x$ — точка локального минимума при наложенных ограничениях, то существуют такие множители $\mu_i, i = 1\ldots m$, $\;\lambda_j, j = 1\ldots k$, что для функции Лагранжа $L(x; \mu, \lambda)$ выполняются условия:&lt;br /&gt;
&lt;br /&gt;
$$\begin{cases}\frac{\partial L}{\partial x} = 0, \quad L(x; \mu, \lambda) = f(x) + \sum\limits_{i=1}^m \mu_i g_i(x) + \sum\limits_{j=1}^k \lambda_j h_j(x) \\ g_i(x) \leq 0,\;h_j(x) = 0 \quad \text{(исходные ограничения)} \\ \mu_i \geq 0 \quad \text{(двойственные ограничения)} \\ \mu_i g_i(x) = 0 \quad \text{(условие дополняющей нежёсткости)} \end{cases}$$&lt;br /&gt;
&lt;br /&gt;
При этом искомая точка является седловой точкой функции Лагранжа: минимумом по $x$ и максимумом по двойственным переменным $\mu$.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
По теореме Каруша—Куна—Таккера, поставленная нами задача минимизации эквивалентна двойственной задаче поиска седловой точки функции Лагранжа:&lt;br /&gt;
&lt;br /&gt;
$\mathscr{L}(\vec{w},b,\xi; \lambda, \eta) = \frac{1}{2} \lVert w \rVert^2 - \sum\limits_{i=1}^\ell \lambda_i \left(M_i(\vec{w}, b) - 1\right) - \sum\limits_{i=1}^\ell \xi_i \left(\lambda_i + \eta_i - C\right)$&lt;br /&gt;
&lt;br /&gt;
$\lambda_i$ — переменные, двойственные к ограничениям $M_i \geq 1 - \xi_i$&lt;br /&gt;
&lt;br /&gt;
$\eta_i$ — переменные, двойственные к ограничениям $\xi_i \geq 0$&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Запишем необходимые условия седловой точки функции Лагранжа:&lt;br /&gt;
&lt;br /&gt;
$\begin{cases}&lt;br /&gt;
\frac{\partial \mathscr{L}}{\partial w} = 0, \quad \frac{\partial \mathscr{L}}{\partial b} = 0, \quad \frac{\partial \mathscr{L}}{\partial \xi} = 0 \\&lt;br /&gt;
\xi_i \geq 0, \quad \lambda_i \geq 0, \quad \eta_i \geq 0, &amp;amp;&amp;amp; i = 1, \ldots, \ell \\&lt;br /&gt;
\lambda_i = 0 \;\text{либо}\; M_i(\vec{w},b) = 1 - \xi_i, &amp;amp;&amp;amp; i = 1, \ldots, \ell \\&lt;br /&gt;
\eta_i = 0 \;\text{либо}\; \xi_i = 0, &amp;amp;&amp;amp; i = 1, \ldots, \ell&lt;br /&gt;
\end{cases}$&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Продифференцируем функцию Лагранжа и приравняем к нулю производные. Получим следующие ограничения:&lt;br /&gt;
&lt;br /&gt;
$\begin{array}{lcl}&lt;br /&gt;
\frac{\partial \mathscr{L}}{\partial w} = \vec{w} - \sum\limits_{i=1}^\ell \lambda_i y_i \vec{x}_i = 0 &amp;amp; \Rightarrow &amp;amp; \vec{w} = \sum\limits_{i=1}^\ell \lambda_i y_i \vec{x}_i \\&lt;br /&gt;
\frac{\partial \mathscr{L}}{\partial b} = -\sum\limits_{i=1}^\ell \lambda_i y_i = 0 &amp;amp; \Rightarrow &amp;amp; \sum\limits_{i=1}^\ell \lambda_i y_i = 0 \\&lt;br /&gt;
\frac{\partial \mathscr{L}}{\partial \xi_i} = -\lambda_i - \eta_i + C = 0 &amp;amp; \Rightarrow &amp;amp; \eta_i + \lambda_i = C, \quad i = 1, \ldots, \ell&lt;br /&gt;
\end{array}$&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Заметим, что $\eta_i \geq 0$, $\lambda_i \geq 0$, $C &amp;gt; 0$, поэтому из последнего ограничения получаем $0 \leq \eta_i \leq C$, $0 \leq \lambda_i \leq C$. &lt;br /&gt;
&lt;br /&gt;
Диапазон значений $\lambda_i$ (которые, как указано выше, соответствуют ограничениям на величину отступа) позволяет нам разделить объекты обучающей выборки на три типа:&lt;br /&gt;
&lt;br /&gt;
# $\lambda_i = 0 \; \Rightarrow \; \eta_i = C; \; \xi_i = 0; \; M_i \geq 1 \;$ — периферийные (неинформативные) объекты &amp;lt;br&amp;gt; Эти объекты лежат в своём классе, классифицируются верно и не влияют на выбор разделяющей гиперплоскости (см. уравнение для $\vec{w}$)&lt;br /&gt;
# $0 &amp;lt; \lambda_i &amp;lt; C \; \Rightarrow \; 0 &amp;lt; \eta_i &amp;lt; C; \; \xi_i = 0; \; M_i = 1 \;$ — опорные граничные объекты &amp;lt;br&amp;gt; Эти объекты лежат ровно на границе разделяющей полосы на стороне своего класса&lt;br /&gt;
# $\lambda_i = C \; \Rightarrow \; \eta_i = 0; \; \xi_i &amp;gt; 0; \; M_i &amp;lt; 1 \;$ — опорные объекты-нарушители &amp;lt;br&amp;gt; Эти объекты лежат внутри разделяющей полосы или на стороне чужого класса&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
'''Опорный объект''' (опорный вектор, англ. ''support vector'') — объект $\vec{x}_i$, соответствующий которому множитель Лагранжа отличен от нуля: $\lambda_i \neq 0$.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Теперь подставим ограничения, которые мы получили при дифференцировании, в функцию Лагранжа. Получим следующую постановку двойственной задачи, которая зависит только от двойственных переменных $\lambda$:&lt;br /&gt;
&lt;br /&gt;
$\begin{cases}&lt;br /&gt;
-\mathscr{L}(\lambda) = -\sum\limits_{i=1}^\ell \lambda_i + \frac{1}{2} \sum\limits_{i=1}^\ell \sum\limits_{j=1}^\ell \lambda_i \lambda_j y_i y_j \langle \vec{x}_i, \vec{x}_j \rangle \to \min\limits_\lambda \\&lt;br /&gt;
0 \leq \lambda_i \leq C, \quad i = 1, \ldots, \ell \\&lt;br /&gt;
\sum\limits_{i=1}^\ell \lambda_i y_i = 0&lt;br /&gt;
\end{cases}$&lt;br /&gt;
&lt;br /&gt;
Это также задача квадратичного программирования. Решение задачи лежит в пересечении $\ell$-мерного куба с ребром $C$ и гиперплоскости $\langle \lambda, y \rangle = 0$, что является выпуклым многогранником размерности $\ell-1$. В этом многограннике нужно найти минимум выпуклого квадратичного функционала. Следовательно, данная задача имеет единственное решение.&lt;br /&gt;
&lt;br /&gt;
Существуют различные методы поиска решения: можно воспользоваться универсальным солвером задачи квадратичного программирования ([[CPLEX]], [[Gurobi]]), либо алгоритмом, учитывающим специфические особенности SVM ([[SMO]], [[INCAS]]).&lt;br /&gt;
&lt;br /&gt;
После того, как мы получили вектор коэффициентов $\vec{\lambda}$, можем выразить решение прямой задачи через решение двойственной:&lt;br /&gt;
&lt;br /&gt;
$\begin{cases}&lt;br /&gt;
\vec{w} = \sum\limits_{i=1}^\ell \lambda_i y_i \vec{x}_i \\&lt;br /&gt;
b = \langle \vec{w}, \vec{x}_i \rangle - y_i, \quad \text{для любого}\; i: \lambda_i &amp;gt; 0, M_i = 1&lt;br /&gt;
\end{cases}$&lt;br /&gt;
&lt;br /&gt;
На практике для повышения вычислительной устойчивости рекомендуется при расчёте $b$ брать медиану по опорным граничным объектам:&lt;br /&gt;
&lt;br /&gt;
$b = med\{ \langle \vec{w}, \vec{x}_i \rangle - y_i : \lambda_i &amp;gt; 0, M_i = 1, i = 1, \ldots, \ell\}$&lt;br /&gt;
&lt;br /&gt;
Теперь можем переписать наш линейный классификатор, выразив $\vec{w}$ через $\vec{\lambda}$:&lt;br /&gt;
&lt;br /&gt;
$a(x) = sign \left(\sum\limits_{i=1}^\ell \lambda_i y_i \langle \vec{x}_i, \vec{x} \rangle - b\right)$&lt;br /&gt;
&lt;br /&gt;
=== Нелинейное обобщение, kernel trick ===&lt;br /&gt;
&lt;br /&gt;
Существует ещё один подход к решению проблемы линейной разделимости, известный как трюк с ядом (kernel trick). Если выборка объектов с признаковым описанием из $X = \mathbb{R}^n$ не является линейно разделимой, мы можем предположить, что существует некоторое пространство $H$, вероятно, большей размерности, при переходе в которое выборка станет линейно разделимой. Пространство $H$ здесь называют спрямляющим, а функцию перехода $\psi : X \to H$ — спрямляющим отображением. Построение SVM в таком случае происходит так же, как и раньше, но в качестве векторов признаковых описаний используются векторы $\psi(\vec{x})$, а не $\vec{x}$. Соответственно, скалярное произведение $\langle \vec{x}_1, \vec{x}_2 \rangle$ в пространстве $X$ везде заменяется скалярным произведением $\langle \psi(\vec{x}_1), \psi(\vec{x}_2) \rangle$ в пространстве $H$. Отсюда следует, что пространство $H$ должно быть гильбертовым, так как в нём должно быть определено скалярное произведение.&lt;br /&gt;
&lt;br /&gt;
Обратим внимание на то, что постановка задачи и алгоритм классификации не используют в явном виде признаковое описание и оперируют только скалярными произведениями признаков объектов. Это даёт возможность заменить скалярное произведение в пространстве $X$ на скалярное произведение в $H$:&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
'''Ядро''' (англ. ''kernel'') — функция $K: X \times X \to \mathbb{R}$, которая является скалярным произведением в некотором спрямляющем пространстве: $K(\vec{x}_1, \vec{x}_2) = \langle \psi(\vec{x}_1), \psi(\vec{x}_2) \rangle$ при некотором $\psi : X \to H$, где $H$ — пространство со скалярным произведением.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Более того, можно вообще не строить спрямляющее пространство $H$ в явном виде, и вместо подбора $\psi$ подбирать непосредственно ядро. &lt;br /&gt;
&lt;br /&gt;
Постановка задачи с применением ядер приобретает вид:&lt;br /&gt;
&lt;br /&gt;
$\begin{cases}&lt;br /&gt;
-\mathscr{L}(\lambda) = -\sum\limits_{i=1}^\ell \lambda_i + \frac{1}{2} \sum\limits_{i=1}^\ell \sum\limits_{j=1}^\ell \lambda_i \lambda_j y_i y_j \color{brown}{K(\vec{x}_i, \vec{x}_j)} \to \min\limits_\lambda \\&lt;br /&gt;
0 \leq \lambda_i \leq C, \quad i = 1, \ldots, \ell \\&lt;br /&gt;
\sum\limits_{i=1}^\ell \lambda_i y_i = 0&lt;br /&gt;
\end{cases}$&lt;br /&gt;
&lt;br /&gt;
$a(x) = sign \left(\sum\limits_{i=1}^\ell \lambda_i y_i \color{brown}{K(\vec{x}_i, \vec{x})} - b\right)$&lt;br /&gt;
&lt;br /&gt;
Теперь осталось рассмотреть вопрос выбора ядра для задачи. Теорема Мерсера определяет условия, при которых функция может являться ядром:&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|id=kernel&lt;br /&gt;
|author=Мерсер&lt;br /&gt;
|statement=&lt;br /&gt;
Функция $K(\vec{x}_1, \vec{x}_2)$ является ядром тогда и только тогда, когда выполнены условия: &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
$\begin{cases}K(\vec{x}_1, \vec{x}_2) = K(\vec{x}_2, \vec{x}_1) &amp;amp; \text{(симметричность)} \\[1ex] \forall g: X \to \mathbb{R} \quad \int\limits_X \int\limits_X K(\vec{x}_1, \vec{x}_2) g(\vec{x}_1) g(\vec{x}_2) d \vec{x}_1 d \vec{x}_2 \geq 0 &amp;amp; \text{(неотрицательная определенность)}\end{cases}$&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Проверка неотрицательной определённости является довольно трудоёмкой, поэтому на практике теорема явно не используется. Проблема выбора лучшего ядра на сегодняшний день остаётся открытой, лучшие из известных на данный момент решений основываются на генетических алгоритмах&amp;lt;ref&amp;gt;[https://www.researchgate.net/publication/221080223_An_Evolutionary_Approach_to_Automatic_Kernel_Construction T.Howley, M.G.Madden — An Evolutionary Approach to Automatic Kernel Construction]&amp;lt;/ref&amp;gt;). Обычно в практических реализациях ограничиваются перебором нескольких функций, про которые известно, что они являются ядрами, и выбирают среди них лучшую при помощи кросс-валидации. Кроме того, существуют правила порождения ядер, которые также применяются для расширения пространства перебираемых функций.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Конструктивные методы синтеза ядер:&lt;br /&gt;
&lt;br /&gt;
# $K(\vec{x}_1, \vec{x}_2) = \langle \vec{x}_1, \vec{x}_2 \rangle \quad$ (скалярное произведение)&lt;br /&gt;
# $K(\vec{x}_1, \vec{x}_2) = \alpha \quad$ (константа $\alpha \in \mathbb{R}_+$)&lt;br /&gt;
# $K(\vec{x}_1, \vec{x}_2) = K_1(\vec{x}_1, \vec{x}_2) + K_2(\vec{x}_1, \vec{x}_2) \quad$ (сумма ядер)&lt;br /&gt;
# $K(\vec{x}_1, \vec{x}_2) = K_1(\vec{x}_1, \vec{x}_2) * K_2(\vec{x}_1, \vec{x}_2) \quad$ (произведение ядер)&lt;br /&gt;
# $K(\vec{x}_1, \vec{x}_2) = \psi(\vec{x}_1) * \psi(\vec{x}_2) \quad$ (произведение функций $\psi : X \to \mathbb{R}$)&lt;br /&gt;
# $K(\vec{x}_1, \vec{x}_2) = K_1(\phi(\vec{x}_1), \phi(\vec{x}_2)) \quad$ (композиция ядра и функции $\phi : X \to X$)&lt;br /&gt;
# $K(\vec{x}_1, \vec{x}_2) = \int\limits_X s(\vec{x}_1, \vec{z}) s(\vec{x}_2, \vec{z}) d \vec{z} \quad$ ($s : X \times X \to \mathbb{R}$ — симметричная интегрируемая функция)&lt;br /&gt;
# $K(\vec{x}_1, \vec{x}_2) = f(K_1(\vec{x}_1, \vec{x}_2)) \quad$ ($f: \mathbb{R} \to \mathbb{R}$ представима в виде сходящегося степенного ряда с неотрицательными коэффициентами)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Существует несколько &amp;quot;стандартных&amp;quot; ядер, которые соответствуют известным алгоритмам классификации:&lt;br /&gt;
&lt;br /&gt;
* $K(\vec{x}_1, \vec{x}_2) = (\langle \vec{x}_1, \vec{x}_2 \rangle + c)^d, \quad c, d \in \mathbb{R}$ — полиномиальное ядро&lt;br /&gt;
* $K(\vec{x}_1, \vec{x}_2) = \sigma(\langle \vec{x}_1, \vec{x}_2 \rangle)$ — нейросеть с заданной функцией активации $\sigma(z)$ (не при всех $\sigma$ является ядром)&lt;br /&gt;
* $K(\vec{x}_1, \vec{x}_2) = \exp(-\beta \lVert \vec{x}_1 - \vec{x}_2 \rVert^2)$ — сеть радиальных базисных функций (англ. ''RBF'')&lt;br /&gt;
&lt;br /&gt;
== Преимущества и недостатки SVM ==&lt;br /&gt;
&lt;br /&gt;
Преимущества SVM перед методом стохастического градиента и нейронными сетями:&lt;br /&gt;
&lt;br /&gt;
* Задача выпуклого квадратичного программирования хорошо изучена и имеет единственное решение&lt;br /&gt;
* Метод опорных векторов эквивалентен двухслойной нейронной сети, где число нейронов на скрытом слое определяется автоматически как число опорных векторов&lt;br /&gt;
* Принцип оптимальной разделяющей гиперплоскости приводит к максимизации ширины разделяющей полосы, а следовательно, к более уверенной классификации&lt;br /&gt;
&lt;br /&gt;
Недостатки классического SVM:&lt;br /&gt;
&lt;br /&gt;
* Неустойчивость к шуму: выбросы в исходных данных становятся опорными объектами-нарушителями и напрямую влияют на построение разделяющей гиперплоскости&lt;br /&gt;
* Не описаны общие методы построения ядер и спрямляющих пространств, наиболее подходящих для конкретной задачи&lt;br /&gt;
* Нет отбора признаков&lt;br /&gt;
* Необходимо подбирать константу $C$ при помощи кросс-валидации&lt;br /&gt;
&lt;br /&gt;
== Модификации ==&lt;br /&gt;
&lt;br /&gt;
Существуют различные дополнения и модификации метода опорных векторов, направленные на устранение описанных недостатков:&lt;br /&gt;
&lt;br /&gt;
* [[Метод релевантных векторов (Relevance Vector Machine, RVM)]]&lt;br /&gt;
* [[1-norm SVM (LASSO SVM)]]&lt;br /&gt;
* [[Doubly Regularized SVM (ElasticNet SVM)]]&lt;br /&gt;
* [[Support Features Machine (SFM)]]&lt;br /&gt;
* [[Relevance Features Machine (RFM)]]&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
* [[Обзор библиотек для машинного обучения на Python]]&lt;br /&gt;
* [[Общие понятия]]&lt;br /&gt;
&lt;br /&gt;
== Примечания ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
* [http://www.machinelearning.ru/wiki/index.php?title=%D0%9C%D0%B0%D1%88%D0%B8%D0%BD%D0%B0_%D0%BE%D0%BF%D0%BE%D1%80%D0%BD%D1%8B%D1%85_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2 machinelearning.ru {{---}} Машина опорных векторов]&lt;br /&gt;
* [https://www.youtube.com/watch?v=Adi67_94_gc&amp;amp;list=PLJOzdkh8T5kp99tGTEFjH_b9zqEQiiBtC&amp;amp;index=5 Лекция &amp;quot;Линейные методы классификации: метод опорных векторов&amp;quot;]  {{---}} К.В. Воронцов, курс &amp;quot;Машинное обучение&amp;quot; 2014&lt;br /&gt;
* [https://ru.wikipedia.org/wiki/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%BE%D0%BF%D0%BE%D1%80%D0%BD%D1%8B%D1%85_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2 Wikipedia {{---}} Метод опорных векторов]&lt;br /&gt;
* Alexey Nefedov {{---}} [https://svmtutorial.online/ Support Vector Machines: A Simple Tutorial]&lt;br /&gt;
* John Platt {{---}} [https://www.microsoft.com/en-us/research/publication/sequential-minimal-optimization-a-fast-algorithm-for-training-support-vector-machines/ Sequential Minimal Optimization: A Fast Algorithm for Training Support Vector Machines]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Машинное обучение]]&lt;br /&gt;
[[Категория: Классификация]]&lt;br /&gt;
[[Категория: Регрессия]]&lt;/div&gt;</summary>
		<author><name>Egormkn</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%BE%D0%BF%D0%BE%D1%80%D0%BD%D1%8B%D1%85_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2_(SVM)&amp;diff=70696</id>
		<title>Метод опорных векторов (SVM)</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%BE%D0%BF%D0%BE%D1%80%D0%BD%D1%8B%D1%85_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2_(SVM)&amp;diff=70696"/>
				<updated>2019-04-02T22:13:08Z</updated>
		
		<summary type="html">&lt;p&gt;Egormkn: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{в разработке}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Метод опорных векторов''' (англ. ''support vector machine'', ''SVM'') — один из наиболее популярных методов обучения, который применяется для решения задач классификации и регрессии. Основная идея метода заключается в построении гиперплоскости, разделяющей объекты выборки наиболее оптимальным способом. Алгоритм работает в предположении, что чем больше расстояние (зазор) между разделяющей гиперплоскостью и объектами разделяемых классов, тем меньше будет средняя ошибка классификатора.&lt;br /&gt;
&lt;br /&gt;
== Метод опорных векторов в задаче классификации ==&lt;br /&gt;
&lt;br /&gt;
Рассмотрим задачу бинарной классификации, в которой объектам из $X=\mathbb{R}^n$ соответствует один из двух классов $Y = \{-1, +1\}$.&lt;br /&gt;
&lt;br /&gt;
Пусть задана обучающая выборка пар &amp;quot;объект-ответ&amp;quot;: $T^\ell = (\vec{x}_i, y_i)_{i=1}^\ell$. Необходимо построить алгоритм классификации $a(\vec{x}) : X \to Y$.&lt;br /&gt;
&lt;br /&gt;
=== Разделяющая гиперплоскость ===&lt;br /&gt;
&lt;br /&gt;
[[Файл:svm_hyperplane.png|300px|thumb|right|Примеры разделяющих гиперплоскостей в $\mathbb{R}^2$]]&lt;br /&gt;
&lt;br /&gt;
В пространстве $\mathbb{R}^n$ уравнение $\langle \vec{w}, \vec{x} \rangle - b = 0$ при заданных $\vec{w}$ и $b$ определяет гиперплоскость — множество векторов $\vec{x} = (x_1, \ldots, x_n)$, принадлежащих пространству меньшей размерности $\mathbb{R}^{n-1}$. Например, для $\mathbb{R}^1$ гиперплоскостью является точка, для $\mathbb{R}^2$ — прямая, для $\mathbb{R}^3$ — плоскость и т.д. Параметр $\vec{w}$ определяет вектор нормали к гиперплоскости, а через $\frac{b}{\lVert \vec{w} \rVert}$ выражается расстояние от гиперплоскости до начала координат.&lt;br /&gt;
&lt;br /&gt;
Гиперплоскость делит $\mathbb{R}^n$ на два полупространства: $\langle \vec{w}, \vec{x} \rangle - b &amp;gt; 0$ и $\langle \vec{w}, \vec{x} \rangle - b &amp;lt; 0$. &lt;br /&gt;
&lt;br /&gt;
Говорят, что гиперплоскость разделяет два класса $C_1$ и $C_2$, если объекты этих классов лежат по разные стороны от гиперплоскости, то есть выполнено либо&lt;br /&gt;
&lt;br /&gt;
$\begin{cases}\langle \vec{w}, \vec{x} \rangle - b &amp;gt; 0, &amp;amp;&amp;amp; \forall x \in C_1 \\ \langle \vec{w}, \vec{x} \rangle - b &amp;lt; 0, &amp;amp;&amp;amp; \forall x \in C_2\end{cases}$&lt;br /&gt;
&lt;br /&gt;
либо&lt;br /&gt;
&lt;br /&gt;
$\begin{cases}\langle \vec{w}, \vec{x} \rangle - b &amp;lt; 0, &amp;amp;&amp;amp; \forall x \in C_1 \\ \langle \vec{w}, \vec{x} \rangle - b &amp;gt; 0, &amp;amp;&amp;amp; \forall x \in C_2\end{cases}$&lt;br /&gt;
&lt;br /&gt;
=== Линейно разделимая выборка ===&lt;br /&gt;
&lt;br /&gt;
Пусть выборка линейно разделима, то есть существует некоторая гиперплоскость, разделяющая классы $-1$ и $+1$. Тогда в качестве алгоритма классификации можно использовать линейный пороговый классификатор:&lt;br /&gt;
&lt;br /&gt;
$a(\vec{x}) = sign(\langle \vec{w}, \vec{x} \rangle - b) = sign\left(\sum\limits_{i=1}^\ell w_i x_i - b\right)$&lt;br /&gt;
&lt;br /&gt;
где $\vec{x} = (x_1, \ldots, x_n)$ — вектор значений признаков объекта, а $\vec{w} = (w_1, \ldots, w_n) \in \mathbb{R}^n$ и $b \in \mathbb{R}$ — параметры гиперплоскости.&lt;br /&gt;
&lt;br /&gt;
Но для двух линейно разделимых классов возможны различные варианты построения разделяющих гиперплоскостей. Метод опорных векторов выбирает ту гиперплоскость, которая максимизирует отступ между классами:&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
'''Отступ''' (англ. ''margin'') — характеристика, оценивающая, насколько объект &amp;quot;погружён&amp;quot; в свой класс, насколько типичным представителем класса он является. Чем меньше значение отступа $M_i$, тем ближе объект $\vec{x}_i$ подходит к границе классов и тем выше становится вероятность ошибки. Отступ $M_i$ отрицателен тогда и только тогда, когда алгоритм $a(x)$ допускает ошибку на объекте $\vec{x}_i$. &amp;lt;br&amp;gt;&amp;lt;br&amp;gt; Для линейного классификатора отступ определяется уравнением: $M_i(\vec{w}, b) = y_i(\langle \vec{w}, \vec{x}_i \rangle - b)$&lt;br /&gt;
}}&lt;br /&gt;
Если выборка линейно разделима, то существует такая гиперплоскость, отступ от которой до каждого объекта положителен:&lt;br /&gt;
&lt;br /&gt;
$\exists \vec{w}, b : \; M_i(\vec{w}, b) = y_i(\langle \vec{w}, \vec{x}_i \rangle - b) &amp;gt; 0, \; i = 1\ldots\ell$&lt;br /&gt;
&lt;br /&gt;
Мы хотим построить такую разделяющую гиперплоскость, чтобы объекты обучающей выборки находились на наибольшем расстоянии от неё.&lt;br /&gt;
&lt;br /&gt;
[[Файл:SVM_margin.png|300px|thumb|right|Оптимальная разделяющая гиперплоскость в $\mathbb{R}^2$]]&lt;br /&gt;
Заметим, что при умножении $\vec{w}$ и $b$ на константу $c \neq 0$ уравнение $\langle c\vec{w}, \vec{x} \rangle - cb = 0$ определяет ту же самую гиперплоскость, что и $\langle \vec{w}, \vec{x} \rangle - b = 0$. Для удобства проведём нормировку: выберем константу $c$ таким образом, чтобы $\min M_i(\vec{w}, b) = 1$. При этом в каждом из двух классов найдётся хотя бы один &amp;quot;граничный&amp;quot; объект обучающей выборки, отступ которого равен этому минимуму: иначе можно было бы сместить гиперплоскость в сторону класса с большим отступом, тем самым увеличив минимальное расстояние от гиперплоскости до объектов обучающей выборки. &lt;br /&gt;
&lt;br /&gt;
Обозначим любой &amp;quot;граничный&amp;quot; объект из класса $+1$ как $\vec{x}_+$, из класса $-1$ как $\vec{x}_-$. Их отступ равен единице, то есть&lt;br /&gt;
&lt;br /&gt;
$\begin{cases}&lt;br /&gt;
M_+(\vec{w}, b) = (+1)(\langle \vec{w}, \vec{x}_+ \rangle - b) = 1 \\&lt;br /&gt;
M_-(\vec{w}, b) = (-1)(\langle \vec{w}, \vec{x}_- \rangle - b) = 1&lt;br /&gt;
\end{cases}$&lt;br /&gt;
&lt;br /&gt;
Нормировка позволяет ограничить разделяющую полосу между классами: $\{x: -1 &amp;lt; \langle \vec{w}, \vec{x}_i \rangle - b &amp;lt; 1\}$. Внутри неё не может лежать ни один объект обучающей выборки. Ширину разделяющей полосы можно выразить как проекцию вектора $\vec{x}_+ - \vec{x}_-$ на нормаль к гиперплоскости $\vec{w}$. Чтобы разделяющая гиперплоскость находилась на наибольшем расстоянии от точек выборки, ширина полосы должна быть максимальной: &lt;br /&gt;
&lt;br /&gt;
$\frac{\langle \vec{x}_+ - \vec{x}_-, \vec{w} \rangle}{\lVert w \rVert} = \frac{\langle \vec{x}_+, \vec{w} \rangle - \langle \vec{x}_-, \vec{w} \rangle - b + b}{\lVert w \rVert} = \frac{(+1)\left(\langle \vec{x}_+, \vec{w} \rangle - b\right) \, + \, (-1)\left(\langle \vec{x}_-, \vec{w} \rangle - b\right)}{\lVert w \rVert} = \\ = \frac{M_+(\vec{w}, b) \, + \, M_-(\vec{w}, b)}{\lVert w \rVert} = \frac{2}{\lVert w \rVert} \to \max \; \Rightarrow \; \lVert w \rVert \to \min$&lt;br /&gt;
&lt;br /&gt;
Это приводит нас к постановке задачи оптимизации в терминах квадратичного программирования:&lt;br /&gt;
&lt;br /&gt;
$\begin{cases}&lt;br /&gt;
\lVert \vec{w} \rVert^2 \to \min\limits_{w,b} \\&lt;br /&gt;
M_i(\vec{w}, b) \geq 1, \quad i = 1, \ldots, \ell&lt;br /&gt;
\end{cases}$&lt;br /&gt;
&lt;br /&gt;
=== Линейно неразделимая выборка ===&lt;br /&gt;
&lt;br /&gt;
На практике линейно разделимые выборки практически не встречаются: в данных возможны выбросы и нечёткие границы между классами. В таком случае поставленная выше задача не имеет решений, и необходимо ослабить ограничения, позволив некоторым объектам попадать на &amp;quot;территорию&amp;quot; другого класса. Для каждого объекта отнимем от отступа некоторую положительную величину $\xi_i$, но потребуем чтобы эти введённые поправки были минимальны. Это приведёт к следующей постановке задачи, называемой также ''SVM с мягким отступом'' (англ. ''soft-margin SVM''):&lt;br /&gt;
&lt;br /&gt;
$\begin{cases}&lt;br /&gt;
\frac{1}{2} \lVert \vec{w} \rVert^2 \color{brown}{+ C \sum\limits_{i=1}^\ell \xi_i} \to \min\limits_{w, b, \color{brown}{\xi}} \\&lt;br /&gt;
M_i(\vec{w}, b) \geq 1 \color{brown}{- \xi_i}, \quad i = 1, \ldots, \ell \\&lt;br /&gt;
\color{brown}{\xi_i \geq 0, \quad i = 1, \ldots, \ell} \\&lt;br /&gt;
\end{cases}$&lt;br /&gt;
&lt;br /&gt;
Мы не знаем, какой из функционалов $\frac{1}{2} \lVert \vec{w} \rVert^2$ и $\sum\limits_{i=1}^\ell \xi_i$ важнее, поэтому вводим коэффициент $C$, который будем оптимизировать с помощью кросс-валидации. В итоге мы получили задачу, у которой всегда есть единственное решение.&lt;br /&gt;
&lt;br /&gt;
Заметим, что мы можем упростить постановку задачи:&lt;br /&gt;
&lt;br /&gt;
$\begin{cases}&lt;br /&gt;
\xi_i \geq 0 \\&lt;br /&gt;
\xi_i \geq 1 - M_i(\vec{w}, b) \\&lt;br /&gt;
\sum\limits_{i=1}^\ell \xi_i \to \min&lt;br /&gt;
\end{cases} &lt;br /&gt;
\,\Rightarrow\,&lt;br /&gt;
\begin{cases} &lt;br /&gt;
\xi_i \geq \max(0, 1 - M_i(\vec{w}, b)) \\&lt;br /&gt;
\sum\limits_{i=1}^\ell \xi_i \to \min&lt;br /&gt;
\end{cases}&lt;br /&gt;
\,\Rightarrow\,&lt;br /&gt;
\xi_i = (1- M_i(\vec{w}, b))_+$&lt;br /&gt;
&lt;br /&gt;
Получим эквивалентную задачу безусловной минимизации:&lt;br /&gt;
&lt;br /&gt;
$\frac{1}{2} \lVert \vec{w} \rVert^2 + C \sum\limits_{i=1}^\ell \left(1 - M_i(\vec{w}, b)\right)_+ \to \min\limits_{w, b}$&lt;br /&gt;
&lt;br /&gt;
Теперь научимся её решать.&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|id=kkt&lt;br /&gt;
|author=Условия Каруша—Куна—Таккера&lt;br /&gt;
|statement=&lt;br /&gt;
Пусть поставлена задача нелинейного программирования с ограничениями:&lt;br /&gt;
$$&lt;br /&gt;
\begin{cases}&lt;br /&gt;
f(x) \to \min\limits_{x \in X} \\&lt;br /&gt;
g_i(x) \leq 0,\;i=1\ldots m \\&lt;br /&gt;
h_j(x) = 0,\;j=1\ldots k&lt;br /&gt;
\end{cases}&lt;br /&gt;
$$&lt;br /&gt;
&lt;br /&gt;
Если $x$ — точка локального минимума при наложенных ограничениях, то существуют такие множители $\mu_i, i = 1\ldots m$, $\;\lambda_j, j = 1\ldots k$, что для функции Лагранжа $L(x; \mu, \lambda)$ выполняются условия:&lt;br /&gt;
&lt;br /&gt;
$$\begin{cases}\frac{\partial L}{\partial x} = 0, \quad L(x; \mu, \lambda) = f(x) + \sum\limits_{i=1}^m \mu_i g_i(x) + \sum\limits_{j=1}^k \lambda_j h_j(x) \\ g_i(x) \leq 0,\;h_j(x) = 0 \quad \text{(исходные ограничения)} \\ \mu_i \geq 0 \quad \text{(двойственные ограничения)} \\ \mu_i g_i(x) = 0 \quad \text{(условие дополняющей нежёсткости)} \end{cases}$$&lt;br /&gt;
&lt;br /&gt;
При этом искомая точка является седловой точкой функции Лагранжа: минимумом по $x$ и максимумом по двойственным переменным $\mu$.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
По теореме Каруша—Куна—Таккера, поставленная нами задача минимизации эквивалентна двойственной задаче поиска седловой точки функции Лагранжа:&lt;br /&gt;
&lt;br /&gt;
$\mathscr{L}(\vec{w},b,\xi; \lambda, \eta) = \frac{1}{2} \lVert w \rVert^2 - \sum\limits_{i=1}^\ell \lambda_i \left(M_i(\vec{w}, b) - 1\right) - \sum\limits_{i=1}^\ell \xi_i \left(\lambda_i + \eta_i - C\right)$&lt;br /&gt;
&lt;br /&gt;
$\lambda_i$ — переменные, двойственные к ограничениям $M_i \geq 1 - \xi_i$&lt;br /&gt;
&lt;br /&gt;
$\eta_i$ — переменные, двойственные к ограничениям $\xi_i \geq 0$&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Запишем необходимые условия седловой точки функции Лагранжа:&lt;br /&gt;
&lt;br /&gt;
$\begin{cases}&lt;br /&gt;
\frac{\partial \mathscr{L}}{\partial w} = 0, \quad \frac{\partial \mathscr{L}}{\partial b} = 0, \quad \frac{\partial \mathscr{L}}{\partial \xi} = 0 \\&lt;br /&gt;
\xi_i \geq 0, \quad \lambda_i \geq 0, \quad \eta_i \geq 0, &amp;amp;&amp;amp; i = 1, \ldots, \ell \\&lt;br /&gt;
\lambda_i = 0 \;\text{либо}\; M_i(\vec{w},b) = 1 - \xi_i, &amp;amp;&amp;amp; i = 1, \ldots, \ell \\&lt;br /&gt;
\eta_i = 0 \;\text{либо}\; \xi_i = 0, &amp;amp;&amp;amp; i = 1, \ldots, \ell&lt;br /&gt;
\end{cases}$&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Продифференцируем функцию Лагранжа и приравняем к нулю производные. Получим следующие ограничения:&lt;br /&gt;
&lt;br /&gt;
$\begin{array}{lcl}&lt;br /&gt;
\frac{\partial \mathscr{L}}{\partial w} = \vec{w} - \sum\limits_{i=1}^\ell \lambda_i y_i \vec{x}_i = 0 &amp;amp; \Rightarrow &amp;amp; \vec{w} = \sum\limits_{i=1}^\ell \lambda_i y_i \vec{x}_i \\&lt;br /&gt;
\frac{\partial \mathscr{L}}{\partial b} = -\sum\limits_{i=1}^\ell \lambda_i y_i = 0 &amp;amp; \Rightarrow &amp;amp; \sum\limits_{i=1}^\ell \lambda_i y_i = 0 \\&lt;br /&gt;
\frac{\partial \mathscr{L}}{\partial \xi_i} = -\lambda_i - \eta_i + C = 0 &amp;amp; \Rightarrow &amp;amp; \eta_i + \lambda_i = C, \quad i = 1, \ldots, \ell&lt;br /&gt;
\end{array}$&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Заметим, что $\eta_i \geq 0$, $\lambda_i \geq 0$, $C &amp;gt; 0$, поэтому из последнего ограничения получаем $0 \leq \eta_i \leq C$, $0 \leq \lambda_i \leq C$. &lt;br /&gt;
&lt;br /&gt;
Диапазон значений $\lambda_i$ (которые, как указано выше, соответствуют ограничениям на величину отступа) позволяет нам разделить объекты обучающей выборки на три типа:&lt;br /&gt;
&lt;br /&gt;
# $\lambda_i = 0 \; \Rightarrow \; \eta_i = C; \; \xi_i = 0; \; M_i \geq 1 \;$ — периферийные (неинформативные) объекты &amp;lt;br&amp;gt; Эти объекты лежат в своём классе, классифицируются верно и не влияют на выбор разделяющей гиперплоскости (см. уравнение для $\vec{w}$)&lt;br /&gt;
# $0 &amp;lt; \lambda_i &amp;lt; C \; \Rightarrow \; 0 &amp;lt; \eta_i &amp;lt; C; \; \xi_i = 0; \; M_i = 1 \;$ — опорные граничные объекты &amp;lt;br&amp;gt; Эти объекты лежат ровно на границе разделяющей полосы на стороне своего класса&lt;br /&gt;
# $\lambda_i = C \; \Rightarrow \; \eta_i = 0; \; \xi_i &amp;gt; 0; \; M_i &amp;lt; 1 \;$ — опорные объекты-нарушители &amp;lt;br&amp;gt; Эти объекты лежат внутри разделяющей полосы или на стороне чужого класса&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
'''Опорный объект''' (опорный вектор, англ. ''support vector'') — объект $\vec{x}_i$, соответствующий которому множитель Лагранжа отличен от нуля: $\lambda_i \neq 0$.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Теперь подставим ограничения, которые мы получили при дифференцировании, в функцию Лагранжа. Получим следующую постановку двойственной задачи, которая зависит только от двойственных переменных $\lambda$:&lt;br /&gt;
&lt;br /&gt;
$\begin{cases}&lt;br /&gt;
-\mathscr{L}(\lambda) = -\sum\limits_{i=1}^\ell \lambda_i + \frac{1}{2} \sum\limits_{i=1}^\ell \sum\limits_{j=1}^\ell \lambda_i \lambda_j y_i y_j \langle \vec{x}_i, \vec{x}_j \rangle \to \min\limits_\lambda \\&lt;br /&gt;
0 \leq \lambda_i \leq C, \quad i = 1, \ldots, \ell \\&lt;br /&gt;
\sum\limits_{i=1}^\ell \lambda_i y_i = 0&lt;br /&gt;
\end{cases}$&lt;br /&gt;
&lt;br /&gt;
Это также задача квадратичного программирования. Решение задачи лежит в пересечении $\ell$-мерного куба с ребром $C$ и гиперплоскости $\langle \lambda, y \rangle = 0$, что является выпуклым многогранником размерности $\ell-1$. В этом многограннике нужно найти минимум выпуклого квадратичного функционала. Следовательно, данная задача имеет единственное решение.&lt;br /&gt;
&lt;br /&gt;
Существуют различные методы поиска решения: можно воспользоваться универсальным солвером задачи квадратичного программирования ([[CPLEX]], [[Gurobi]]), либо алгоритмом, учитывающим специфические особенности SVM ([[SMO]], [[INCAS]]).&lt;br /&gt;
&lt;br /&gt;
После того, как мы получили вектор коэффициентов $\vec{\lambda}$, можем выразить решение прямой задачи через решение двойственной:&lt;br /&gt;
&lt;br /&gt;
$\begin{cases}&lt;br /&gt;
\vec{w} = \sum\limits_{i=1}^\ell \lambda_i y_i \vec{x}_i \\&lt;br /&gt;
b = \langle \vec{w}, \vec{x}_i \rangle - y_i, \quad \text{для любого}\; i: \lambda_i &amp;gt; 0, M_i = 1&lt;br /&gt;
\end{cases}$&lt;br /&gt;
&lt;br /&gt;
На практике для повышения вычислительной устойчивости рекомендуется при расчёте $b$ брать медиану по опорным граничным объектам:&lt;br /&gt;
&lt;br /&gt;
$b = med\{ \langle \vec{w}, \vec{x}_i \rangle - y_i : \lambda_i &amp;gt; 0, M_i = 1, i = 1, \ldots, \ell\}$&lt;br /&gt;
&lt;br /&gt;
Теперь можем переписать наш линейный классификатор, выразив $\vec{w}$ через $\vec{\lambda}$:&lt;br /&gt;
&lt;br /&gt;
$a(x) = sign \left(\sum\limits_{i=1}^\ell \lambda_i y_i \langle \vec{x}_i, \vec{x} \rangle - b\right)$&lt;br /&gt;
&lt;br /&gt;
=== Нелинейное обобщение, kernel trick ===&lt;br /&gt;
&lt;br /&gt;
Существует ещё один подход к решению проблемы линейной разделимости, известный как трюк с ядом (kernel trick). Если выборка объектов с признаковым описанием из $X = \mathbb{R}^n$ не является линейно разделимой, мы можем предположить, что существует некоторое пространство $H$, вероятно, большей размерности, при переходе в которое выборка станет линейно разделимой. Пространство $H$ здесь называют спрямляющим, а функцию перехода $\psi : X \to H$ — спрямляющим отображением. Построение SVM в таком случае происходит так же, как и раньше, но в качестве векторов признаковых описаний используются векторы $\psi(\vec{x})$, а не $\vec{x}$. Соответственно, скалярное произведение $\langle \vec{x}_1, \vec{x}_2 \rangle$ в пространстве $X$ везде заменяется скалярным произведением $\langle \psi(\vec{x}_1), \psi(\vec{x}_2) \rangle$ в пространстве $H$. Отсюда следует, что пространство $H$ должно быть гильбертовым, так как в нём должно быть определено скалярное произведение.&lt;br /&gt;
&lt;br /&gt;
Обратим внимание на то, что постановка задачи и алгоритм классификации не используют в явном виде признаковое описание и оперируют только скалярными произведениями признаков объектов. Это даёт возможность заменить скалярное произведение в пространстве $X$ на скалярное произведение в $H$:&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
'''Ядро''' (англ. ''kernel'') — функция $K: X \times X \to \mathbb{R}$, которая является скалярным произведением в некотором спрямляющем пространстве: $K(\vec{x}_1, \vec{x}_2) = \langle \psi(\vec{x}_1), \psi(\vec{x}_2) \rangle$ при некотором $\psi : X \to H$, где $H$ — пространство со скалярным произведением.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Более того, можно вообще не строить спрямляющее пространство $H$ в явном виде, и вместо подбора $\psi$ подбирать непосредственно ядро. Теорема Мерсера определяет условия, при которых функция может являться ядром:&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|id=kernel&lt;br /&gt;
|author=Мерсер&lt;br /&gt;
|statement=&lt;br /&gt;
Функция $K(\vec{x}_1, \vec{x}_2)$ является ядром тогда и только тогда, когда выполнены условия: &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
$\begin{cases}K(\vec{x}_1, \vec{x}_2) = K(\vec{x}_2, \vec{x}_1) &amp;amp; \text{(симметричность)} \\[1ex] \forall g: X \to \mathbb{R} \quad \int\limits_X \int\limits_X K(\vec{x}_1, \vec{x}_2) g(\vec{x}_1) g(\vec{x}_2) d \vec{x}_1 d \vec{x}_2 \geq 0 &amp;amp; \text{(неотрицательная определенность)}\end{cases}$&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Проверка неотрицательной определённости является довольно трудоёмкой, поэтому на практике теорема явно не используется. Проблема выбора лучшего ядра на сегодняшний день остаётся открытой, лучшие из известных на данный момент решений основываются на генетических алгоритмах&amp;lt;ref&amp;gt;[https://www.researchgate.net/publication/221080223_An_Evolutionary_Approach_to_Automatic_Kernel_Construction T.Howley, M.G.Madden — An Evolutionary Approach to Automatic Kernel Construction]&amp;lt;/ref&amp;gt;). Обычно в практических реализациях ограничиваются перебором нескольких функций, про которые известно, что они являются ядрами, и выбирают среди них лучшую при помощи кросс-валидации. Кроме того, существуют правила порождения ядер, которые также применяются для расширения пространства перебираемых функций.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Конструктивные методы синтеза ядер:&lt;br /&gt;
&lt;br /&gt;
# $K(\vec{x}_1, \vec{x}_2) = \langle \vec{x}_1, \vec{x}_2 \rangle \quad$ (скалярное произведение)&lt;br /&gt;
# $K(\vec{x}_1, \vec{x}_2) = \alpha \quad$ (константа $\alpha \in \mathbb{R}_+$)&lt;br /&gt;
# $K(\vec{x}_1, \vec{x}_2) = K_1(\vec{x}_1, \vec{x}_2) + K_2(\vec{x}_1, \vec{x}_2) \quad$ (сумма ядер)&lt;br /&gt;
# $K(\vec{x}_1, \vec{x}_2) = K_1(\vec{x}_1, \vec{x}_2) * K_2(\vec{x}_1, \vec{x}_2) \quad$ (произведение ядер)&lt;br /&gt;
# $K(\vec{x}_1, \vec{x}_2) = \psi(\vec{x}_1) * \psi(\vec{x}_2) \quad$ (произведение функций $\psi : X \to \mathbb{R}$)&lt;br /&gt;
# $K(\vec{x}_1, \vec{x}_2) = K_1(\phi(\vec{x}_1), \phi(\vec{x}_2)) \quad$ (композиция ядра и функции $\phi : X \to X$)&lt;br /&gt;
# $K(\vec{x}_1, \vec{x}_2) = \int\limits_X s(\vec{x}_1, \vec{z}) s(\vec{x}_2, \vec{z}) d \vec{z} \quad$ ($s : X \times X \to \mathbb{R}$ — симметричная интегрируемая функция)&lt;br /&gt;
# $K(\vec{x}_1, \vec{x}_2) = f(K_1(\vec{x}_1, \vec{x}_2)) \quad$ ($f: \mathbb{R} \to \mathbb{R}$ представима в виде сходящегося степенного ряда с неотрицательными коэффициентами)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Существует несколько &amp;quot;стандартных&amp;quot; ядер, которые соответствуют известным алгоритмам классификации:&lt;br /&gt;
&lt;br /&gt;
* $K(\vec{x}_1, \vec{x}_2) = (\langle \vec{x}_1, \vec{x}_2 \rangle + c)^d, \quad c, d \in \mathbb{R}$ — полиномиальное ядро&lt;br /&gt;
* $K(\vec{x}_1, \vec{x}_2) = \sigma(\langle \vec{x}_1, \vec{x}_2 \rangle)$ — нейросеть с заданной функцией активации $\sigma(z)$ (не при всех $\sigma$ является ядром)&lt;br /&gt;
* $K(\vec{x}_1, \vec{x}_2) = \exp(-\beta \lVert \vec{x}_1 - \vec{x}_2 \rVert^2)$ — сеть радиальных базисных функций (англ. ''RBF'')&lt;br /&gt;
&lt;br /&gt;
== Преимущества и недостатки SVM ==&lt;br /&gt;
&lt;br /&gt;
Преимущества SVM перед методом стохастического градиента и нейронными сетями:&lt;br /&gt;
&lt;br /&gt;
* Задача выпуклого квадратичного программирования хорошо изучена и имеет единственное решение&lt;br /&gt;
* Метод опорных векторов эквивалентен двухслойной нейронной сети, где число нейронов на скрытом слое определяется автоматически как число опорных векторов&lt;br /&gt;
* Принцип оптимальной разделяющей гиперплоскости приводит к максимизации ширины разделяющей полосы, а следовательно, к более уверенной классификации&lt;br /&gt;
&lt;br /&gt;
Недостатки классического SVM:&lt;br /&gt;
&lt;br /&gt;
* Неустойчивость к шуму: выбросы в исходных данных становятся опорными объектами-нарушителями и напрямую влияют на построение разделяющей гиперплоскости&lt;br /&gt;
* Не описаны общие методы построения ядер и спрямляющих пространств, наиболее подходящих для конкретной задачи&lt;br /&gt;
* Нет отбора признаков&lt;br /&gt;
* Необходимо подбирать константу $C$ при помощи кросс-валидации&lt;br /&gt;
&lt;br /&gt;
== Модификации ==&lt;br /&gt;
&lt;br /&gt;
Существуют различные дополнения и модификации метода опорных векторов, направленные на устранение описанных недостатков:&lt;br /&gt;
&lt;br /&gt;
* [[Метод релевантных векторов (Relevance Vector Machine, RVM)]]&lt;br /&gt;
* [[1-norm SVM (LASSO SVM)]]&lt;br /&gt;
* [[Doubly Regularized SVM (ElasticNet SVM)]]&lt;br /&gt;
* [[Support Features Machine (SFM)]]&lt;br /&gt;
* [[Relevance Features Machine (RFM)]]&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
* [[Обзор библиотек для машинного обучения на Python]]&lt;br /&gt;
* [[Общие понятия]]&lt;br /&gt;
&lt;br /&gt;
== Примечания ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
* [http://www.machinelearning.ru/wiki/index.php?title=%D0%9C%D0%B0%D1%88%D0%B8%D0%BD%D0%B0_%D0%BE%D0%BF%D0%BE%D1%80%D0%BD%D1%8B%D1%85_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2 machinelearning.ru {{---}} Машина опорных векторов]&lt;br /&gt;
* [https://www.youtube.com/watch?v=Adi67_94_gc&amp;amp;list=PLJOzdkh8T5kp99tGTEFjH_b9zqEQiiBtC&amp;amp;index=5 Лекция &amp;quot;Линейные методы классификации: метод опорных векторов&amp;quot;]  {{---}} К.В. Воронцов, курс &amp;quot;Машинное обучение&amp;quot; 2014&lt;br /&gt;
* [https://ru.wikipedia.org/wiki/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%BE%D0%BF%D0%BE%D1%80%D0%BD%D1%8B%D1%85_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2 Wikipedia {{---}} Метод опорных векторов]&lt;br /&gt;
* Alexey Nefedov {{---}} [https://svmtutorial.online/ Support Vector Machines: A Simple Tutorial]&lt;br /&gt;
* John Platt {{---}} [https://www.microsoft.com/en-us/research/publication/sequential-minimal-optimization-a-fast-algorithm-for-training-support-vector-machines/ Sequential Minimal Optimization: A Fast Algorithm for Training Support Vector Machines]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Машинное обучение]]&lt;br /&gt;
[[Категория: Классификация]]&lt;br /&gt;
[[Категория: Регрессия]]&lt;/div&gt;</summary>
		<author><name>Egormkn</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%BE%D0%BF%D0%BE%D1%80%D0%BD%D1%8B%D1%85_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2_(SVM)&amp;diff=70692</id>
		<title>Метод опорных векторов (SVM)</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%BE%D0%BF%D0%BE%D1%80%D0%BD%D1%8B%D1%85_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2_(SVM)&amp;diff=70692"/>
				<updated>2019-04-02T18:39:32Z</updated>
		
		<summary type="html">&lt;p&gt;Egormkn: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{в разработке}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Метод опорных векторов''' (англ. ''support vector machine'', ''SVM'') — один из наиболее популярных методов обучения, который применяется для решения задач классификации и регрессии. Основная идея метода заключается в построении гиперплоскости, разделяющей объекты выборки наиболее оптимальным способом. Алгоритм работает в предположении, что чем больше расстояние (зазор) между разделяющей гиперплоскостью и объектами разделяемых классов, тем меньше будет средняя ошибка классификатора.&lt;br /&gt;
&lt;br /&gt;
== Метод опорных векторов в задаче классификации ==&lt;br /&gt;
&lt;br /&gt;
Рассмотрим задачу бинарной классификации, в которой объектам из $X=\mathbb{R}^n$ соответствует один из двух классов $Y = \{-1, +1\}$.&lt;br /&gt;
&lt;br /&gt;
Пусть задана обучающая выборка пар &amp;quot;объект-ответ&amp;quot;: $T^\ell = (\vec{x}_i, y_i)_{i=1}^\ell$. Необходимо построить алгоритм классификации $a(\vec{x}) : X \to Y$.&lt;br /&gt;
&lt;br /&gt;
=== Разделяющая гиперплоскость ===&lt;br /&gt;
&lt;br /&gt;
[[Файл:svm_hyperplane.png|300px|thumb|right|Примеры разделяющих гиперплоскостей в $\mathbb{R}^2$]]&lt;br /&gt;
&lt;br /&gt;
В пространстве $\mathbb{R}^n$ уравнение $\langle \vec{w}, \vec{x} \rangle - b = 0$ при заданных $\vec{w}$ и $b$ определяет гиперплоскость — множество векторов $\vec{x} = (x_1, \ldots, x_n)$, принадлежащих пространству меньшей размерности $\mathbb{R}^{n-1}$. Например, для $\mathbb{R}^1$ гиперплоскостью является точка, для $\mathbb{R}^2$ — прямая, для $\mathbb{R}^3$ — плоскость и т.д. Параметр $\vec{w}$ определяет вектор нормали к гиперплоскости, а через $\frac{b}{\lVert \vec{w} \rVert}$ выражается расстояние от гиперплоскости до начала координат.&lt;br /&gt;
&lt;br /&gt;
Гиперплоскость делит $\mathbb{R}^n$ на два полупространства: $\langle \vec{w}, \vec{x} \rangle - b &amp;gt; 0$ и $\langle \vec{w}, \vec{x} \rangle - b &amp;lt; 0$. &lt;br /&gt;
&lt;br /&gt;
Говорят, что гиперплоскость разделяет два класса $C_1$ и $C_2$, если объекты этих классов лежат по разные стороны от гиперплоскости, то есть выполнено либо&lt;br /&gt;
&lt;br /&gt;
$\begin{cases}\langle \vec{w}, \vec{x} \rangle - b &amp;gt; 0, &amp;amp;&amp;amp; \forall x \in C_1 \\ \langle \vec{w}, \vec{x} \rangle - b &amp;lt; 0, &amp;amp;&amp;amp; \forall x \in C_2\end{cases}$&lt;br /&gt;
&lt;br /&gt;
либо&lt;br /&gt;
&lt;br /&gt;
$\begin{cases}\langle \vec{w}, \vec{x} \rangle - b &amp;lt; 0, &amp;amp;&amp;amp; \forall x \in C_1 \\ \langle \vec{w}, \vec{x} \rangle - b &amp;gt; 0, &amp;amp;&amp;amp; \forall x \in C_2\end{cases}$&lt;br /&gt;
&lt;br /&gt;
=== Линейно разделимая выборка ===&lt;br /&gt;
&lt;br /&gt;
Пусть выборка линейно разделима, то есть существует некоторая гиперплоскость, разделяющая классы $-1$ и $+1$. Тогда в качестве алгоритма классификации можно использовать линейный пороговый классификатор:&lt;br /&gt;
&lt;br /&gt;
$a(\vec{x}) = sign(\langle \vec{w}, \vec{x} \rangle - b) = sign\left(\sum\limits_{i=1}^\ell w_i x_i - b\right)$&lt;br /&gt;
&lt;br /&gt;
где $\vec{x} = (x_1, \ldots, x_n)$ — вектор значений признаков объекта, а $\vec{w} = (w_1, \ldots, w_n) \in \mathbb{R}^n$ и $b \in \mathbb{R}$ — параметры гиперплоскости.&lt;br /&gt;
&lt;br /&gt;
Но для двух линейно разделимых классов возможны различные варианты построения разделяющих гиперплоскостей. Метод опорных векторов выбирает ту гиперплоскость, которая максимизирует отступ между классами:&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
'''Отступ''' (англ. ''margin'') — характеристика, оценивающая, насколько объект &amp;quot;погружён&amp;quot; в свой класс, насколько типичным представителем класса он является. Чем меньше значение отступа $M_i$, тем ближе объект $\vec{x}_i$ подходит к границе классов и тем выше становится вероятность ошибки. Отступ $M_i$ отрицателен тогда и только тогда, когда алгоритм $a(x)$ допускает ошибку на объекте $\vec{x}_i$. &amp;lt;br&amp;gt;&amp;lt;br&amp;gt; Для линейного классификатора отступ определяется уравнением: $M_i(\vec{w}, b) = y_i(\langle \vec{w}, \vec{x}_i \rangle - b)$&lt;br /&gt;
}}&lt;br /&gt;
Если выборка линейно разделима, то существует такая гиперплоскость, отступ от которой до каждого объекта положителен:&lt;br /&gt;
&lt;br /&gt;
$\exists \vec{w}, b : \; M_i(\vec{w}, b) = y_i(\langle \vec{w}, \vec{x}_i \rangle - b) &amp;gt; 0, \; i = 1\ldots\ell$&lt;br /&gt;
&lt;br /&gt;
Мы хотим построить такую разделяющую гиперплоскость, чтобы объекты обучающей выборки находились на наибольшем расстоянии от неё.&lt;br /&gt;
&lt;br /&gt;
[[Файл:SVM_margin.png|300px|thumb|right|Оптимальная разделяющая гиперплоскость в $\mathbb{R}^2$]]&lt;br /&gt;
Заметим, что при умножении $\vec{w}$ и $b$ на константу $c \neq 0$ уравнение $\langle c\vec{w}, \vec{x} \rangle - cb = 0$ определяет ту же самую гиперплоскость, что и $\langle \vec{w}, \vec{x} \rangle - b = 0$. Для удобства проведём нормировку: выберем константу $c$ таким образом, чтобы $\min M_i(\vec{w}, b) = 1$. При этом в каждом из двух классов найдётся хотя бы один &amp;quot;граничный&amp;quot; объект обучающей выборки, отступ которого равен этому минимуму: иначе можно было бы сместить гиперплоскость в сторону класса с большим отступом, тем самым увеличив минимальное расстояние от гиперплоскости до объектов обучающей выборки. &lt;br /&gt;
&lt;br /&gt;
Обозначим любой &amp;quot;граничный&amp;quot; объект из класса $+1$ как $\vec{x}_+$, из класса $-1$ как $\vec{x}_-$. Их отступ равен единице, то есть&lt;br /&gt;
&lt;br /&gt;
$\begin{cases}&lt;br /&gt;
M_+(\vec{w}, b) = (+1)(\langle \vec{w}, \vec{x}_+ \rangle - b) = 1 \\&lt;br /&gt;
M_-(\vec{w}, b) = (-1)(\langle \vec{w}, \vec{x}_- \rangle - b) = 1&lt;br /&gt;
\end{cases}$&lt;br /&gt;
&lt;br /&gt;
Нормировка позволяет ограничить разделяющую полосу между классами: $\{x: -1 &amp;lt; \langle \vec{w}, \vec{x}_i \rangle - b &amp;lt; 1\}$. Внутри неё не может лежать ни один объект обучающей выборки. Ширину разделяющей полосы можно выразить как проекцию вектора $\vec{x}_+ - \vec{x}_-$ на нормаль к гиперплоскости $\vec{w}$. Чтобы разделяющая гиперплоскость находилась на наибольшем расстоянии от точек выборки, ширина полосы должна быть максимальной: &lt;br /&gt;
&lt;br /&gt;
$\frac{\langle \vec{x}_+ - \vec{x}_-, \vec{w} \rangle}{\lVert w \rVert} = \frac{\langle \vec{x}_+, \vec{w} \rangle - \langle \vec{x}_-, \vec{w} \rangle - b + b}{\lVert w \rVert} = \frac{(+1)\left(\langle \vec{x}_+, \vec{w} \rangle - b\right) \, + \, (-1)\left(\langle \vec{x}_-, \vec{w} \rangle - b\right)}{\lVert w \rVert} = \\ = \frac{M_+(\vec{w}, b) \, + \, M_-(\vec{w}, b)}{\lVert w \rVert} = \frac{2}{\lVert w \rVert} \to \max \; \Rightarrow \; \lVert w \rVert \to \min$&lt;br /&gt;
&lt;br /&gt;
Это приводит нас к постановке задачи оптимизации в терминах квадратичного программирования:&lt;br /&gt;
&lt;br /&gt;
$\begin{cases}&lt;br /&gt;
\lVert \vec{w} \rVert^2 \to \min\limits_{w,b} \\&lt;br /&gt;
M_i(\vec{w}, b) \geq 1, \quad i = 1, \ldots, \ell&lt;br /&gt;
\end{cases}$&lt;br /&gt;
&lt;br /&gt;
=== Линейно неразделимая выборка ===&lt;br /&gt;
&lt;br /&gt;
На практике линейно разделимые выборки практически не встречаются: в данных возможны выбросы и нечёткие границы между классами. В таком случае поставленная выше задача не имеет решений, и необходимо ослабить ограничения, позволив некоторым объектам попадать на &amp;quot;территорию&amp;quot; другого класса. Для каждого объекта отнимем от отступа некоторую положительную величину $\xi_i$, но потребуем чтобы эти введённые поправки были минимальны. Это приведёт к следующей постановке задачи:&lt;br /&gt;
&lt;br /&gt;
$\begin{cases}&lt;br /&gt;
\frac{1}{2} \lVert \vec{w} \rVert^2 \color{red}{+ C \sum\limits_{i=1}^\ell \xi_i} \to \min\limits_{w, b, \color{red}{\xi}} \\&lt;br /&gt;
M_i(\vec{w}, b) \geq 1 \color{red}{- \xi_i}, \quad i = 1, \ldots, \ell \\&lt;br /&gt;
\color{red}{\xi_i \geq 0, \quad i = 1, \ldots, \ell} \\&lt;br /&gt;
\end{cases}$&lt;br /&gt;
&lt;br /&gt;
Мы не знаем, какой из функционалов $\frac{1}{2} \lVert \vec{w} \rVert^2$ и $\sum\limits_{i=1}^\ell \xi_i$ важнее, поэтому вводим коэффициент $C$, который будем оптимизировать с помощью кросс-валидации. В итоге мы получили задачу, у которой всегда есть единственное решение.&lt;br /&gt;
&lt;br /&gt;
Заметим, что мы можем упростить постановку задачи:&lt;br /&gt;
&lt;br /&gt;
$\begin{cases}&lt;br /&gt;
\xi_i \geq 0 \\&lt;br /&gt;
\xi_i \geq 1 - M_i(\vec{w}, b) \\&lt;br /&gt;
\sum\limits_{i=1}^\ell \xi_i \to \min&lt;br /&gt;
\end{cases} &lt;br /&gt;
\,\Rightarrow\,&lt;br /&gt;
\begin{cases} &lt;br /&gt;
\xi_i \geq \max(0, 1 - M_i(\vec{w}, b)) \\&lt;br /&gt;
\sum\limits_{i=1}^\ell \xi_i \to \min&lt;br /&gt;
\end{cases}&lt;br /&gt;
\,\Rightarrow\,&lt;br /&gt;
\xi_i = (1- M_i(\vec{w}, b))_+$&lt;br /&gt;
&lt;br /&gt;
Получим эквивалентную задачу безусловной минимизации:&lt;br /&gt;
&lt;br /&gt;
$\frac{1}{2} \lVert \vec{w} \rVert^2 + C \sum\limits_{i=1}^\ell \left(1 - M_i(\vec{w}, b)\right)_+ \to \min\limits_{w, b}$&lt;br /&gt;
&lt;br /&gt;
Теперь научимся её решать.&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|id=kkt&lt;br /&gt;
|author=Условия Каруша—Куна—Таккера&lt;br /&gt;
|statement=&lt;br /&gt;
Пусть поставлена задача нелинейного программирования с ограничениями:&lt;br /&gt;
$$&lt;br /&gt;
\begin{cases}&lt;br /&gt;
f(x) \to \min\limits_{x \in X} \\&lt;br /&gt;
g_i(x) \leq 0,\;i=1\ldots m \\&lt;br /&gt;
h_j(x) = 0,\;j=1\ldots k&lt;br /&gt;
\end{cases}&lt;br /&gt;
$$&lt;br /&gt;
&lt;br /&gt;
Если $x$ — точка локального минимума при наложенных ограничениях, то существуют такие множители $\mu_i, i = 1\ldots m$, $\;\lambda_j, j = 1\ldots k$, что для функции Лагранжа $L(x; \mu, \lambda)$ выполняются условия:&lt;br /&gt;
&lt;br /&gt;
$$\begin{cases}\frac{\partial L}{\partial x} = 0, \quad L(x; \mu, \lambda) = f(x) + \sum\limits_{i=1}^m \mu_i g_i(x) + \sum\limits_{j=1}^k \lambda_j h_j(x) \\ g_i(x) \leq 0,\;h_j(x) = 0 \quad \text{(исходные ограничения)} \\ \mu_i \geq 0 \quad \text{(двойственные ограничения)} \\ \mu_i g_i(x) = 0 \quad \text{(условие дополняющей нежёсткости)} \end{cases}$$&lt;br /&gt;
&lt;br /&gt;
При этом искомая точка является седловой точкой функции Лагранжа: минимумом по $x$ и максимумом по двойственным переменным $\mu$.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
По теореме Каруша—Куна—Таккера, поставленная нами задача минимизации эквивалентна двойственной задаче для функции Лагранжа:&lt;br /&gt;
&lt;br /&gt;
$\mathscr{L}(\vec{w},b,\xi; \lambda, \eta) = \frac{1}{2} \lVert w \rVert^2 - \sum\limits_{i=1}^\ell \lambda_i \left(M_i(\vec{w}, b) - 1\right) - \sum\limits_{i=1}^\ell \xi_i \left(\lambda_i + \eta_i - C\right)$&lt;br /&gt;
&lt;br /&gt;
$\lambda_i$ — переменные, двойственные к ограничениям $M_i \geq 1 - \xi_i$&lt;br /&gt;
&lt;br /&gt;
$\eta_i$ — переменные, двойственные к ограничениям $\xi_i \geq 0$&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Запишем необходимые условия седловой точки функции Лагранжа:&lt;br /&gt;
&lt;br /&gt;
$\begin{cases}&lt;br /&gt;
\frac{\partial \mathscr{L}}{\partial w} = 0, \quad \frac{\partial \mathscr{L}}{\partial b} = 0, \quad \frac{\partial \mathscr{L}}{\partial \xi} = 0 \\&lt;br /&gt;
\xi_i \geq 0, \quad \lambda_i \geq 0, \quad \eta_i \geq 0, &amp;amp;&amp;amp; i = 1, \ldots, \ell \\&lt;br /&gt;
\lambda_i = 0 \;\text{либо}\; M_i(\vec{w},b) = 1 - \xi_i, &amp;amp;&amp;amp; i = 1, \ldots, \ell \\&lt;br /&gt;
\eta_i = 0 \;\text{либо}\; \xi_i = 0, &amp;amp;&amp;amp; i = 1, \ldots, \ell&lt;br /&gt;
\end{cases}$&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Продифференцируем функцию Лагранжа и приравняем к нулю производные. Получим следующие ограничения:&lt;br /&gt;
&lt;br /&gt;
$\begin{array}{lcl}&lt;br /&gt;
\frac{\partial \mathscr{L}}{\partial w} = \vec{w} - \sum\limits_{i=1}^\ell \lambda_i y_i \vec{x}_i = 0 &amp;amp; \Rightarrow &amp;amp; \vec{w} = \sum\limits_{i=1}^\ell \lambda_i y_i \vec{x}_i \\&lt;br /&gt;
\frac{\partial \mathscr{L}}{\partial b} = -\sum\limits_{i=1}^\ell \lambda_i y_i = 0 &amp;amp; \Rightarrow &amp;amp; \sum\limits_{i=1}^\ell \lambda_i y_i = 0 \\&lt;br /&gt;
\frac{\partial \mathscr{L}}{\partial \xi_i} = -\lambda_i - \eta_i + C = 0 &amp;amp; \Rightarrow &amp;amp; \eta_i + \lambda_i = C, \quad i = 1, \ldots, \ell&lt;br /&gt;
\end{array}$&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Заметим, что $\eta_i \geq 0$, $\lambda_i \geq 0$, $C &amp;gt; 0$, поэтому из последнего ограничения получаем $0 \leq \eta_i \leq C$, $0 \leq \lambda_i \leq C$. &lt;br /&gt;
&lt;br /&gt;
Диапазон значений $\lambda_i$ (которые, как указано выше, соответствуют ограничениям на величину отступа) позволяет нам разделить объекты обучающей выборки на три типа:&lt;br /&gt;
&lt;br /&gt;
# $\lambda_i = 0 \; \Rightarrow \; \eta_i = C; \; \xi_i = 0; \; M_i \geq 1 \;$ — периферийные (неинформативные) объекты — лежат в своём классе, не влияют на выбор разделяющей гиперплоскости (см. ограничение на $\vec{w}$)&lt;br /&gt;
# $0 &amp;lt; \lambda_i &amp;lt; C \; \Rightarrow \; 0 &amp;lt; \eta_i &amp;lt; C; \; \xi_i = 0; \; M_i = 1 \;$ — опорные граничные объекты — лежат ровно на границе разделяющей полосы&lt;br /&gt;
# $\lambda_i = C \; \Rightarrow \; \eta_i = 0; \; \xi_i &amp;gt; 0; \; M_i &amp;lt; 1 \;$ — опорные объекты-нарушители — лежат внутри разделяющей полосы либо на стороне другого класса&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
'''Опорный объект''' (опорный вектор, англ. ''support vector'') — объект $\vec{x}_i$, соответствующий которому множитель Лагранжа отличен от нуля: $\lambda_i \neq 0$.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Теперь подставим ограничения, которые мы получили при дифференцировании, в функцию Лагранжа. Получим следующую постановку двойственной задачи, которая зависит только от двойственных переменных $\lambda$:&lt;br /&gt;
&lt;br /&gt;
$\begin{cases}&lt;br /&gt;
-\mathscr{L}(\lambda) = -\sum\limits_{i=1}^\ell \lambda_i + \frac{1}{2} \sum\limits_{i=1}^\ell \sum\limits_{j=1}^\ell \lambda_i \lambda_j y_i y_j \langle \vec{x}_i, \vec{x}_j \rangle \to \min\limits_\lambda \\&lt;br /&gt;
0 \leq \lambda_i \leq C, \quad i = 1, \ldots, \ell \\&lt;br /&gt;
\sum\limits_{i=1}^\ell \lambda_i y_i = 0&lt;br /&gt;
\end{cases}$&lt;br /&gt;
&lt;br /&gt;
Это также задача квадратичного программирования. Решение задачи лежит в пересечении $\ell$-мерного куба с ребром $C$ и гиперплоскости $\langle \lambda, y \rangle = 0$, что является выпуклым многогранником размерности $\ell-1$. И в этом многограннике нужно найти минимум квадратичного функционала.&lt;br /&gt;
&lt;br /&gt;
Существуют различные методы поиска решения: можно воспользоваться универсальным солвером задачи квадратичного программирования (CPLEX, Gurobi), либо алгоритмом, специально заточенным под поставленную задачу (SMO).&lt;br /&gt;
&lt;br /&gt;
После того, как мы получили вектор коэффициентов $\vec{\lambda}$, можем выразить решение прямой задачи через решение двойственной:&lt;br /&gt;
&lt;br /&gt;
$\begin{cases}&lt;br /&gt;
\vec{w} = \sum\limits_{i=1}^\ell \lambda_i y_i \vec{x}_i \\&lt;br /&gt;
b = \langle \vec{w}, \vec{x}_i \rangle - y_i, \quad \text{для любого}\; i: \lambda_i &amp;gt; 0, M_i = 1&lt;br /&gt;
\end{cases}$&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
И для удобства перепишем линейный классификатор, выразив $\vec{w}$ через $\vec{\lambda}$:&lt;br /&gt;
&lt;br /&gt;
$a(x) = sign \left(\sum\limits_{i=1}^\ell \lambda_i y_i \langle \vec{x}_i, \vec{x} \rangle - b\right)$&lt;br /&gt;
&lt;br /&gt;
=== Нелинейное обобщение, kernel trick ===&lt;br /&gt;
&lt;br /&gt;
Переход к спрямляющему пространству более высокой размерности: $\psi : X \to H$.&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
'''Ядро''' (англ. ''kernel'') — функция $K: X \times X \to \mathbb{R}$, которая является скалярным произведением в некотором гильбертовом пространстве: $K(\vec{x}_1, \vec{x}_2) = \langle \psi(\vec{x}_1), \psi(\vec{x}_2) \rangle$ при некотором $\psi : X \to H$, где $H$ — гильбертово пространство.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|id=kernel&lt;br /&gt;
|author=&lt;br /&gt;
|statement=&lt;br /&gt;
Функция $K(\vec{x}_1, \vec{x}_2)$ является ядром тогда и только тогда, когда выполнены условия: &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
$\begin{cases}K(\vec{x}_1, \vec{x}_2) = K(\vec{x}_2, \vec{x}_1) &amp;amp; \text{(симметричность)} \\[1ex] \forall g: X \to \mathbb{R} \quad \int\limits_X \int\limits_X K(\vec{x}_1, \vec{x}_2) g(\vec{x}_1) g(\vec{x}_2) d \vec{x}_1 d \vec{x}_2 \geq 0 &amp;amp; \text{(неотрицательная определенность)}\end{cases}$&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Точный алгоритм выбора ядер не описан, однако существуют исследования в области генетических алгоритмов&amp;lt;ref&amp;gt;[https://www.researchgate.net/publication/221080223_An_Evolutionary_Approach_to_Automatic_Kernel_Construction T.Howley, M.G.Madden — An Evolutionary Approach to Automatic Kernel Construction]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Конструктивные методы синтеза ядер:&lt;br /&gt;
&lt;br /&gt;
# $K(\vec{x}_1, \vec{x}_2) = \langle \vec{x}_1, \vec{x}_2 \rangle \quad$ (скалярное произведение)&lt;br /&gt;
# $K(\vec{x}_1, \vec{x}_2) = \alpha \quad$ (константа $\alpha \in \mathbb{R}_+$)&lt;br /&gt;
# $K(\vec{x}_1, \vec{x}_2) = K_1(\vec{x}_1, \vec{x}_2) + K_2(\vec{x}_1, \vec{x}_2) \quad$ (сумма ядер)&lt;br /&gt;
# $K(\vec{x}_1, \vec{x}_2) = K_1(\vec{x}_1, \vec{x}_2) * K_2(\vec{x}_1, \vec{x}_2) \quad$ (произведение ядер)&lt;br /&gt;
# $K(\vec{x}_1, \vec{x}_2) = \psi(\vec{x}_1) * \psi(\vec{x}_2) \quad$ (произведение функций $\psi : X \to \mathbb{R}$)&lt;br /&gt;
# $K(\vec{x}_1, \vec{x}_2) = K_1(\phi(\vec{x}_1), \phi(\vec{x}_2)) \quad$ (ядро от функций $\phi : X \to X$)&lt;br /&gt;
# $K(\vec{x}_1, \vec{x}_2) = \int\limits_X s(\vec{x}_1, \vec{z}) s(\vec{x}_2, \vec{z}) d \vec{z} \quad$ ($s : X \times X \to \mathbb{R}$ — симметричная интегрируемая функция)&lt;br /&gt;
# $K(\vec{x}_1, \vec{x}_2) = f(K_1(\vec{x}_1, \vec{x}_2)) \quad$ ($f: \mathbb{R} \to \mathbb{R}$ представима в виде сходящегося степенного ряда с неотрицательными коэффициентами)&lt;br /&gt;
&lt;br /&gt;
Примеры ядер:&lt;br /&gt;
&lt;br /&gt;
* $K(\vec{x}_1, \vec{x}_2) = (\langle \vec{x}_1, \vec{x}_2 \rangle + c)^d, \quad c, d \in \mathbb{R}$ — полиномиальное ядро&lt;br /&gt;
* $K(\vec{x}_1, \vec{x}_2) = \sigma(\langle \vec{x}_1, \vec{x}_2 \rangle)$ — нейросеть с заданной функцией активации $\sigma(z)$ (не при всех $\sigma$ является ядром)&lt;br /&gt;
* $K(\vec{x}_1, \vec{x}_2) = \exp(-\beta \lVert \vec{x}_1 - \vec{x}_2 \rVert^2)$ — сеть радиальных базисных функций (англ. ''RBF'')&lt;br /&gt;
&lt;br /&gt;
== Метод опорных векторов в задаче регрессии ==&lt;br /&gt;
// TODO&lt;br /&gt;
&lt;br /&gt;
== Преимущества и недостатки SVM ==&lt;br /&gt;
&lt;br /&gt;
Преимущества SVM перед методом стохастического градиента и нейронными сетями:&lt;br /&gt;
&lt;br /&gt;
* Задача выпуклого квадратичного программирования имеет единственное решение&lt;br /&gt;
* Метод опорных векторов эквивалентен двухслойной нейронной сети, где число нейронов на скрытом слое определяется автоматически как число опорных векторов&lt;br /&gt;
&lt;br /&gt;
Недостатки классического SVM:&lt;br /&gt;
&lt;br /&gt;
* Неустойчивость к шуму&lt;br /&gt;
* Нет общих подходов к оптимизации ядра под задачу&lt;br /&gt;
* Нет отбора признаков&lt;br /&gt;
* Необходимо подбирать константу $C$&lt;br /&gt;
&lt;br /&gt;
== Модификации ==&lt;br /&gt;
&lt;br /&gt;
Существуют различные дополнения и модификации метода опорных векторов, направленные на устранение описанных недостатков:&lt;br /&gt;
&lt;br /&gt;
* [[Метод релевантных векторов (Relevance Vector Machine, RVM)]]&lt;br /&gt;
* [[1-norm SVM (LASSO SVM)]]&lt;br /&gt;
* [[Doubly Regularized SVM (ElasticNet SVM)]]&lt;br /&gt;
* [[Support Features Machine (SFM)]]&lt;br /&gt;
* [[Relevance Features Machine (RFM)]]&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
* [[Обзор библиотек для машинного обучения на Python]]&lt;br /&gt;
* [[Общие понятия]]&lt;br /&gt;
&lt;br /&gt;
== Примечания ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
* [http://www.machinelearning.ru/wiki/index.php?title=%D0%9C%D0%B0%D1%88%D0%B8%D0%BD%D0%B0_%D0%BE%D0%BF%D0%BE%D1%80%D0%BD%D1%8B%D1%85_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2 machinelearning.ru {{---}} Машина опорных векторов]&lt;br /&gt;
* [https://www.youtube.com/watch?v=Adi67_94_gc&amp;amp;list=PLJOzdkh8T5kp99tGTEFjH_b9zqEQiiBtC&amp;amp;index=5 Лекция &amp;quot;Линейные методы классификации: метод опорных векторов&amp;quot;]  {{---}} К.В. Воронцов, курс &amp;quot;Машинное обучение&amp;quot; 2014&lt;br /&gt;
* [https://ru.wikipedia.org/wiki/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%BE%D0%BF%D0%BE%D1%80%D0%BD%D1%8B%D1%85_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2 Wikipedia {{---}} Метод опорных векторов]&lt;br /&gt;
* Alexey Nefedov {{---}} [https://svmtutorial.online/ Support Vector Machines: A Simple Tutorial]&lt;br /&gt;
* John Platt {{---}} [https://www.microsoft.com/en-us/research/publication/sequential-minimal-optimization-a-fast-algorithm-for-training-support-vector-machines/ Sequential Minimal Optimization: A Fast Algorithm for Training Support Vector Machines]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Машинное обучение]]&lt;br /&gt;
[[Категория: Классификация]]&lt;br /&gt;
[[Категория: Регрессия]]&lt;/div&gt;</summary>
		<author><name>Egormkn</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%BE%D0%BF%D0%BE%D1%80%D0%BD%D1%8B%D1%85_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2_(SVM)&amp;diff=70674</id>
		<title>Метод опорных векторов (SVM)</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%BE%D0%BF%D0%BE%D1%80%D0%BD%D1%8B%D1%85_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2_(SVM)&amp;diff=70674"/>
				<updated>2019-04-01T18:53:51Z</updated>
		
		<summary type="html">&lt;p&gt;Egormkn: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{в разработке}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Метод опорных векторов''' (англ. ''support vector machine'', ''SVM'') — один из наиболее популярных методов обучения, который применяется для решения задач классификации и регрессии. Основная идея метода заключается в построении гиперплоскости, разделяющей объекты выборки наиболее оптимальным способом. Алгоритм работает в предположении, что чем больше расстояние (зазор) между разделяющей гиперплоскостью и объектами разделяемых классов, тем меньше будет средняя ошибка классификатора.&lt;br /&gt;
&lt;br /&gt;
== Метод опорных векторов в задаче классификации ==&lt;br /&gt;
&lt;br /&gt;
Рассмотрим задачу бинарной классификации, в которой объектам из $X=\mathbb{R}^n$ соответствует один из двух классов $Y = \{-1, +1\}$.&lt;br /&gt;
&lt;br /&gt;
Пусть задана обучающая выборка пар &amp;quot;объект-ответ&amp;quot;: $T^\ell = (\vec{x}_i, y_i)_{i=1}^\ell$. Необходимо построить алгоритм классификации $a(\vec{x}) : X \to Y$.&lt;br /&gt;
&lt;br /&gt;
=== Разделяющая гиперплоскость ===&lt;br /&gt;
&lt;br /&gt;
[[Файл:svm_hyperplane.png|300px|thumb|right|Примеры разделяющих гиперплоскостей в $\mathbb{R}^2$]]&lt;br /&gt;
&lt;br /&gt;
В пространстве $\mathbb{R}^n$ уравнение $\langle \vec{w}, \vec{x} \rangle - b = 0$ при заданных $\vec{w}$ и $b$ определяет гиперплоскость — множество векторов $\vec{x} = (x_1, \ldots, x_n)$, принадлежащих пространству меньшей размерности $\mathbb{R}^{n-1}$. Например, для $\mathbb{R}^1$ гиперплоскостью является точка, для $\mathbb{R}^2$ — прямая, для $\mathbb{R}^3$ — плоскость и т.д. Параметр $\vec{w}$ определяет вектор нормали к гиперплоскости, а через $\frac{b}{\lVert \vec{w} \rVert}$ выражается расстояние от гиперплоскости до начала координат.&lt;br /&gt;
&lt;br /&gt;
Гиперплоскость делит $\mathbb{R}^n$ на два полупространства: $\langle \vec{w}, \vec{x} \rangle - b &amp;gt; 0$ и $\langle \vec{w}, \vec{x} \rangle - b &amp;lt; 0$. &lt;br /&gt;
&lt;br /&gt;
Говорят, что гиперплоскость разделяет два класса $C_1$ и $C_2$, если объекты этих классов лежат по разные стороны от гиперплоскости, то есть выполнено либо&lt;br /&gt;
&lt;br /&gt;
$\begin{cases}\langle \vec{w}, \vec{x} \rangle - b &amp;gt; 0, &amp;amp;&amp;amp; \forall x \in C_1 \\ \langle \vec{w}, \vec{x} \rangle - b &amp;lt; 0, &amp;amp;&amp;amp; \forall x \in C_2\end{cases}$&lt;br /&gt;
&lt;br /&gt;
либо&lt;br /&gt;
&lt;br /&gt;
$\begin{cases}\langle \vec{w}, \vec{x} \rangle - b &amp;lt; 0, &amp;amp;&amp;amp; \forall x \in C_1 \\ \langle \vec{w}, \vec{x} \rangle - b &amp;gt; 0, &amp;amp;&amp;amp; \forall x \in C_2\end{cases}$&lt;br /&gt;
&lt;br /&gt;
=== Линейно разделимая выборка ===&lt;br /&gt;
&lt;br /&gt;
Пусть выборка линейно разделима, то есть существует некоторая гиперплоскость, разделяющая классы $-1$ и $+1$. Тогда в качестве алгоритма классификации можно использовать линейный пороговый классификатор:&lt;br /&gt;
&lt;br /&gt;
$a(\vec{x}) = sign(\langle \vec{w}, \vec{x} \rangle - b) = sign\left(\sum\limits_{i=1}^\ell w_i x_i - b\right)$&lt;br /&gt;
&lt;br /&gt;
где $\vec{x} = (x_1, \ldots, x_n)$ — вектор значений признаков объекта, а $\vec{w} = (w_1, \ldots, w_n) \in \mathbb{R}^n$ и $b \in \mathbb{R}$ — параметры гиперплоскости.&lt;br /&gt;
&lt;br /&gt;
Но для двух линейно разделимых классов возможны различные варианты построения разделяющих гиперплоскостей. Метод опорных векторов выбирает ту гиперплоскость, которая максимизирует отступ между классами:&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
'''Отступ''' (англ. ''margin'') — характеристика, оценивающая, насколько объект &amp;quot;погружён&amp;quot; в свой класс, насколько типичным представителем класса он является. Чем меньше значение отступа $M_i$, тем ближе объект $\vec{x}_i$ подходит к границе классов и тем выше становится вероятность ошибки. Отступ $M_i$ отрицателен тогда и только тогда, когда алгоритм $a(x)$ допускает ошибку на объекте $\vec{x}_i$. &amp;lt;br&amp;gt;&amp;lt;br&amp;gt; Для линейного классификатора отступ определяется уравнением: $M_i(\vec{w}, b) = y_i(\langle \vec{w}, \vec{x}_i \rangle - b)$&lt;br /&gt;
}}&lt;br /&gt;
Если выборка линейно разделима, то существует такая гиперплоскость, отступ от которой до каждого объекта положителен:&lt;br /&gt;
&lt;br /&gt;
$\exists \vec{w}, b : \; M_i(\vec{w}, b) = y_i(\langle \vec{w}, \vec{x}_i \rangle - b) &amp;gt; 0, \; i = 1\ldots\ell$&lt;br /&gt;
&lt;br /&gt;
Мы хотим построить такую разделяющую гиперплоскость, чтобы объекты обучающей выборки находились на наибольшем расстоянии от неё.&lt;br /&gt;
&lt;br /&gt;
[[Файл:SVM_margin.png|300px|thumb|right|Оптимальная разделяющая гиперплоскость в $\mathbb{R}^2$]]&lt;br /&gt;
Заметим, что при умножении $\vec{w}$ и $b$ на константу $c \neq 0$ уравнение $\langle c\vec{w}, \vec{x} \rangle - cb = 0$ определяет ту же самую гиперплоскость, что и $\langle \vec{w}, \vec{x} \rangle - b = 0$. Для удобства проведём нормировку: выберем константу $c$ таким образом, чтобы $\min M_i(\vec{w}, b) = 1$. При этом в каждом из двух классов найдётся хотя бы один &amp;quot;граничный&amp;quot; объект обучающей выборки, отступ которого равен этому минимуму: иначе можно было бы сместить гиперплоскость в сторону класса с большим отступом, тем самым увеличив минимальное расстояние от гиперплоскости до объектов обучающей выборки. &lt;br /&gt;
&lt;br /&gt;
Обозначим любой &amp;quot;граничный&amp;quot; объект из класса $+1$ как $\vec{x}_+$, из класса $-1$ как $\vec{x}_-$. Их отступ равен единице, то есть&lt;br /&gt;
&lt;br /&gt;
$\begin{cases}&lt;br /&gt;
M_+(\vec{w}, b) = (+1)(\langle \vec{w}, \vec{x}_+ \rangle - b) = 1 \\&lt;br /&gt;
M_-(\vec{w}, b) = (-1)(\langle \vec{w}, \vec{x}_- \rangle - b) = 1&lt;br /&gt;
\end{cases}$&lt;br /&gt;
&lt;br /&gt;
Нормировка позволяет ограничить разделяющую полосу между классами: $\{x: -1 &amp;lt; \langle \vec{w}, \vec{x}_i \rangle - b &amp;lt; 1\}$. Внутри неё не может лежать ни один объект обучающей выборки. Ширину разделяющей полосы можно выразить как проекцию вектора $\vec{x}_+ - \vec{x}_-$ на нормаль к гиперплоскости $\vec{w}$. Чтобы разделяющая гиперплоскость находилась на наибольшем расстоянии от точек выборки, ширина полосы должна быть максимальной: &lt;br /&gt;
&lt;br /&gt;
$\frac{\langle \vec{x}_+ - \vec{x}_-, \vec{w} \rangle}{\lVert w \rVert} = \frac{\langle \vec{x}_+, \vec{w} \rangle - \langle \vec{x}_-, \vec{w} \rangle - b + b}{\lVert w \rVert} = \frac{(+1)\left(\langle \vec{x}_+, \vec{w} \rangle - b\right) \, + \, (-1)\left(\langle \vec{x}_-, \vec{w} \rangle - b\right)}{\lVert w \rVert} = \\ = \frac{M_+(\vec{w}, b) \, + \, M_-(\vec{w}, b)}{\lVert w \rVert} = \frac{2}{\lVert w \rVert} \to \max \; \Rightarrow \; \lVert w \rVert \to \min$&lt;br /&gt;
&lt;br /&gt;
Это приводит нас к постановке задачи оптимизации в терминах квадратичного программирования:&lt;br /&gt;
&lt;br /&gt;
$\begin{cases}&lt;br /&gt;
\lVert \vec{w} \rVert^2 \to \min\limits_{w,b} \\&lt;br /&gt;
M_i(\vec{w}, b) \geq 1, \quad i = 1, \ldots, \ell&lt;br /&gt;
\end{cases}$&lt;br /&gt;
&lt;br /&gt;
=== Линейно неразделимая выборка ===&lt;br /&gt;
&lt;br /&gt;
На практике линейно разделимые выборки практически не встречаются: в данных возможны выбросы и нечёткие границы между классами. В таком случае поставленная выше задача не имеет решений, и необходимо ослабить ограничения, позволив некоторым объектам попадать на &amp;quot;территорию&amp;quot; другого класса. Для каждого объекта отнимем от отступа некоторую положительную величину $\xi_i$, но потребуем чтобы эти введённые поправки были минимальны. Это приведёт к следующей постановке задачи:&lt;br /&gt;
&lt;br /&gt;
$\begin{cases}&lt;br /&gt;
\frac{1}{2} \lVert \vec{w} \rVert^2 \color{red}{+ C \sum\limits_{i=1}^\ell \xi_i} \to \min\limits_{w, b, \color{red}{\xi}} \\&lt;br /&gt;
M_i(\vec{w}, b) \geq 1 \color{red}{- \xi_i}, \quad i = 1, \ldots, \ell \\&lt;br /&gt;
\color{red}{\xi_i \geq 0, \quad i = 1, \ldots, \ell} \\&lt;br /&gt;
\end{cases}$&lt;br /&gt;
&lt;br /&gt;
Мы не знаем, какой из функционалов $\frac{1}{2} \lVert \vec{w} \rVert^2$ и $\sum\limits_{i=1}^\ell \xi_i$ важнее, поэтому вводим коэффициент $C$, который будем оптимизировать с помощью кросс-валидации. В итоге мы получили задачу, у которой всегда есть единственное решение.&lt;br /&gt;
&lt;br /&gt;
Заметим, что мы можем упростить постановку задачи:&lt;br /&gt;
&lt;br /&gt;
$\begin{cases}&lt;br /&gt;
\xi_i \geq 0 \\&lt;br /&gt;
\xi_i \geq 1 - M_i(\vec{w}, b) \\&lt;br /&gt;
\sum\limits_{i=1}^\ell \xi_i \to \min&lt;br /&gt;
\end{cases} &lt;br /&gt;
\,\Rightarrow\,&lt;br /&gt;
\begin{cases} &lt;br /&gt;
\xi_i \geq \max(0, 1 - M_i(\vec{w}, b)) \\&lt;br /&gt;
\sum\limits_{i=1}^\ell \xi_i \to \min&lt;br /&gt;
\end{cases}&lt;br /&gt;
\,\Rightarrow\,&lt;br /&gt;
\xi_i = (1- M_i(\vec{w}, b))_+$&lt;br /&gt;
&lt;br /&gt;
Получим эквивалентную задачу безусловной минимизации:&lt;br /&gt;
&lt;br /&gt;
$\frac{1}{2} \lVert \vec{w} \rVert^2 + C \sum\limits_{i=1}^\ell \left(1 - M_i(\vec{w}, b)\right)_+ \to \min\limits_{w, b}$&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|id=kkt&lt;br /&gt;
|author=Условия Каруша—Куна—Таккера&lt;br /&gt;
|statement=&lt;br /&gt;
Пусть поставлена задача нелинейного программирования с ограничениями:&lt;br /&gt;
$$&lt;br /&gt;
\begin{cases}&lt;br /&gt;
f(x) \to \min\limits_{x \in X} \\&lt;br /&gt;
g_i(x) \leq 0,\;i=1\ldots m \\&lt;br /&gt;
h_j(x) = 0,\;j=1\ldots k&lt;br /&gt;
\end{cases}&lt;br /&gt;
$$&lt;br /&gt;
&lt;br /&gt;
Если $x$ — точка локального минимума при наложенных ограничениях, то существуют такие множители $\mu_i, i = 1\ldots m$, $\;\lambda_j, j = 1\ldots k$, что для функции Лагранжа $L(x; \mu, \lambda)$ выполняются условия:&lt;br /&gt;
&lt;br /&gt;
$$\begin{cases}\frac{\partial L}{\partial x} = 0, \quad L(x; \mu, \lambda) = f(x) + \sum\limits_{i=1}^m \mu_i g_i(x) + \sum\limits_{j=1}^k \lambda_j h_j(x) \\ g_i(x) \leq 0,\;h_j(x) = 0 \quad \text{(исходные ограничения)} \\ \mu_i \geq 0 \quad \text{(двойственные ограничения)} \\ \mu_i g_i(x) = 0 \quad \text{(условие дополняющей нежёсткости)} \end{cases}$$&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
По теореме Каруша—Куна—Таккера, поставленная нами задача минимизации эквивалентна двойственной задаче для функции Лагранжа:&lt;br /&gt;
&lt;br /&gt;
$\mathscr{L}(\vec{w},b,\xi; \lambda, \eta) = \frac{1}{2} \lVert w \rVert^2 - \sum\limits_{i=1}^\ell \lambda_i \left(M_i(\vec{w}, b) - 1\right) - \sum\limits_{i=1}^\ell \xi_i \left(\lambda_i + \eta_i - C\right)$&lt;br /&gt;
&lt;br /&gt;
$\lambda_i$ — переменные, двойственные к ограничениям $M_i \geq 1 - \xi_i$&lt;br /&gt;
&lt;br /&gt;
$\eta_i$ — переменные, двойственные к ограничениям $\xi_i \geq 0$&lt;br /&gt;
&lt;br /&gt;
$\begin{cases}&lt;br /&gt;
\frac{\partial \mathscr{L}}{\partial w} = 0, \quad \frac{\partial \mathscr{L}}{\partial b} = 0, \quad \frac{\partial \mathscr{L}}{\partial \xi} = 0 \\&lt;br /&gt;
\xi_i \geq 0, \quad \lambda_i \geq 0, \quad \eta_i \geq 0, &amp;amp;&amp;amp; i = 1, \ldots, \ell \\&lt;br /&gt;
\lambda_i = 0 \;\text{либо}\; M_i(\vec{w},b) = 1 - \xi_i, &amp;amp;&amp;amp; i = 1, \ldots, \ell \\&lt;br /&gt;
\eta_i = 0 \;\text{либо}\; \xi_i = 0, &amp;amp;&amp;amp; i = 1, \ldots, \ell&lt;br /&gt;
\end{cases}$&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Необходимые условия седловой точки функции Лагранжа:&lt;br /&gt;
&lt;br /&gt;
$\begin{array}{lcl}&lt;br /&gt;
\frac{\partial \mathscr{L}}{\partial w} = \vec{w} - \sum\limits_{i=1}^\ell \lambda_i y_i \vec{x}_i = 0 &amp;amp; \Rightarrow &amp;amp; \vec{w} = \sum\limits_{i=1}^\ell \lambda_i y_i \vec{x}_i \\&lt;br /&gt;
\frac{\partial \mathscr{L}}{\partial b} = -\sum\limits_{i=1}^\ell \lambda_i y_i = 0 &amp;amp; \Rightarrow &amp;amp; \sum\limits_{i=1}^\ell \lambda_i y_i = 0 \\&lt;br /&gt;
\frac{\partial \mathscr{L}}{\partial \xi_i} = -\lambda_i - \eta_i + C = 0 &amp;amp; \Rightarrow &amp;amp; \eta_i + \lambda_i = C, \quad i = 1, \ldots, \ell&lt;br /&gt;
\end{array}$&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Типизация объектов:&lt;br /&gt;
&lt;br /&gt;
# $\lambda_i = 0; \eta_i = C; \xi_i = 0; M_i \geq 1$ — периферийные (неинформативные) объекты&lt;br /&gt;
# $0 &amp;lt; \lambda_i &amp;lt; C; 0 &amp;lt; \eta_i &amp;lt; C; \xi_i = 0; M_i = 1$ — опорные граничные объекты&lt;br /&gt;
# $\lambda_i = С; \eta_i = 0; \xi_i &amp;gt; 0; M_i &amp;lt; 1$ — опорные объекты-нарушители&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
'''Опорный объект''' (опорный вектор, англ. ''support vector'') — объект $\vec{x}_i$, соответствующий которому множитель Лагранжа отличен от нуля: $\lambda_i \neq 0$.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Двойственная задача:&lt;br /&gt;
&lt;br /&gt;
$\begin{cases}&lt;br /&gt;
-\mathscr{L}(\lambda) = -\sum\limits_{i=1}^\ell \lambda_i + \frac{1}{2} \sum\limits_{i=1}^\ell \sum\limits_{j=1}^\ell \lambda_i \lambda_j y_i y_j \langle \vec{x}_i, \vec{x}_j \rangle \to \min\limits_\lambda \\&lt;br /&gt;
0 \leq \lambda_i \leq C, \quad i = 1, \ldots, \ell \\&lt;br /&gt;
\sum\limits_{i=1}^\ell \lambda_i y_i = 0&lt;br /&gt;
\end{cases}$&lt;br /&gt;
&lt;br /&gt;
Решение прямой задачи выражается через решение двойственной:&lt;br /&gt;
&lt;br /&gt;
$\begin{cases}&lt;br /&gt;
\vec{w} = \sum\limits_{i=1}^\ell \lambda_i y_i \vec{x}_i \\&lt;br /&gt;
b = \langle \vec{w}, \vec{x}_i \rangle - y_i, \quad \text{для любого}\; i: \lambda_i &amp;gt; 0, M_i = 1&lt;br /&gt;
\end{cases}$&lt;br /&gt;
&lt;br /&gt;
Линейный классификатор:&lt;br /&gt;
&lt;br /&gt;
$a(x) = sign \left(\sum\limits_{i=1}^\ell \lambda_i y_i \langle \vec{x}_i, \vec{x} \rangle - b\right)$&lt;br /&gt;
&lt;br /&gt;
=== Нелинейное обобщение, kernel trick ===&lt;br /&gt;
&lt;br /&gt;
Переход к спрямляющему пространству более высокой размерности: $\psi : X \to H$.&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
'''Ядро''' (англ. ''kernel'') — функция $K: X \times X \to \mathbb{R}$, которая является скалярным произведением в некотором гильбертовом пространстве: $K(\vec{x}_1, \vec{x}_2) = \langle \psi(\vec{x}_1), \psi(\vec{x}_2) \rangle$ при некотором $\psi : X \to H$, где $H$ — гильбертово пространство.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|id=kernel&lt;br /&gt;
|author=&lt;br /&gt;
|statement=&lt;br /&gt;
Функция $K(\vec{x}_1, \vec{x}_2)$ является ядром тогда и только тогда, когда выполнены условия: &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
$\begin{cases}K(\vec{x}_1, \vec{x}_2) = K(\vec{x}_2, \vec{x}_1) &amp;amp; \text{(симметричность)} \\[1ex] \forall g: X \to \mathbb{R} \quad \int\limits_X \int\limits_X K(\vec{x}_1, \vec{x}_2) g(\vec{x}_1) g(\vec{x}_2) d \vec{x}_1 d \vec{x}_2 \geq 0 &amp;amp; \text{(неотрицательная определенность)}\end{cases}$&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Точный алгоритм выбора ядер не описан, однако существуют исследования в области генетических алгоритмов&amp;lt;ref&amp;gt;[https://www.researchgate.net/publication/221080223_An_Evolutionary_Approach_to_Automatic_Kernel_Construction T.Howley, M.G.Madden — An Evolutionary Approach to Automatic Kernel Construction]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Конструктивные методы синтеза ядер:&lt;br /&gt;
&lt;br /&gt;
# $K(\vec{x}_1, \vec{x}_2) = \langle \vec{x}_1, \vec{x}_2 \rangle \quad$ (скалярное произведение)&lt;br /&gt;
# $K(\vec{x}_1, \vec{x}_2) = \alpha \quad$ (константа $\alpha \in \mathbb{R}_+$)&lt;br /&gt;
# $K(\vec{x}_1, \vec{x}_2) = K_1(\vec{x}_1, \vec{x}_2) + K_2(\vec{x}_1, \vec{x}_2) \quad$ (сумма ядер)&lt;br /&gt;
# $K(\vec{x}_1, \vec{x}_2) = K_1(\vec{x}_1, \vec{x}_2) * K_2(\vec{x}_1, \vec{x}_2) \quad$ (произведение ядер)&lt;br /&gt;
# $K(\vec{x}_1, \vec{x}_2) = \psi(\vec{x}_1) * \psi(\vec{x}_2) \quad$ (произведение функций $\psi : X \to \mathbb{R}$)&lt;br /&gt;
# $K(\vec{x}_1, \vec{x}_2) = K_1(\phi(\vec{x}_1), \phi(\vec{x}_2)) \quad$ (ядро от функций $\phi : X \to X$)&lt;br /&gt;
# $K(\vec{x}_1, \vec{x}_2) = \int\limits_X s(\vec{x}_1, \vec{z}) s(\vec{x}_2, \vec{z}) d \vec{z} \quad$ ($s : X \times X \to \mathbb{R}$ — симметричная интегрируемая функция)&lt;br /&gt;
# $K(\vec{x}_1, \vec{x}_2) = f(K_1(\vec{x}_1, \vec{x}_2)) \quad$ ($f: \mathbb{R} \to \mathbb{R}$ представима в виде сходящегося степенного ряда с неотрицательными коэффициентами)&lt;br /&gt;
&lt;br /&gt;
Примеры ядер:&lt;br /&gt;
&lt;br /&gt;
* $K(\vec{x}_1, \vec{x}_2) = (\langle \vec{x}_1, \vec{x}_2 \rangle + c)^d, \quad c, d \in \mathbb{R}$ — полиномиальное ядро&lt;br /&gt;
* $K(\vec{x}_1, \vec{x}_2) = \sigma(\langle \vec{x}_1, \vec{x}_2 \rangle)$ — нейросеть с заданной функцией активации $\sigma(z)$ (не при всех $\sigma$ является ядром)&lt;br /&gt;
* $K(\vec{x}_1, \vec{x}_2) = \exp(-\beta \lVert \vec{x}_1 - \vec{x}_2 \rVert^2)$ — сеть радиальных базисных функций (англ. ''RBF'')&lt;br /&gt;
&lt;br /&gt;
== Метод опорных векторов в задаче регрессии ==&lt;br /&gt;
// TODO&lt;br /&gt;
&lt;br /&gt;
== Преимущества и недостатки SVM ==&lt;br /&gt;
&lt;br /&gt;
Преимущества SVM перед методом стохастического градиента и нейронными сетями:&lt;br /&gt;
&lt;br /&gt;
* Задача выпуклого квадратичного программирования имеет единственное решение&lt;br /&gt;
* Метод опорных векторов эквивалентен двухслойной нейронной сети, где число нейронов на скрытом слое определяется автоматически как число опорных векторов&lt;br /&gt;
&lt;br /&gt;
Недостатки классического SVM:&lt;br /&gt;
&lt;br /&gt;
* Неустойчивость к шуму&lt;br /&gt;
* Нет общих подходов к оптимизации ядра под задачу&lt;br /&gt;
* Нет отбора признаков&lt;br /&gt;
* Необходимо подбирать константу $C$&lt;br /&gt;
&lt;br /&gt;
== Модификации ==&lt;br /&gt;
&lt;br /&gt;
Существуют различные дополнения и модификации метода опорных векторов, направленные на устранение описанных недостатков:&lt;br /&gt;
&lt;br /&gt;
* [[Метод релевантных векторов (Relevance Vector Machine, RVM)]]&lt;br /&gt;
* [[1-norm SVM (LASSO SVM)]]&lt;br /&gt;
* [[Doubly Regularized SVM (ElasticNet SVM)]]&lt;br /&gt;
* [[Support Features Machine (SFM)]]&lt;br /&gt;
* [[Relevance Features Machine (RFM)]]&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
* [[Обзор библиотек для машинного обучения на Python]]&lt;br /&gt;
* [[Общие понятия]]&lt;br /&gt;
&lt;br /&gt;
== Примечания ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
* [http://www.machinelearning.ru/wiki/index.php?title=%D0%9C%D0%B0%D1%88%D0%B8%D0%BD%D0%B0_%D0%BE%D0%BF%D0%BE%D1%80%D0%BD%D1%8B%D1%85_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2 machinelearning.ru {{---}} Машина опорных векторов]&lt;br /&gt;
* [https://www.youtube.com/watch?v=Adi67_94_gc&amp;amp;list=PLJOzdkh8T5kp99tGTEFjH_b9zqEQiiBtC&amp;amp;index=5 Лекция &amp;quot;Линейные методы классификации: метод опорных векторов&amp;quot;]  {{---}} К.В. Воронцов, курс &amp;quot;Машинное обучение&amp;quot; 2014&lt;br /&gt;
* [https://ru.wikipedia.org/wiki/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%BE%D0%BF%D0%BE%D1%80%D0%BD%D1%8B%D1%85_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2 Wikipedia {{---}} Метод опорных векторов]&lt;br /&gt;
* Alexey Nefedov {{---}} [https://svmtutorial.online/ Support Vector Machines: A Simple Tutorial]&lt;br /&gt;
* John Platt {{---}} [https://www.microsoft.com/en-us/research/publication/sequential-minimal-optimization-a-fast-algorithm-for-training-support-vector-machines/ Sequential Minimal Optimization: A Fast Algorithm for Training Support Vector Machines]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Машинное обучение]]&lt;br /&gt;
[[Категория: Классификация]]&lt;br /&gt;
[[Категория: Регрессия]]&lt;/div&gt;</summary>
		<author><name>Egormkn</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%BE%D0%BF%D0%BE%D1%80%D0%BD%D1%8B%D1%85_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2_(SVM)&amp;diff=70673</id>
		<title>Метод опорных векторов (SVM)</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%BE%D0%BF%D0%BE%D1%80%D0%BD%D1%8B%D1%85_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2_(SVM)&amp;diff=70673"/>
				<updated>2019-04-01T14:54:30Z</updated>
		
		<summary type="html">&lt;p&gt;Egormkn: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{в разработке}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Метод опорных векторов''' (англ. ''support vector machine'', ''SVM'') — один из наиболее популярных методов обучения, который применяется для решения задач классификации и регрессии. Основная идея метода заключается в построении гиперплоскости, разделяющей объекты выборки наиболее оптимальным способом. Алгоритм работает в предположении, что чем больше расстояние (зазор) между разделяющей гиперплоскостью и объектами разделяемых классов, тем меньше будет средняя ошибка классификатора.&lt;br /&gt;
&lt;br /&gt;
== Метод опорных векторов в задаче классификации ==&lt;br /&gt;
&lt;br /&gt;
Рассмотрим задачу бинарной классификации, в которой объектам из $X=\mathbb{R}^n$ соответствует один из двух классов $Y = \{-1, +1\}$.&lt;br /&gt;
&lt;br /&gt;
Пусть задана обучающая выборка пар &amp;quot;объект-ответ&amp;quot;: $T^\ell = (\vec{x}_i, y_i)_{i=1}^\ell$. Необходимо построить алгоритм классификации $a(\vec{x}) : X \to Y$.&lt;br /&gt;
&lt;br /&gt;
=== Разделяющая гиперплоскость ===&lt;br /&gt;
&lt;br /&gt;
[[Файл:svm_hyperplane.png|300px|thumb|right|Примеры разделяющих гиперплоскостей в $\mathbb{R}^2$]]&lt;br /&gt;
&lt;br /&gt;
В пространстве $\mathbb{R}^n$ уравнение $\langle \vec{w}, \vec{x} \rangle - b = 0$ при заданных $\vec{w}$ и $b$ определяет гиперплоскость — множество векторов $\vec{x} = (x_1, \ldots, x_n)$, принадлежащих пространству меньшей размерности $\mathbb{R}^{n-1}$. Например, для $\mathbb{R}^1$ гиперплоскостью является точка, для $\mathbb{R}^2$ — прямая, для $\mathbb{R}^3$ — плоскость и т.д. Параметр $\vec{w}$ определяет вектор нормали к гиперплоскости, а через $\frac{b}{\lVert \vec{w} \rVert}$ выражается расстояние от гиперплоскости до начала координат.&lt;br /&gt;
&lt;br /&gt;
Гиперплоскость делит $\mathbb{R}^n$ на два полупространства: $\langle \vec{w}, \vec{x} \rangle - b &amp;gt; 0$ и $\langle \vec{w}, \vec{x} \rangle - b &amp;lt; 0$. &lt;br /&gt;
&lt;br /&gt;
Говорят, что гиперплоскость разделяет два класса $C_1$ и $C_2$, если объекты этих классов лежат по разные стороны от гиперплоскости, то есть выполнено либо&lt;br /&gt;
&lt;br /&gt;
$\begin{cases}\langle \vec{w}, \vec{x} \rangle - b &amp;gt; 0, &amp;amp;&amp;amp; \forall x \in C_1 \\ \langle \vec{w}, \vec{x} \rangle - b &amp;lt; 0, &amp;amp;&amp;amp; \forall x \in C_2\end{cases}$&lt;br /&gt;
&lt;br /&gt;
либо&lt;br /&gt;
&lt;br /&gt;
$\begin{cases}\langle \vec{w}, \vec{x} \rangle - b &amp;lt; 0, &amp;amp;&amp;amp; \forall x \in C_1 \\ \langle \vec{w}, \vec{x} \rangle - b &amp;gt; 0, &amp;amp;&amp;amp; \forall x \in C_2\end{cases}$&lt;br /&gt;
&lt;br /&gt;
=== Линейно разделимая выборка ===&lt;br /&gt;
&lt;br /&gt;
Пусть выборка линейно разделима, то есть существует некоторая гиперплоскость, разделяющая классы $-1$ и $+1$. Тогда в качестве алгоритма классификации можно использовать линейный пороговый классификатор:&lt;br /&gt;
&lt;br /&gt;
$a(\vec{x}) = sign(\langle \vec{w}, \vec{x} \rangle - b) = sign\left(\sum\limits_{i=1}^\ell w_i x_i - b\right)$&lt;br /&gt;
&lt;br /&gt;
где $\vec{x} = (x_1, \ldots, x_n)$ — вектор значений признаков объекта, а $\vec{w} = (w_1, \ldots, w_n) \in \mathbb{R}^n$ и $b \in \mathbb{R}$ — параметры гиперплоскости.&lt;br /&gt;
&lt;br /&gt;
Но для двух линейно разделимых классов возможны различные варианты построения разделяющих гиперплоскостей. Метод опорных векторов выбирает ту гиперплоскость, которая максимизирует отступ между классами:&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
'''Отступ''' (англ. ''margin'') — характеристика, оценивающая, насколько объект &amp;quot;погружён&amp;quot; в свой класс, насколько типичным представителем класса он является. Чем меньше значение отступа $M_i$, тем ближе объект $\vec{x}_i$ подходит к границе классов и тем выше становится вероятность ошибки. Отступ $M_i$ отрицателен тогда и только тогда, когда алгоритм $a(x)$ допускает ошибку на объекте $\vec{x}_i$. &amp;lt;br&amp;gt;&amp;lt;br&amp;gt; Для линейного классификатора отступ определяется уравнением: $M_i(\vec{w}, b) = y_i(\langle \vec{w}, \vec{x}_i \rangle - b)$&lt;br /&gt;
}}&lt;br /&gt;
Если выборка линейно разделима, то существует такая гиперплоскость, отступ от которой до каждого объекта положителен:&lt;br /&gt;
&lt;br /&gt;
$\exists \vec{w}, b : \; M_i(\vec{w}, b) = y_i(\langle \vec{w}, \vec{x}_i \rangle - b) &amp;gt; 0, \; i = 1\ldots\ell$&lt;br /&gt;
&lt;br /&gt;
Мы хотим построить такую разделяющую гиперплоскость, чтобы объекты обучающей выборки находились на наибольшем расстоянии от неё.&lt;br /&gt;
&lt;br /&gt;
[[Файл:SVM_margin.png|300px|thumb|right|Оптимальная разделяющая гиперплоскость в $\mathbb{R}^2$]]&lt;br /&gt;
Заметим, что при умножении $\vec{w}$ и $b$ на константу $c \neq 0$ уравнение $\langle c\vec{w}, \vec{x} \rangle - cb = 0$ определяет ту же самую гиперплоскость, что и $\langle \vec{w}, \vec{x} \rangle - b = 0$. Для удобства проведём нормировку: выберем константу $c$ таким образом, чтобы $\min M_i(\vec{w}, b) = 1$. При этом в каждом из двух классов найдётся хотя бы один &amp;quot;граничный&amp;quot; объект обучающей выборки, отступ которого равен этому минимуму: иначе можно было бы сместить гиперплоскость в сторону класса с большим отступом, тем самым увеличив минимальное расстояние от гиперплоскости до объектов обучающей выборки. &lt;br /&gt;
&lt;br /&gt;
Обозначим любой &amp;quot;граничный&amp;quot; объект из класса $+1$ как $\vec{x}_+$, из класса $-1$ как $\vec{x}_-$. Их отступ равен единице, то есть&lt;br /&gt;
&lt;br /&gt;
$\begin{cases}&lt;br /&gt;
M_+(\vec{w}, b) = (+1)(\langle \vec{w}, \vec{x}_+ \rangle - b) = 1 \\&lt;br /&gt;
M_-(\vec{w}, b) = (-1)(\langle \vec{w}, \vec{x}_- \rangle - b) = 1&lt;br /&gt;
\end{cases}$&lt;br /&gt;
&lt;br /&gt;
Нормировка позволяет ограничить разделяющую полосу между классами: $\{x: -1 &amp;lt; \langle \vec{w}, \vec{x}_i \rangle - b &amp;lt; 1\}$. Внутри неё не может лежать ни один объект обучающей выборки. Ширину разделяющей полосы можно выразить как проекцию вектора $\vec{x}_+ - \vec{x}_-$ на нормаль к гиперплоскости $\vec{w}$. Чтобы разделяющая гиперплоскость находилась на наибольшем расстоянии от точек выборки, ширина полосы должна быть максимальной: &lt;br /&gt;
&lt;br /&gt;
$\frac{\langle \vec{x}_+ - \vec{x}_-, \vec{w} \rangle}{\lVert w \rVert} = \frac{\langle \vec{x}_+, \vec{w} \rangle - \langle \vec{x}_-, \vec{w} \rangle - b + b}{\lVert w \rVert} = \frac{(+1)\left(\langle \vec{x}_+, \vec{w} \rangle - b\right) \, + \, (-1)\left(\langle \vec{x}_-, \vec{w} \rangle - b\right)}{\lVert w \rVert} = \\ = \frac{M_+(\vec{w}, b) \, + \, M_-(\vec{w}, b)}{\lVert w \rVert} = \frac{2}{\lVert w \rVert} \to \max \; \Rightarrow \; \lVert w \rVert \to \min$&lt;br /&gt;
&lt;br /&gt;
Это приводит нас к постановке задачи оптимизации в терминах квадратичного программирования:&lt;br /&gt;
&lt;br /&gt;
$\begin{cases}&lt;br /&gt;
\lVert \vec{w} \rVert^2 \to \min\limits_{w,b} \\&lt;br /&gt;
M_i(\vec{w}, b) \geq 1, \quad i = 1, \ldots, \ell&lt;br /&gt;
\end{cases}$&lt;br /&gt;
&lt;br /&gt;
=== Линейно неразделимая выборка ===&lt;br /&gt;
&lt;br /&gt;
На практике линейно разделимые выборки практически не встречаются: в данных возможны выбросы и нечёткие границы между классами. В таком случае поставленная выше задача не имеет решений, и необходимо ослабить ограничения, позволив некоторым объектам попадать на &amp;quot;территорию&amp;quot; другого класса. Для каждого объекта отнимем от отступа некоторую положительную величину $\xi_i$, но потребуем чтобы эти введённые поправки были минимальны. Это приведёт к следующей постановке задачи:&lt;br /&gt;
&lt;br /&gt;
$\begin{cases}&lt;br /&gt;
\frac{1}{2} \lVert \vec{w} \rVert^2 \color{red}{+ C \sum\limits_{i=1}^\ell \xi_i} \to \min\limits_{w, b, \color{red}{\xi}} \\&lt;br /&gt;
M_i(\vec{w}, b) \geq 1 \color{red}{- \xi_i}, \quad i = 1, \ldots, \ell \\&lt;br /&gt;
\color{red}{\xi_i \geq 0, \quad i = 1, \ldots, \ell} \\&lt;br /&gt;
\end{cases}$&lt;br /&gt;
&lt;br /&gt;
Мы не знаем, какой из функционалов $\frac{1}{2} \lVert \vec{w} \rVert^2$ и $\sum\limits_{i=1}^\ell \xi_i$ важнее, поэтому вводим коэффициент $C$, который будем оптимизировать с помощью кросс-валидации. В итоге мы получили задачу, у которой всегда есть единственное решение.&lt;br /&gt;
&lt;br /&gt;
Заметим, что мы можем упростить постановку задачи:&lt;br /&gt;
&lt;br /&gt;
$\begin{cases}&lt;br /&gt;
\xi_i \geq 0 \\&lt;br /&gt;
\xi_i \geq 1 - M_i(\vec{w}, b) \\&lt;br /&gt;
\sum\limits_{i=1}^\ell \xi_i \to \min&lt;br /&gt;
\end{cases} &lt;br /&gt;
\,\Rightarrow\,&lt;br /&gt;
\begin{cases} &lt;br /&gt;
\xi_i \geq \max(0, 1 - M_i(\vec{w}, b)) \\&lt;br /&gt;
\sum\limits_{i=1}^\ell \xi_i \to \min&lt;br /&gt;
\end{cases}&lt;br /&gt;
\,\Rightarrow\,&lt;br /&gt;
\xi_i = (1- M_i(\vec{w}, b))_+$&lt;br /&gt;
&lt;br /&gt;
Получим эквивалентную задачу безусловной минимизации:&lt;br /&gt;
&lt;br /&gt;
$\frac{1}{2} \lVert \vec{w} \rVert^2 + C \sum\limits_{i=1}^\ell \left(1 - M_i(\vec{w}, b)\right)_+ \to \min\limits_{w, b}$&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|id=kkt&lt;br /&gt;
|author=Условия Каруша—Куна—Таккера&lt;br /&gt;
|statement=&lt;br /&gt;
Пусть поставлена задача нелинейного программирования с ограничениями:&lt;br /&gt;
$$&lt;br /&gt;
\begin{cases}&lt;br /&gt;
f(x) \to \min\limits_{x \in X} \\&lt;br /&gt;
g_i(x) \leq 0,\;i=1\ldots m \\&lt;br /&gt;
h_j(x) = 0,\;j=1\ldots k&lt;br /&gt;
\end{cases}&lt;br /&gt;
$$&lt;br /&gt;
&lt;br /&gt;
Если $x$ — точка локального минимума при наложенных ограничениях, то существуют такие множители $\mu_i, i = 1\ldots m$, $\;\lambda_j, j = 1\ldots k$, что для функции Лагранжа $L(x; \mu, \lambda)$ выполняются условия:&lt;br /&gt;
&lt;br /&gt;
$$\begin{cases}\frac{\partial L}{\partial x} = 0, \quad L(x; \mu, \lambda) = f(x) + \sum\limits_{i=1}^m \mu_i g_i(x) + \sum\limits_{j=1}^k \lambda_j h_j(x) \\ g_i(x) \leq 0,\;h_j(x) = 0 \quad \text{(исходные ограничения)} \\ \mu_i \geq 0 \quad \text{(двойственные ограничения)} \\ \mu_i g_i(x) = 0 \quad \text{(условие дополняющей нежёсткости)} \end{cases}$$&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
По теореме Каруша—Куна—Таккера, поставленная нами задача минимизации эквивалентна двойственной задаче для функции Лагранжа:&lt;br /&gt;
&lt;br /&gt;
$\mathscr{L}(\vec{w},b,\xi; \lambda, \eta) = \frac{1}{2} \lVert w \rVert^2 - \sum\limits_{i=1}^\ell \lambda_i \left(M_i(\vec{w}, b) - 1\right) - \sum\limits_{i=1}^\ell \xi_i \left(\lambda_i + \eta_i - C\right)$&lt;br /&gt;
&lt;br /&gt;
$\lambda_i$ — переменные, двойственные к ограничениям $M_i \geq 1 - \xi_i$&lt;br /&gt;
&lt;br /&gt;
$\eta_i$ — переменные, двойственные к ограничениям $\xi_i \geq 0$&lt;br /&gt;
&lt;br /&gt;
$\begin{cases}&lt;br /&gt;
\frac{\partial \mathscr{L}}{\partial w} = 0, \quad \frac{\partial \mathscr{L}}{\partial b} = 0, \quad \frac{\partial \mathscr{L}}{\partial \xi} = 0 \\&lt;br /&gt;
\xi_i \geq 0, \quad \lambda_i \geq 0, \quad \eta_i \geq 0, &amp;amp;&amp;amp; i = 1, \ldots, \ell \\&lt;br /&gt;
\lambda_i = 0 \;\text{либо}\; M_i(\vec{w},b) = 1 - \xi_i, &amp;amp;&amp;amp; i = 1, \ldots, \ell \\&lt;br /&gt;
\eta_i = 0 \;\text{либо}\; \xi_i = 0, &amp;amp;&amp;amp; i = 1, \ldots, \ell&lt;br /&gt;
\end{cases}$&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Необходимые условия седловой точки функции Лагранжа:&lt;br /&gt;
&lt;br /&gt;
$\begin{array}{lcl}&lt;br /&gt;
\frac{\partial \mathscr{L}}{\partial w} = \vec{w} - \sum\limits_{i=1}^\ell \lambda_i y_i \vec{x}_i = 0 &amp;amp; \Rightarrow &amp;amp; \vec{w} = \sum\limits_{i=1}^\ell \lambda_i y_i \vec{x}_i \\&lt;br /&gt;
\frac{\partial \mathscr{L}}{\partial b} = -\sum\limits_{i=1}^\ell \lambda_i y_i = 0 &amp;amp; \Rightarrow &amp;amp; \sum\limits_{i=1}^\ell \lambda_i y_i = 0 \\&lt;br /&gt;
\frac{\partial \mathscr{L}}{\partial \xi_i} = -\lambda_i - \eta_i + C = 0 &amp;amp; \Rightarrow &amp;amp; \eta_i + \lambda_i = C, \quad i = 1, \ldots, \ell&lt;br /&gt;
\end{array}$&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Типизация объектов:&lt;br /&gt;
&lt;br /&gt;
# $\lambda_i = 0; \eta_i = C; \xi_i = 0; M_i \geq 1$ — периферийные (неинформативные) объекты&lt;br /&gt;
# $0 &amp;lt; \lambda_i &amp;lt; C; 0 &amp;lt; \eta_i &amp;lt; C; \xi_i = 0; M_i = 1$ — опорные граничные объекты&lt;br /&gt;
# $\lambda_i = С; \eta_i = 0; \xi_i &amp;gt; 0; M_i &amp;lt; 1$ — опорные объекты-нарушители&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
'''Опорный объект''' (опорный вектор, англ. ''support vector'') — объект $\vec{x}_i$, соответствующий которому множитель Лагранжа отличен от нуля: $\lambda_i \neq 0$.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Двойственная задача:&lt;br /&gt;
&lt;br /&gt;
$\begin{cases}&lt;br /&gt;
-\mathscr{L}(\lambda) = -\sum\limits_{i=1}^\ell \lambda_i + \frac{1}{2} \sum\limits_{i=1}^\ell \sum\limits_{j=1}^\ell \lambda_i \lambda_j y_i y_j \langle \vec{x}_i, \vec{x}_j \rangle \to \min\limits_\lambda \\&lt;br /&gt;
0 \leq \lambda_i \leq C, \quad i = 1, \ldots, \ell \\&lt;br /&gt;
\sum\limits_{i=1}^\ell \lambda_i y_i = 0&lt;br /&gt;
\end{cases}$&lt;br /&gt;
&lt;br /&gt;
Решение прямой задачи выражается через решение двойственной:&lt;br /&gt;
&lt;br /&gt;
$\begin{cases}&lt;br /&gt;
\vec{w} = \sum\limits_{i=1}^\ell \lambda_i y_i \vec{x}_i \\&lt;br /&gt;
b = \langle \vec{w}, \vec{x}_i \rangle - y_i, \quad \text{для любого}\; i: \lambda_i &amp;gt; 0, M_i = 1&lt;br /&gt;
\end{cases}$&lt;br /&gt;
&lt;br /&gt;
Линейный классификатор:&lt;br /&gt;
&lt;br /&gt;
$a(x) = sign \left(\sum\limits_{i=1}^\ell \lambda_i y_i \langle \vec{x}_i, \vec{x} \rangle - b\right)$&lt;br /&gt;
&lt;br /&gt;
=== Нелинейное обобщение, kernel trick ===&lt;br /&gt;
&lt;br /&gt;
Переход к спрямляющему пространству более высокой размерности: $\psi : X \to H$.&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
'''Ядро''' (англ. ''kernel'') — функция $K: X \times X \to \mathbb{R}$, которая является скалярным произведением в некотором гильбертовом пространстве: $K(\vec{x}_1, \vec{x}_2) = \langle \psi(\vec{x}_1), \psi(\vec{x}_2) \rangle$ при некотором $\psi : X \to H$, где $H$ — гильбертово пространство.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|id=kernel&lt;br /&gt;
|author=&lt;br /&gt;
|statement=&lt;br /&gt;
Функция $K(\vec{x}_1, \vec{x}_2)$ является ядром тогда и только тогда, когда выполнены условия: &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
$\begin{cases}K(\vec{x}_1, \vec{x}_2) = K(\vec{x}_2, \vec{x}_1) &amp;amp; \text{(симметричность)} \\[1ex] \forall g: X \to \mathbb{R} \quad \int\limits_X \int\limits_X K(\vec{x}_1, \vec{x}_2) g(\vec{x}_1) g(\vec{x}_2) d \vec{x}_1 d \vec{x}_2 \geq 0 &amp;amp; \text{(неотрицательная определенность)}\end{cases}$&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Конструктивные методы синтеза ядер:&lt;br /&gt;
&lt;br /&gt;
# $K(\vec{x}_1, \vec{x}_2) = \langle \vec{x}_1, \vec{x}_2 \rangle \quad$ (скалярное произведение)&lt;br /&gt;
# $K(\vec{x}_1, \vec{x}_2) = \alpha \quad$ (константа $\alpha \in \mathbb{R}, \alpha &amp;gt; 0$)&lt;br /&gt;
# $K(\vec{x}_1, \vec{x}_2) = K_1(\vec{x}_1, \vec{x}_2) + K_2(\vec{x}_1, \vec{x}_2) \quad$ (сумма ядер)&lt;br /&gt;
# $K(\vec{x}_1, \vec{x}_2) = K_1(\vec{x}_1, \vec{x}_2) * K_2(\vec{x}_1, \vec{x}_2) \quad$ (произведение ядер)&lt;br /&gt;
# $K(\vec{x}_1, \vec{x}_2) = \psi(\vec{x}_1) * \psi(\vec{x}_2) \quad$ (произведение функций $\psi : X \to \mathbb{R}$)&lt;br /&gt;
# $K(\vec{x}_1, \vec{x}_2) = K_1(\phi(\vec{x}_1), \phi(\vec{x}_2)) \quad$ (ядро от функций $\phi : X \to X$)&lt;br /&gt;
# $K(\vec{x}_1, \vec{x}_2) = \int\limits_X s(\vec{x}_1, \vec{z}) s(\vec{x}_2, \vec{z}) d \vec{z} \quad$ ($s : X \times X \to \mathbb{R}$ — симметричная интегрируемая функция)&lt;br /&gt;
# $K(\vec{x}_1, \vec{x}_2) = f(K_1(\vec{x}_1, \vec{x}_2)) \quad$ ($f: \mathbb{R} \to \mathbb{R}$ представима в виде сходящегося степенного ряда с неотрицательными коэффициентами)&lt;br /&gt;
&lt;br /&gt;
Примеры ядер:&lt;br /&gt;
&lt;br /&gt;
* $K(\vec{x}_1, \vec{x}_2) = (\langle \vec{x}_1, \vec{x}_2 \rangle + c)^d, \quad c, d \in \marhbb{R}$ — полиномиальное ядро&lt;br /&gt;
* $K(\vec{x}_1, \vec{x}_2) = \sigma(\langle \vec{x}_1, \vec{x}_2 \rangle)$ — нейросеть с заданной функцией активации $\sigma(z)$ (не при всех $\sigma$ является ядром)&lt;br /&gt;
* $K(\vec{x}_1, \vec{x}_2) = \exp(-\beta \lVert \vec{x}_1 - \vec{x}_2 \rVert^2)$ — сеть радиальных базисных функций (англ. ''RBF'')&lt;br /&gt;
&lt;br /&gt;
== Метод опорных векторов в задаче регрессии ==&lt;br /&gt;
// TODO&lt;br /&gt;
&lt;br /&gt;
== Преимущества и недостатки SVM ==&lt;br /&gt;
&lt;br /&gt;
Преимущества SVM перед методом стохастического градиента и нейронными сетями:&lt;br /&gt;
&lt;br /&gt;
* Задача выпуклого квадратичного программирования имеет единственное решение&lt;br /&gt;
* Метод опорных векторов эквивалентен двухслойной нейронной сети, где число нейронов на скрытом слое определяется автоматически как число опорных векторов&lt;br /&gt;
&lt;br /&gt;
Недостатки классического SVM:&lt;br /&gt;
&lt;br /&gt;
* Неустойчивость к шуму&lt;br /&gt;
* Нет общих подходов к оптимизации ядра под задачу&lt;br /&gt;
* Нет отбора признаков&lt;br /&gt;
* Необходимо подбирать константу $C$&lt;br /&gt;
&lt;br /&gt;
== Модификации ==&lt;br /&gt;
&lt;br /&gt;
Существуют различные дополнения и модификации метода опорных векторов, направленные на устранение описанных недостатков:&lt;br /&gt;
&lt;br /&gt;
* [[Метод релевантных векторов (Relevance Vector Machine, RVM)]]&lt;br /&gt;
* [[1-norm SVM (LASSO SVM)]]&lt;br /&gt;
* [[Doubly Regularized SVM (ElasticNet SVM)]]&lt;br /&gt;
* [[Support Features Machine (SFM)]]&lt;br /&gt;
* [[Relevance Features Machine (RFM)]]&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
* [[Обзор библиотек для машинного обучения на Python]]&lt;br /&gt;
* [[Общие понятия]]&lt;br /&gt;
&lt;br /&gt;
== Примечания ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
* [http://www.machinelearning.ru/wiki/index.php?title=%D0%9C%D0%B0%D1%88%D0%B8%D0%BD%D0%B0_%D0%BE%D0%BF%D0%BE%D1%80%D0%BD%D1%8B%D1%85_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2 machinelearning.ru {{---}} Машина опорных векторов]&lt;br /&gt;
* [https://www.youtube.com/watch?v=Adi67_94_gc&amp;amp;list=PLJOzdkh8T5kp99tGTEFjH_b9zqEQiiBtC&amp;amp;index=5 Лекция &amp;quot;Линейные методы классификации: метод опорных векторов&amp;quot;]  {{---}} К.В. Воронцов, курс &amp;quot;Машинное обучение&amp;quot; 2014&lt;br /&gt;
* [https://ru.wikipedia.org/wiki/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%BE%D0%BF%D0%BE%D1%80%D0%BD%D1%8B%D1%85_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2 Wikipedia {{---}} Метод опорных векторов]&lt;br /&gt;
* Alexey Nefedov {{---}} [https://svmtutorial.online/ Support Vector Machines: A Simple Tutorial]&lt;br /&gt;
* John Platt {{---}} [https://www.microsoft.com/en-us/research/publication/sequential-minimal-optimization-a-fast-algorithm-for-training-support-vector-machines/ Sequential Minimal Optimization: A Fast Algorithm for Training Support Vector Machines]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Машинное обучение]]&lt;br /&gt;
[[Категория: Классификация]]&lt;br /&gt;
[[Категория: Регрессия]]&lt;/div&gt;</summary>
		<author><name>Egormkn</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%BE%D0%BF%D0%BE%D1%80%D0%BD%D1%8B%D1%85_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2_(SVM)&amp;diff=70671</id>
		<title>Метод опорных векторов (SVM)</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%BE%D0%BF%D0%BE%D1%80%D0%BD%D1%8B%D1%85_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2_(SVM)&amp;diff=70671"/>
				<updated>2019-04-01T14:40:59Z</updated>
		
		<summary type="html">&lt;p&gt;Egormkn: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{в разработке}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Метод опорных векторов''' (англ. ''support vector machine'', ''SVM'') — один из наиболее популярных методов обучения, который применяется для решения задач классификации и регрессии. Основная идея метода заключается в построении гиперплоскости, разделяющей объекты выборки наиболее оптимальным способом. Алгоритм работает в предположении, что чем больше расстояние (зазор) между разделяющей гиперплоскостью и объектами разделяемых классов, тем меньше будет средняя ошибка классификатора.&lt;br /&gt;
&lt;br /&gt;
== Метод опорных векторов в задаче классификации ==&lt;br /&gt;
&lt;br /&gt;
Рассмотрим задачу бинарной классификации, в которой объектам из $X=\mathbb{R}^n$ соответствует один из двух классов $Y = \{-1, +1\}$.&lt;br /&gt;
&lt;br /&gt;
Пусть задана обучающая выборка пар &amp;quot;объект-ответ&amp;quot;: $T^\ell = (\vec{x}_i, y_i)_{i=1}^\ell$. Необходимо построить алгоритм классификации $a(\vec{x}) : X \to Y$.&lt;br /&gt;
&lt;br /&gt;
=== Разделяющая гиперплоскость ===&lt;br /&gt;
&lt;br /&gt;
[[Файл:svm_hyperplane.png|300px|thumb|right|Примеры разделяющих гиперплоскостей в $\mathbb{R}^2$]]&lt;br /&gt;
&lt;br /&gt;
В пространстве $\mathbb{R}^n$ уравнение $\langle \vec{w}, \vec{x} \rangle - b = 0$ при заданных $\vec{w}$ и $b$ определяет гиперплоскость — множество векторов $\vec{x} = (x_1, \ldots, x_n)$, принадлежащих пространству меньшей размерности $\mathbb{R}^{n-1}$. Например, для $\mathbb{R}^1$ гиперплоскостью является точка, для $\mathbb{R}^2$ — прямая, для $\mathbb{R}^3$ — плоскость и т.д. Параметр $\vec{w}$ определяет вектор нормали к гиперплоскости, а через $\frac{b}{\lVert \vec{w} \rVert}$ выражается расстояние от гиперплоскости до начала координат.&lt;br /&gt;
&lt;br /&gt;
Гиперплоскость делит $\mathbb{R}^n$ на два полупространства: $\langle \vec{w}, \vec{x} \rangle - b &amp;gt; 0$ и $\langle \vec{w}, \vec{x} \rangle - b &amp;lt; 0$. &lt;br /&gt;
&lt;br /&gt;
Говорят, что гиперплоскость разделяет два класса $C_1$ и $C_2$, если объекты этих классов лежат по разные стороны от гиперплоскости, то есть выполнено либо&lt;br /&gt;
&lt;br /&gt;
$\begin{cases}\langle \vec{w}, \vec{x} \rangle - b &amp;gt; 0, &amp;amp;&amp;amp; \forall x \in C_1 \\ \langle \vec{w}, \vec{x} \rangle - b &amp;lt; 0, &amp;amp;&amp;amp; \forall x \in C_2\end{cases}$&lt;br /&gt;
&lt;br /&gt;
либо&lt;br /&gt;
&lt;br /&gt;
$\begin{cases}\langle \vec{w}, \vec{x} \rangle - b &amp;lt; 0, &amp;amp;&amp;amp; \forall x \in C_1 \\ \langle \vec{w}, \vec{x} \rangle - b &amp;gt; 0, &amp;amp;&amp;amp; \forall x \in C_2\end{cases}$&lt;br /&gt;
&lt;br /&gt;
=== Линейно разделимая выборка ===&lt;br /&gt;
&lt;br /&gt;
Пусть выборка линейно разделима, то есть существует некоторая гиперплоскость, разделяющая классы $-1$ и $+1$. Тогда в качестве алгоритма классификации можно использовать линейный пороговый классификатор:&lt;br /&gt;
&lt;br /&gt;
$a(\vec{x}) = sign(\langle \vec{w}, \vec{x} \rangle - b) = sign\left(\sum\limits_{i=1}^\ell w_i x_i - b\right)$&lt;br /&gt;
&lt;br /&gt;
где $\vec{x} = (x_1, \ldots, x_n)$ — вектор значений признаков объекта, а $\vec{w} = (w_1, \ldots, w_n) \in \mathbb{R}^n$ и $b \in \mathbb{R}$ — параметры гиперплоскости.&lt;br /&gt;
&lt;br /&gt;
Но для двух линейно разделимых классов возможны различные варианты построения разделяющих гиперплоскостей. Метод опорных векторов выбирает ту гиперплоскость, которая максимизирует отступ между классами:&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
'''Отступ''' (англ. ''margin'') — характеристика, оценивающая, насколько объект &amp;quot;погружён&amp;quot; в свой класс, насколько типичным представителем класса он является. Чем меньше значение отступа $M_i$, тем ближе объект $\vec{x}_i$ подходит к границе классов и тем выше становится вероятность ошибки. Отступ $M_i$ отрицателен тогда и только тогда, когда алгоритм $a(x)$ допускает ошибку на объекте $\vec{x}_i$. &amp;lt;br&amp;gt;&amp;lt;br&amp;gt; Для линейного классификатора отступ определяется уравнением: $M_i(\vec{w}, b) = y_i(\langle \vec{w}, \vec{x}_i \rangle - b)$&lt;br /&gt;
}}&lt;br /&gt;
Если выборка линейно разделима, то существует такая гиперплоскость, отступ от которой до каждого объекта положителен:&lt;br /&gt;
&lt;br /&gt;
$\exists \vec{w}, b : \; M_i(\vec{w}, b) = y_i(\langle \vec{w}, \vec{x}_i \rangle - b) &amp;gt; 0, \; i = 1\ldots\ell$&lt;br /&gt;
&lt;br /&gt;
Мы хотим построить такую разделяющую гиперплоскость, чтобы объекты обучающей выборки находились на наибольшем расстоянии от неё.&lt;br /&gt;
&lt;br /&gt;
[[Файл:SVM_margin.png|300px|thumb|right|Оптимальная разделяющая гиперплоскость в $\mathbb{R}^2$]]&lt;br /&gt;
Заметим, что при умножении $\vec{w}$ и $b$ на константу $c \neq 0$ уравнение $\langle c\vec{w}, \vec{x} \rangle - cb = 0$ определяет ту же самую гиперплоскость, что и $\langle \vec{w}, \vec{x} \rangle - b = 0$. Для удобства проведём нормировку: выберем константу $c$ таким образом, чтобы $\min M_i(\vec{w}, b) = 1$. При этом в каждом из двух классов найдётся хотя бы один &amp;quot;граничный&amp;quot; объект обучающей выборки, отступ которого равен этому минимуму: иначе можно было бы сместить гиперплоскость в сторону класса с большим отступом, тем самым увеличив минимальное расстояние от гиперплоскости до объектов обучающей выборки. &lt;br /&gt;
&lt;br /&gt;
Обозначим любой &amp;quot;граничный&amp;quot; объект из класса $+1$ как $\vec{x}_+$, из класса $-1$ как $\vec{x}_-$. Их отступ равен единице, то есть&lt;br /&gt;
&lt;br /&gt;
$\begin{cases}&lt;br /&gt;
M_+(\vec{w}, b) = (+1)(\langle \vec{w}, \vec{x}_+ \rangle - b) = 1 \\&lt;br /&gt;
M_-(\vec{w}, b) = (-1)(\langle \vec{w}, \vec{x}_- \rangle - b) = 1&lt;br /&gt;
\end{cases}$&lt;br /&gt;
&lt;br /&gt;
Нормировка позволяет ограничить разделяющую полосу между классами: $\{x: -1 &amp;lt; \langle \vec{w}, \vec{x}_i \rangle - b &amp;lt; 1\}$. Внутри неё не может лежать ни один объект обучающей выборки. Ширину разделяющей полосы можно выразить как проекцию вектора $\vec{x}_+ - \vec{x}_-$ на нормаль к гиперплоскости $\vec{w}$. Чтобы разделяющая гиперплоскость находилась на наибольшем расстоянии от точек выборки, ширина полосы должна быть максимальной: &lt;br /&gt;
&lt;br /&gt;
$\frac{\langle \vec{x}_+ - \vec{x}_-, \vec{w} \rangle}{\lVert w \rVert} = \frac{\langle \vec{x}_+, \vec{w} \rangle - \langle \vec{x}_-, \vec{w} \rangle - b + b}{\lVert w \rVert} = \frac{(+1)\left(\langle \vec{x}_+, \vec{w} \rangle - b\right) \, + \, (-1)\left(\langle \vec{x}_-, \vec{w} \rangle - b\right)}{\lVert w \rVert} = \\ = \frac{M_+(\vec{w}, b) \, + \, M_-(\vec{w}, b)}{\lVert w \rVert} = \frac{2}{\lVert w \rVert} \to \max \; \Rightarrow \; \lVert w \rVert \to \min$&lt;br /&gt;
&lt;br /&gt;
Это приводит нас к постановке задачи оптимизации в терминах квадратичного программирования:&lt;br /&gt;
&lt;br /&gt;
$\begin{cases}&lt;br /&gt;
\lVert \vec{w} \rVert^2 \to \min\limits_{w,b} \\&lt;br /&gt;
M_i(\vec{w}, b) \geq 1, \quad i = 1, \ldots, \ell&lt;br /&gt;
\end{cases}$&lt;br /&gt;
&lt;br /&gt;
=== Линейно неразделимая выборка ===&lt;br /&gt;
&lt;br /&gt;
На практике линейно разделимые выборки практически не встречаются: в данных возможны выбросы и нечёткие границы между классами. В таком случае поставленная выше задача не имеет решений, и необходимо ослабить ограничения, позволив некоторым объектам попадать на &amp;quot;территорию&amp;quot; другого класса. Для каждого объекта отнимем от отступа некоторую положительную величину $\xi_i$, но потребуем чтобы эти введённые поправки были минимальны. Это приведёт к следующей постановке задачи:&lt;br /&gt;
&lt;br /&gt;
$\begin{cases}&lt;br /&gt;
\frac{1}{2} \lVert \vec{w} \rVert^2 \color{red}{+ C \sum\limits_{i=1}^\ell \xi_i} \to \min\limits_{w, b, \color{red}{\xi}} \\&lt;br /&gt;
M_i(\vec{w}, b) \geq 1 \color{red}{- \xi_i}, \quad i = 1, \ldots, \ell \\&lt;br /&gt;
\color{red}{\xi_i \geq 0, \quad i = 1, \ldots, \ell} \\&lt;br /&gt;
\end{cases}$&lt;br /&gt;
&lt;br /&gt;
Мы не знаем, какой из функционалов $\frac{1}{2} \lVert \vec{w} \rVert^2$ и $\sum\limits_{i=1}^\ell \xi_i$ важнее, поэтому вводим коэффициент $C$, который будем оптимизировать с помощью кросс-валидации. В итоге мы получили задачу, у которой всегда есть единственное решение.&lt;br /&gt;
&lt;br /&gt;
Заметим, что мы можем упростить постановку задачи:&lt;br /&gt;
&lt;br /&gt;
$\begin{cases}&lt;br /&gt;
\xi_i \geq 0 \\&lt;br /&gt;
\xi_i \geq 1 - M_i(\vec{w}, b) \\&lt;br /&gt;
\sum\limits_{i=1}^\ell \xi_i \to \min&lt;br /&gt;
\end{cases} &lt;br /&gt;
\,\Rightarrow\,&lt;br /&gt;
\begin{cases} &lt;br /&gt;
\xi_i \geq \max(0, 1 - M_i(\vec{w}, b)) \\&lt;br /&gt;
\sum\limits_{i=1}^\ell \xi_i \to \min&lt;br /&gt;
\end{cases}&lt;br /&gt;
\,\Rightarrow\,&lt;br /&gt;
\xi_i = (1- M_i(\vec{w}, b))_+$&lt;br /&gt;
&lt;br /&gt;
Получим эквивалентную задачу безусловной минимизации:&lt;br /&gt;
&lt;br /&gt;
$\frac{1}{2} \lVert \vec{w} \rVert^2 + C \sum\limits_{i=1}^\ell \left(1 - M_i(\vec{w}, b)\right)_+ \to \min\limits_{w, b}$&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|id=kkt&lt;br /&gt;
|author=Условия Каруша—Куна—Таккера&lt;br /&gt;
|statement=&lt;br /&gt;
Пусть поставлена задача нелинейного программирования с ограничениями:&lt;br /&gt;
$$&lt;br /&gt;
\begin{cases}&lt;br /&gt;
f(x) \to \min\limits_{x \in X} \\&lt;br /&gt;
g_i(x) \leq 0,\;i=1\ldots m \\&lt;br /&gt;
h_j(x) = 0,\;j=1\ldots k&lt;br /&gt;
\end{cases}&lt;br /&gt;
$$&lt;br /&gt;
&lt;br /&gt;
Если $x$ — точка локального минимума при наложенных ограничениях, то существуют такие множители $\mu_i, i = 1\ldots m$, $\;\lambda_j, j = 1\ldots k$, что для функции Лагранжа $L(x; \mu, \lambda)$ выполняются условия:&lt;br /&gt;
&lt;br /&gt;
$$\begin{cases}\frac{\partial L}{\partial x} = 0, \quad L(x; \mu, \lambda) = f(x) + \sum\limits_{i=1}^m \mu_i g_i(x) + \sum\limits_{j=1}^k \lambda_j h_j(x) \\ g_i(x) \leq 0,\;h_j(x) = 0 \quad \text{(исходные ограничения)} \\ \mu_i \geq 0 \quad \text{(двойственные ограничения)} \\ \mu_i g_i(x) = 0 \quad \text{(условие дополняющей нежёсткости)} \end{cases}$$&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
По теореме Каруша—Куна—Таккера, поставленная нами задача минимизации эквивалентна двойственной задаче для функции Лагранжа:&lt;br /&gt;
&lt;br /&gt;
$\mathscr{L}(\vec{w},b,\xi; \lambda, \eta) = \frac{1}{2} \lVert w \rVert^2 - \sum\limits_{i=1}^\ell \lambda_i \left(M_i(\vec{w}, b) - 1\right) - \sum\limits_{i=1}^\ell \xi_i \left(\lambda_i + \eta_i - C\right)$&lt;br /&gt;
&lt;br /&gt;
$\lambda_i$ — переменные, двойственные к ограничениям $M_i \geq 1 - \xi_i$&lt;br /&gt;
&lt;br /&gt;
$\eta_i$ — переменные, двойственные к ограничениям $\xi_i \geq 0$&lt;br /&gt;
&lt;br /&gt;
$\begin{cases}&lt;br /&gt;
\frac{\partial \mathscr{L}}{\partial w} = 0, \quad \frac{\partial \mathscr{L}}{\partial b} = 0, \quad \frac{\partial \mathscr{L}}{\partial \xi} = 0 \\&lt;br /&gt;
\xi_i \geq 0, \quad \lambda_i \geq 0, \quad \eta_i \geq 0, &amp;amp;&amp;amp; i = 1, \ldots, \ell \\&lt;br /&gt;
\lambda_i = 0 \;\text{либо}\; M_i(\vec{w},b) = 1 - \xi_i, &amp;amp;&amp;amp; i = 1, \ldots, \ell \\&lt;br /&gt;
\eta_i = 0 \;\text{либо}\; \xi_i = 0, &amp;amp;&amp;amp; i = 1, \ldots, \ell&lt;br /&gt;
\end{cases}$&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Необходимые условия седловой точки функции Лагранжа:&lt;br /&gt;
&lt;br /&gt;
$\begin{array}{lcl}&lt;br /&gt;
\frac{\partial \mathscr{L}}{\partial w} = \vec{w} - \sum\limits_{i=1}^\ell \lambda_i y_i \vec{x}_i = 0 &amp;amp; \Rightarrow &amp;amp; \vec{w} = \sum\limits_{i=1}^\ell \lambda_i y_i \vec{x}_i \\&lt;br /&gt;
\frac{\partial \mathscr{L}}{\partial b} = -\sum\limits_{i=1}^\ell \lambda_i y_i = 0 &amp;amp; \Rightarrow &amp;amp; \sum\limits_{i=1}^\ell \lambda_i y_i = 0 \\&lt;br /&gt;
\frac{\partial \mathscr{L}}{\partial \xi_i} = -\lambda_i - \eta_i + C = 0 &amp;amp; \Rightarrow &amp;amp; \eta_i + \lambda_i = C, \quad i = 1, \ldots, \ell&lt;br /&gt;
\end{array}$&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Типизация объектов:&lt;br /&gt;
&lt;br /&gt;
# $\lambda_i = 0; \eta_i = C; \xi_i = 0; M_i \geq 1$ — периферийные (неинформативные) объекты&lt;br /&gt;
# $0 &amp;lt; \lambda_i &amp;lt; C; 0 &amp;lt; \eta_i &amp;lt; C; \xi_i = 0; M_i = 1$ — опорные граничные объекты&lt;br /&gt;
# $\lambda_i = С; \eta_i = 0; \xi_i &amp;gt; 0; M_i &amp;lt; 1$ — опорные объекты-нарушители&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
'''Опорный объект''' (опорный вектор, англ. ''support vector'') — объект $\vec{x}_i$, соответствующий которому множитель Лагранжа отличен от нуля: $\lambda_i \neq 0$.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Двойственная задача:&lt;br /&gt;
&lt;br /&gt;
$\begin{cases}&lt;br /&gt;
-\mathscr{L}(\lambda) = -\sum\limits_{i=1}^\ell \lambda_i + \frac{1}{2} \sum\limits_{i=1}^\ell \sum\limits_{j=1}^\ell \lambda_i \lambda_j y_i y_j \langle \vec{x}_i, \vec{x}_j \rangle \to \min\limits_\lambda \\&lt;br /&gt;
0 \leq \lambda_i \leq C, \quad i = 1, \ldots, \ell \\&lt;br /&gt;
\sum\limits_{i=1}^\ell \lambda_i y_i = 0&lt;br /&gt;
\end{cases}$&lt;br /&gt;
&lt;br /&gt;
Решение прямой задачи выражается через решение двойственной:&lt;br /&gt;
&lt;br /&gt;
$\begin{cases}&lt;br /&gt;
\vec{w} = \sum\limits_{i=1}^\ell \lambda_i y_i \vec{x}_i \\&lt;br /&gt;
b = \langle \vec{w}, \vec{x}_i \rangle - y_i, \quad \text{для любого}\; i: \lambda_i &amp;gt; 0, M_i = 1&lt;br /&gt;
\end{cases}$&lt;br /&gt;
&lt;br /&gt;
Линейный классификатор:&lt;br /&gt;
&lt;br /&gt;
$a(x) = sign \left(\sum\limits_{i=1}^\ell \lambda_i y_i \langle \vec{x}_i, \vec{x} \rangle - b\right)$&lt;br /&gt;
&lt;br /&gt;
=== Нелинейное обобщение, kernel trick ===&lt;br /&gt;
&lt;br /&gt;
Переход к спрямляющему пространству более высокой размерности: $\psi : X \to H$.&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
'''Ядро''' (англ. ''kernel'') — функция $K: X \times X \to \mathbb{R}$, которая является скалярным произведением в некотором гильбертовом пространстве: $K(\vec{x}_1, \vec{x}_2) = \langle \psi(\vec{x}_1), \psi(\vec{x}_2) \rangle$ при некотором $\psi : X \to H$, где $H$ — гильбертово пространство.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|id=kernel&lt;br /&gt;
|author=&lt;br /&gt;
|statement=&lt;br /&gt;
Функция $K(\vec{x}_1, \vec{x}_2)$ является ядром тогда и только тогда, когда выполнены условия: &amp;lt;br&amp;gt;&lt;br /&gt;
$\begin{cases}K(\vec{x}_1, \vec{x}_2) = K(\vec{x}_2, \vec{x}_1) &amp;amp; \text{(симметричность)} \\[1ex] \forall g: X \to \mathbb{R} \quad \int\limits_X \int\limits_X K(\vec{x}_1, \vec{x}_2) g(\vec{x}_1) g(\vec{x}_2) d \vec{x}_1 d \vec{x}_2 \geq 0 &amp;amp; \text{(неотрицательная определенность)}\end{cases}$&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Конструктивные методы синтеза ядер:&lt;br /&gt;
&lt;br /&gt;
# $K(\vec{x}_1, \vec{x}_2) = \langle \vec{x}_1, \vec{x}_2 \rangle \quad$ (скалярное произведение)&lt;br /&gt;
# $K(\vec{x}_1, \vec{x}_2) = \alpha \quad$ (константа $\alpha \in \mathbb{R}, \alpha &amp;gt; 0$)&lt;br /&gt;
# $K(\vec{x}_1, \vec{x}_2) = K_1(\vec{x}_1, \vec{x}_2) + K_2(\vec{x}_1, \vec{x}_2) \quad$ (сумма ядер)&lt;br /&gt;
# $K(\vec{x}_1, \vec{x}_2) = K_1(\vec{x}_1, \vec{x}_2) * K_2(\vec{x}_1, \vec{x}_2) \quad$ (произведение ядер)&lt;br /&gt;
# $K(\vec{x}_1, \vec{x}_2) = \psi(\vec{x}_1) * \psi(\vec{x}_2) \quad$ (произведение функций $\psi : X \to \mathbb{R}$)&lt;br /&gt;
# $K(\vec{x}_1, \vec{x}_2) = K_1(\phi(\vec{x}_1), \phi(\vec{x}_2)) \quad$ (ядро от функций $\phi : X \to X$)&lt;br /&gt;
# $K(\vec{x}_1, \vec{x}_2) = \int\limits_X s(\vec{x}_1, \vec{z}) s(\vec{x}_2, \vec{z}) d \vec{z} \quad$ ($s : X \times X \to \mathbb{R}$ — симметричная интегрируемая функция)&lt;br /&gt;
# $K(\vec{x}_1, \vec{x}_2) = f(K_1(\vec{x}_1, \vec{x}_2)) \quad$ ($f: \mathbb{R} \to \mathbb{R}$ представима в виде сходящегося степенного ряда с неотрицательными коэффициентами)&lt;br /&gt;
&lt;br /&gt;
Примеры ядер:&lt;br /&gt;
&lt;br /&gt;
* $K(\vec{x}_1, \vec{x}_2) = (\langle \vec{x}_1, \vec{x}_2 \rangle + c)^d, \quad c, d \in \marhbb{R}$ — полиномиальное ядро&lt;br /&gt;
* $K(\vec{x}_1, \vec{x}_2) = \sigma(\langle \vec{x}_1, \vec{x}_2 \rangle)$ — нейросеть с заданной функцией активации $\sigma(z)$ (не при всех $\sigma$ является ядром)&lt;br /&gt;
* $K(\vec{x}_1, \vec{x}_2) = \exp(-\beta \lVert \vec{x}_1 - \vec{x}_2 \rVert^2)$ — сеть радиальных базисных функций (англ. ''RBF'')&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Метод опорных векторов в задаче регрессии ==&lt;br /&gt;
// TODO&lt;br /&gt;
&lt;br /&gt;
== Преимущества и недостатки SVM ==&lt;br /&gt;
&lt;br /&gt;
Преимущества SVM перед методом стохастического градиента и нейронными сетями:&lt;br /&gt;
&lt;br /&gt;
* Задача выпуклого квадратичного программирования имеет единственное решение&lt;br /&gt;
* Метод опорных векторов эквивалентен двухслойной нейронной сети, где число нейронов на скрытом слое определяется автоматически как число опорных векторов&lt;br /&gt;
&lt;br /&gt;
Недостатки классического SVM:&lt;br /&gt;
&lt;br /&gt;
* Неустойчивость к шуму&lt;br /&gt;
* Нет общих подходов к оптимизации ядра под задачу&lt;br /&gt;
* Нет отбора признаков&lt;br /&gt;
* Необходимо подбирать константу $C$&lt;br /&gt;
&lt;br /&gt;
== Модификации ==&lt;br /&gt;
&lt;br /&gt;
Существуют различные дополнения и модификации метода опорных векторов, направленные на устранение описанных недостатков:&lt;br /&gt;
&lt;br /&gt;
* [[Метод релевантных векторов (Relevance Vector Machine, RVM)]]&lt;br /&gt;
* [[1-norm SVM (LASSO SVM)]]&lt;br /&gt;
* [[Doubly Regularized SVM (ElasticNet SVM)]]&lt;br /&gt;
* [[Support Features Machine (SFM)]]&lt;br /&gt;
* [[Relevance Features Machine (RFM)]]&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
* [[Обзор библиотек для машинного обучения на Python]]&lt;br /&gt;
* [[Общие понятия]]&lt;br /&gt;
&lt;br /&gt;
== Примечания ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
* [http://www.machinelearning.ru/wiki/index.php?title=%D0%9C%D0%B0%D1%88%D0%B8%D0%BD%D0%B0_%D0%BE%D0%BF%D0%BE%D1%80%D0%BD%D1%8B%D1%85_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2 machinelearning.ru {{---}} Машина опорных векторов]&lt;br /&gt;
* [https://www.youtube.com/watch?v=Adi67_94_gc&amp;amp;list=PLJOzdkh8T5kp99tGTEFjH_b9zqEQiiBtC&amp;amp;index=5 Лекция &amp;quot;Линейные методы классификации: метод опорных векторов&amp;quot;]  {{---}} К.В. Воронцов, курс &amp;quot;Машинное обучение&amp;quot; 2014&lt;br /&gt;
* [https://ru.wikipedia.org/wiki/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%BE%D0%BF%D0%BE%D1%80%D0%BD%D1%8B%D1%85_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2 Wikipedia {{---}} Метод опорных векторов]&lt;br /&gt;
* Alexey Nefedov {{---}} [https://svmtutorial.online/ Support Vector Machines: A Simple Tutorial]&lt;br /&gt;
* John Platt {{---}} [https://www.microsoft.com/en-us/research/publication/sequential-minimal-optimization-a-fast-algorithm-for-training-support-vector-machines/ Sequential Minimal Optimization: A Fast Algorithm for Training Support Vector Machines]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Машинное обучение]]&lt;br /&gt;
[[Категория: Классификация]]&lt;br /&gt;
[[Категория: Регрессия]]&lt;/div&gt;</summary>
		<author><name>Egormkn</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%BE%D0%BF%D0%BE%D1%80%D0%BD%D1%8B%D1%85_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2_(SVM)&amp;diff=70668</id>
		<title>Метод опорных векторов (SVM)</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%BE%D0%BF%D0%BE%D1%80%D0%BD%D1%8B%D1%85_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2_(SVM)&amp;diff=70668"/>
				<updated>2019-04-01T13:08:37Z</updated>
		
		<summary type="html">&lt;p&gt;Egormkn: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{в разработке}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Метод опорных векторов''' (англ. ''support vector machine'', ''SVM'') — один из наиболее популярных методов обучения, который применяется для решения задач классификации и регрессии. Основная идея метода заключается в построении гиперплоскости, разделяющей объекты выборки наиболее оптимальным способом. Алгоритм работает в предположении, что чем больше расстояние (зазор) между разделяющей гиперплоскостью и объектами разделяемых классов, тем меньше будет средняя ошибка классификатора.&lt;br /&gt;
&lt;br /&gt;
== Метод опорных векторов в задаче классификации ==&lt;br /&gt;
&lt;br /&gt;
Рассмотрим задачу бинарной классификации, в которой объектам из $X=\mathbb{R}^n$ соответствует один из двух классов $Y = \{-1, +1\}$.&lt;br /&gt;
&lt;br /&gt;
Пусть задана обучающая выборка пар &amp;quot;объект-ответ&amp;quot;: $T^\ell = (\vec{x}_i, y_i)_{i=1}^\ell$. Необходимо построить алгоритм классификации $a(\vec{x}) : X \to Y$.&lt;br /&gt;
&lt;br /&gt;
=== Разделяющая гиперплоскость ===&lt;br /&gt;
&lt;br /&gt;
[[Файл:svm_hyperplane.png|300px|thumb|right|Примеры разделяющих гиперплоскостей в $\mathbb{R}^2$]]&lt;br /&gt;
&lt;br /&gt;
В пространстве $\mathbb{R}^n$ уравнение $\langle \vec{w}, \vec{x} \rangle - b = 0$ при заданных $\vec{w}$ и $b$ определяет гиперплоскость — множество векторов $\vec{x} = (x_1, \ldots, x_n)$, принадлежащих пространству меньшей размерности $\mathbb{R}^{n-1}$. Например, для $\mathbb{R}^1$ гиперплоскостью является точка, для $\mathbb{R}^2$ — прямая, для $\mathbb{R}^3$ — плоскость и т.д. Параметр $\vec{w}$ определяет вектор нормали к гиперплоскости, а через $\frac{b}{\lVert \vec{w} \rVert}$ выражается расстояние от гиперплоскости до начала координат.&lt;br /&gt;
&lt;br /&gt;
Гиперплоскость делит $\mathbb{R}^n$ на два полупространства: $\langle \vec{w}, \vec{x} \rangle - b &amp;gt; 0$ и $\langle \vec{w}, \vec{x} \rangle - b &amp;lt; 0$. &lt;br /&gt;
&lt;br /&gt;
Говорят, что гиперплоскость разделяет два класса $C_1$ и $C_2$, если объекты этих классов лежат по разные стороны от гиперплоскости, то есть выполнено либо&lt;br /&gt;
&lt;br /&gt;
$\begin{cases}\langle \vec{w}, \vec{x} \rangle - b &amp;gt; 0, &amp;amp;&amp;amp; \forall x \in C_1 \\ \langle \vec{w}, \vec{x} \rangle - b &amp;lt; 0, &amp;amp;&amp;amp; \forall x \in C_2\end{cases}$&lt;br /&gt;
&lt;br /&gt;
либо&lt;br /&gt;
&lt;br /&gt;
$\begin{cases}\langle \vec{w}, \vec{x} \rangle - b &amp;lt; 0, &amp;amp;&amp;amp; \forall x \in C_1 \\ \langle \vec{w}, \vec{x} \rangle - b &amp;gt; 0, &amp;amp;&amp;amp; \forall x \in C_2\end{cases}$&lt;br /&gt;
&lt;br /&gt;
=== Линейно разделимая выборка ===&lt;br /&gt;
&lt;br /&gt;
Пусть выборка линейно разделима, то есть существует некоторая гиперплоскость, разделяющая классы $-1$ и $+1$. Тогда в качестве алгоритма классификации можно использовать линейный пороговый классификатор:&lt;br /&gt;
&lt;br /&gt;
$a(\vec{x}) = sign(\langle \vec{w}, \vec{x} \rangle - b) = sign\left(\sum\limits_{i=1}^\ell w_i x_i - b\right)$&lt;br /&gt;
&lt;br /&gt;
где $\vec{x} = (x_1, \ldots, x_n)$ — вектор значений признаков объекта, а $\vec{w} = (w_1, \ldots, w_n) \in \mathbb{R}^n$ и $b \in \mathbb{R}$ — параметры гиперплоскости.&lt;br /&gt;
&lt;br /&gt;
Но для двух линейно разделимых классов возможны различные варианты построения разделяющих гиперплоскостей. Метод опорных векторов выбирает ту гиперплоскость, которая максимизирует отступ между классами:&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
'''Отступ''' (англ. ''margin'') — характеристика, оценивающая, насколько объект &amp;quot;погружён&amp;quot; в свой класс, насколько типичным представителем класса он является. Чем меньше значение отступа $M_i$, тем ближе объект $\vec{x}_i$ подходит к границе классов и тем выше становится вероятность ошибки. Отступ $M_i$ отрицателен тогда и только тогда, когда алгоритм $a(x)$ допускает ошибку на объекте $\vec{x}_i$. &amp;lt;br&amp;gt;&amp;lt;br&amp;gt; Для линейного классификатора отступ определяется уравнением: $M_i(\vec{w}, b) = y_i(\langle \vec{w}, \vec{x}_i \rangle - b)$&lt;br /&gt;
}}&lt;br /&gt;
Если выборка линейно разделима, то существует такая гиперплоскость, отступ от которой до каждого объекта положителен:&lt;br /&gt;
&lt;br /&gt;
$\exists \vec{w}, b : \; M_i(\vec{w}, b) = y_i(\langle \vec{w}, \vec{x}_i \rangle - b) &amp;gt; 0, \; i = 1\ldots\ell$&lt;br /&gt;
&lt;br /&gt;
Мы хотим построить такую разделяющую гиперплоскость, чтобы объекты обучающей выборки находились на наибольшем расстоянии от неё.&lt;br /&gt;
&lt;br /&gt;
[[Файл:SVM_margin.png|300px|thumb|right|Оптимальная разделяющая гиперплоскость в $\mathbb{R}^2$]]&lt;br /&gt;
Заметим, что при умножении $\vec{w}$ и $b$ на константу $c \neq 0$ уравнение $\langle c\vec{w}, \vec{x} \rangle - cb = 0$ определяет ту же самую гиперплоскость, что и $\langle \vec{w}, \vec{x} \rangle - b = 0$. Для удобства проведём нормировку: выберем константу $c$ таким образом, чтобы $\min M_i(\vec{w}, b) = 1$. При этом в каждом из двух классов найдётся хотя бы один &amp;quot;граничный&amp;quot; объект обучающей выборки, отступ которого равен этому минимуму: иначе можно было бы сместить гиперплоскость в сторону класса с большим отступом, тем самым увеличив минимальное расстояние от гиперплоскости до объектов обучающей выборки. &lt;br /&gt;
&lt;br /&gt;
Обозначим любой &amp;quot;граничный&amp;quot; объект из класса $+1$ как $\vec{x}_+$, из класса $-1$ как $\vec{x}_-$. Их отступ равен единице, то есть&lt;br /&gt;
&lt;br /&gt;
$\begin{cases}&lt;br /&gt;
M_+(\vec{w}, b) = (+1)(\langle \vec{w}, \vec{x}_+ \rangle - b) = 1 \\&lt;br /&gt;
M_-(\vec{w}, b) = (-1)(\langle \vec{w}, \vec{x}_- \rangle - b) = 1&lt;br /&gt;
\end{cases}$&lt;br /&gt;
&lt;br /&gt;
Нормировка позволяет ограничить разделяющую полосу между классами: $\{x: -1 &amp;lt; \langle \vec{w}, \vec{x}_i \rangle - b &amp;lt; 1\}$. Внутри неё не может лежать ни один объект обучающей выборки. Ширину разделяющей полосы можно выразить как проекцию вектора $\vec{x}_+ - \vec{x}_-$ на нормаль к гиперплоскости $\vec{w}$. Чтобы разделяющая гиперплоскость находилась на наибольшем расстоянии от точек выборки, ширина полосы должна быть максимальной: &lt;br /&gt;
&lt;br /&gt;
$\frac{\langle \vec{x}_+ - \vec{x}_-, \vec{w} \rangle}{\lVert w \rVert} = \frac{\langle \vec{x}_+, \vec{w} \rangle - \langle \vec{x}_-, \vec{w} \rangle - b + b}{\lVert w \rVert} = \frac{(+1)\left(\langle \vec{x}_+, \vec{w} \rangle - b\right) \, + \, (-1)\left(\langle \vec{x}_-, \vec{w} \rangle - b\right)}{\lVert w \rVert} = \\ = \frac{M_+(\vec{w}, b) \, + \, M_-(\vec{w}, b)}{\lVert w \rVert} = \frac{2}{\lVert w \rVert} \to \max \; \Rightarrow \; \lVert w \rVert \to \min$&lt;br /&gt;
&lt;br /&gt;
Это приводит нас к постановке задачи оптимизации в терминах квадратичного программирования:&lt;br /&gt;
&lt;br /&gt;
$\begin{cases}&lt;br /&gt;
\lVert \vec{w} \rVert^2 \to \min\limits_{w,b} \\&lt;br /&gt;
M_i(\vec{w}, b) \geq 1, \quad i = 1, \ldots, \ell&lt;br /&gt;
\end{cases}$&lt;br /&gt;
&lt;br /&gt;
=== Линейно неразделимая выборка ===&lt;br /&gt;
&lt;br /&gt;
На практике линейно разделимые выборки практически не встречаются: в данных возможны выбросы и нечёткие границы между классами. В таком случае поставленная выше задача не имеет решений, и необходимо ослабить ограничения, позволив некоторым объектам попадать на &amp;quot;территорию&amp;quot; другого класса. Для каждого объекта отнимем от отступа некоторую положительную величину $\xi_i$, но потребуем чтобы эти введённые поправки были минимальны. Это приведёт к следующей постановке задачи:&lt;br /&gt;
&lt;br /&gt;
$\begin{cases}&lt;br /&gt;
\frac{1}{2} \lVert \vec{w} \rVert^2 \color{red}{+ C \sum\limits_{i=1}^\ell \xi_i} \to \min\limits_{w, b, \color{red}{\xi}} \\&lt;br /&gt;
M_i(\vec{w}, b) \geq 1 \color{red}{- \xi_i}, \quad i = 1, \ldots, \ell \\&lt;br /&gt;
\color{red}{\xi_i \geq 0, \quad i = 1, \ldots, \ell} \\&lt;br /&gt;
\end{cases}$&lt;br /&gt;
&lt;br /&gt;
Мы не знаем, какой из функционалов $\frac{1}{2} \lVert \vec{w} \rVert^2$ и $\sum\limits_{i=1}^\ell \xi_i$ важнее, поэтому вводим коэффициент $C$, который будем оптимизировать с помощью кросс-валидации. В итоге мы получили задачу, у которой всегда есть единственное решение.&lt;br /&gt;
&lt;br /&gt;
Заметим, что мы можем упростить постановку задачи:&lt;br /&gt;
&lt;br /&gt;
$\begin{cases}&lt;br /&gt;
\xi_i \geq 0 \\&lt;br /&gt;
\xi_i \geq 1 - M_i(\vec{w}, b) \\&lt;br /&gt;
\sum\limits_{i=1}^\ell \xi_i \to \min&lt;br /&gt;
\end{cases} &lt;br /&gt;
\,\Rightarrow\,&lt;br /&gt;
\begin{cases} &lt;br /&gt;
\xi_i \geq \max(0, 1 - M_i(\vec{w}, b)) \\&lt;br /&gt;
\sum\limits_{i=1}^\ell \xi_i \to \min&lt;br /&gt;
\end{cases}&lt;br /&gt;
\,\Rightarrow\,&lt;br /&gt;
\xi_i = (1- M_i(\vec{w}, b))_+$&lt;br /&gt;
&lt;br /&gt;
Получим эквивалентную задачу безусловной минимизации:&lt;br /&gt;
&lt;br /&gt;
$\frac{1}{2} \lVert \vec{w} \rVert^2 + C \sum\limits_{i=1}^\ell \left(1 - M_i(\vec{w}, b)\right)_+ \to \min\limits_{w, b}$&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|id=kkt&lt;br /&gt;
|author=Условия Каруша—Куна—Таккера&lt;br /&gt;
|statement=&lt;br /&gt;
Пусть поставлена задача нелинейного программирования с ограничениями:&lt;br /&gt;
$$&lt;br /&gt;
\begin{cases}&lt;br /&gt;
f(x) \to \min\limits_{x \in X} \\&lt;br /&gt;
g_i(x) \leq 0,\;i=1\ldots m \\&lt;br /&gt;
h_j(x) = 0,\;j=1\ldots k&lt;br /&gt;
\end{cases}&lt;br /&gt;
$$&lt;br /&gt;
&lt;br /&gt;
Если $x$ — точка локального минимума при наложенных ограничениях, то существуют такие множители $\mu_i, i = 1\ldots m$, $\;\lambda_j, j = 1\ldots k$, что для функции Лагранжа $L(x; \mu, \lambda)$ выполняются условия:&lt;br /&gt;
&lt;br /&gt;
$$\begin{cases}\frac{\partial L}{\partial x} = 0, \quad L(x; \mu, \lambda) = f(x) + \sum\limits_{i=1}^m \mu_i g_i(x) + \sum\limits_{j=1}^k \lambda_j h_j(x) \\ g_i(x) \leq 0,\;h_j(x) = 0 \quad \text{(исходные ограничения)} \\ \mu_i \geq 0 \quad \text{(двойственные ограничения)} \\ \mu_i g_i(x) = 0 \quad \text{(условие дополняющей нежёсткости)} \end{cases}$$&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
По теореме Каруша—Куна—Таккера, поставленная нами задача минимизации эквивалентна двойственной задаче для функции Лагранжа:&lt;br /&gt;
&lt;br /&gt;
$\mathscr{L}(\vec{w},b,\xi; \lambda, \eta) = \frac{1}{2} \lVert w \rVert^2 - \sum\limits_{i=1}^\ell \lambda_i \left(M_i(\vec{w}, b) - 1\right) - \sum\limits_{i=1}^\ell \xi_i \left(\lambda_i + \eta_i - C\right)$&lt;br /&gt;
&lt;br /&gt;
$\lambda_i$ — переменные, двойственные к ограничениям $M_i \geq 1 - \xi_i$&lt;br /&gt;
&lt;br /&gt;
$\eta_i$ — переменные, двойственные к ограничениям $\xi_i \geq 0$&lt;br /&gt;
&lt;br /&gt;
$\begin{cases}&lt;br /&gt;
\frac{\partial \mathscr{L}}{\partial w} = 0, \quad \frac{\partial \mathscr{L}}{\partial b} = 0, \quad \frac{\partial \mathscr{L}}{\partial \xi} = 0 \\&lt;br /&gt;
\xi_i \geq 0, \quad \lambda_i \geq 0, \quad \eta_i \geq 0, &amp;amp;&amp;amp; i = 1, \ldots, \ell \\&lt;br /&gt;
\lambda_i = 0 \;\text{либо}\; M_i(\vec{w},b) = 1 - \xi_i, &amp;amp;&amp;amp; i = 1, \ldots, \ell \\&lt;br /&gt;
\eta_i = 0 \;\text{либо}\; \xi_i = 0, &amp;amp;&amp;amp; i = 1, \ldots, \ell&lt;br /&gt;
\end{cases}$&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Необходимые условия седловой точки функции Лагранжа:&lt;br /&gt;
&lt;br /&gt;
$\begin{array}{lcl}&lt;br /&gt;
\frac{\partial \mathscr{L}}{\partial w} = \vec{w} - \sum\limits_{i=1}^\ell \lambda_i y_i \vec{x}_i = 0 &amp;amp; \Rightarrow &amp;amp; \vec{w} = \sum\limits_{i=1}^\ell \lambda_i y_i \vec{x}_i \\&lt;br /&gt;
\frac{\partial \mathscr{L}}{\partial b} = -\sum\limits_{i=1}^\ell \lambda_i y_i = 0 &amp;amp; \Rightarrow &amp;amp; \sum\limits_{i=1}^\ell \lambda_i y_i = 0 \\&lt;br /&gt;
\frac{\partial \mathscr{L}}{\partial \xi_i} = -\lambda_i - \eta_i + C = 0 &amp;amp; \Rightarrow &amp;amp; \eta_i + \lambda_i = C, \quad i = 1, \ldots, \ell&lt;br /&gt;
\end{array}$&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Типизация объектов:&lt;br /&gt;
&lt;br /&gt;
1. $\lambda_i = 0; \eta_i = C; \xi_i = 0; M_i \geq 1$ — периферийные (неинформативные) объекты&lt;br /&gt;
2. $0 &amp;lt; \lambda_i &amp;lt; C; 0 &amp;lt; \eta_i &amp;lt; C; \xi_i = 0; M_i = 1$ — опорные граничные объекты&lt;br /&gt;
3. $\lambda_i = С; \eta_i = 0; \xi_i &amp;gt; 0; M_i &amp;lt; 1$ — опорные объекты-нарушители&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
'''Опорный объект''' (опорный вектор, англ. ''support vector'') — объект $\vec{x}_i$, соответствующий которому множитель Лагранжа отличен от нуля: $\lambda_i \neq 0$.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Двойственная задача:&lt;br /&gt;
&lt;br /&gt;
$\begin{cases}&lt;br /&gt;
-\mathscr{L}(\lambda) = -\sum\limits_{i=1}^\ell \lambda_i + \frac{1}{2} \sum\limits_{i=1}^\ell \sum\limits_{j=1}^\ell \lambda_i \lambda_j y_i y_j \langle \vec{x}_i, \vec{x}_j \rangle \to \min\limits_\lambda \\&lt;br /&gt;
0 \leq \lambda_i \leq C, \quad i = 1, \ldots, \ell \\&lt;br /&gt;
\sum\limits_{i=1}^\ell \lambda_i y_i = 0&lt;br /&gt;
\end{cases}$&lt;br /&gt;
&lt;br /&gt;
Решение прямой задачи выражается через решение двойственной:&lt;br /&gt;
&lt;br /&gt;
$\begin{cases}&lt;br /&gt;
\vec{w} = \sum\limits_{i=1}^\ell \lambda_i y_i \vec{x}_i \\&lt;br /&gt;
b = \langle \vec{w}, \vec{x}_i \rangle - y_i, \quad \text{для любого}\; i: \lambda_i &amp;gt; 0, M_i = 1&lt;br /&gt;
\end{cases}$&lt;br /&gt;
&lt;br /&gt;
Линейный классификатор:&lt;br /&gt;
&lt;br /&gt;
$a(x) = sign \left(\sum\limits_{i=1}^\ell \lambda_i y_i \langle \vec{x}_i, \vec{x} \rangle - b\right)$&lt;br /&gt;
&lt;br /&gt;
=== Нелинейное обобщение, kernel trick ===&lt;br /&gt;
&lt;br /&gt;
Переход к спрямляющему пространству более высокой размерности: $\psi : X \to H$.&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
'''Ядро''' (англ. ''kernel'') — функция $K: X \times X \to \mathbb{R}$, которая является скалярным произведением в некотором гильбертовом пространстве: $K(\vec{x}_1, \vec{x}_2) = \langle \psi(\vec{x}_1), \psi(\vec{x}_2) \rangle$ при некотором $\psi : X \to H$, где $H$ — гильбертово пространство.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|id=kernel&lt;br /&gt;
|author=&lt;br /&gt;
|statement=&lt;br /&gt;
Функция $K(\vec{x}_1, \vec{x}_2)$ является ядром тогда и только тогда, когда выполнены условия: &amp;lt;br&amp;gt;&lt;br /&gt;
$\begin{cases}K(\vec{x}_1, \vec{x}_2) = K(\vec{x}_2, \vec{x}_1) &amp;amp; \text{(симметричность)} \\[1ex] \forall g: X \to \mathbb{R} \quad \int\limits_X \int\limits_X K(\vec{x}_1, \vec{x}_2) g(\vec{x}_1) g(\vec{x}_2) d \vec{x}_1 d \vec{x}_2 \geq 0 &amp;amp; \text{(неотрицательная определенность)}\end{cases}$&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Метод опорных векторов в задаче регрессии ==&lt;br /&gt;
// TODO&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
* [[Обзор библиотек для машинного обучения на Python]]&lt;br /&gt;
* [[Общие понятия]]&lt;br /&gt;
&lt;br /&gt;
== Примечания ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
* [http://www.machinelearning.ru/wiki/index.php?title=%D0%9C%D0%B0%D1%88%D0%B8%D0%BD%D0%B0_%D0%BE%D0%BF%D0%BE%D1%80%D0%BD%D1%8B%D1%85_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2 machinelearning.ru {{---}} Машина опорных векторов]&lt;br /&gt;
* [https://www.youtube.com/watch?v=Adi67_94_gc&amp;amp;list=PLJOzdkh8T5kp99tGTEFjH_b9zqEQiiBtC&amp;amp;index=5 Лекция &amp;quot;Линейные методы классификации: метод опорных векторов&amp;quot;]  {{---}} К.В. Воронцов, курс &amp;quot;Машинное обучение&amp;quot; 2014&lt;br /&gt;
* [https://ru.wikipedia.org/wiki/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%BE%D0%BF%D0%BE%D1%80%D0%BD%D1%8B%D1%85_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2 Wikipedia {{---}} Метод опорных векторов]&lt;br /&gt;
* Alexey Nefedov {{---}} [https://svmtutorial.online/ Support Vector Machines: A Simple Tutorial]&lt;br /&gt;
* John Platt {{---}} [https://www.microsoft.com/en-us/research/publication/sequential-minimal-optimization-a-fast-algorithm-for-training-support-vector-machines/ Sequential Minimal Optimization: A Fast Algorithm for Training Support Vector Machines]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Машинное обучение]]&lt;br /&gt;
[[Категория: Классификация]]&lt;br /&gt;
[[Категория: Регрессия]]&lt;/div&gt;</summary>
		<author><name>Egormkn</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%BE%D0%BF%D0%BE%D1%80%D0%BD%D1%8B%D1%85_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2_(SVM)&amp;diff=70667</id>
		<title>Метод опорных векторов (SVM)</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%BE%D0%BF%D0%BE%D1%80%D0%BD%D1%8B%D1%85_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2_(SVM)&amp;diff=70667"/>
				<updated>2019-04-01T12:08:07Z</updated>
		
		<summary type="html">&lt;p&gt;Egormkn: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{в разработке}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Метод опорных векторов''' (англ. ''support vector machine'', ''SVM'') — один из наиболее популярных методов обучения, который применяется для решения задач классификации и регрессии. Основная идея метода заключается в построении гиперплоскости, разделяющей объекты выборки наиболее оптимальным способом. Алгоритм работает в предположении, что чем больше расстояние (зазор) между разделяющей гиперплоскостью и объектами разделяемых классов, тем меньше будет средняя ошибка классификатора.&lt;br /&gt;
&lt;br /&gt;
== Метод опорных векторов в задаче классификации ==&lt;br /&gt;
&lt;br /&gt;
Рассмотрим задачу бинарной классификации, в которой объектам из $X=\mathbb{R}^n$ соответствует один из двух классов $Y = \{-1, +1\}$.&lt;br /&gt;
&lt;br /&gt;
Пусть задана обучающая выборка пар &amp;quot;объект-ответ&amp;quot;: $T^\ell = (\vec{x}_i, y_i)_{i=1}^\ell$. Необходимо построить алгоритм классификации $a(\vec{x}) : X \to Y$.&lt;br /&gt;
&lt;br /&gt;
=== Разделяющая гиперплоскость ===&lt;br /&gt;
&lt;br /&gt;
[[Файл:svm_hyperplane.png|300px|thumb|right|Примеры разделяющих гиперплоскостей в $\mathbb{R}^2$]]&lt;br /&gt;
&lt;br /&gt;
В пространстве $\mathbb{R}^n$ уравнение $\langle \vec{w}, \vec{x} \rangle - b = 0$ при заданных $\vec{w}$ и $b$ определяет гиперплоскость — множество векторов $\vec{x} = (x_1, \ldots, x_n)$, принадлежащих пространству меньшей размерности $\mathbb{R}^{n-1}$. Например, для $\mathbb{R}^1$ гиперплоскостью является точка, для $\mathbb{R}^2$ — прямая, для $\mathbb{R}^3$ — плоскость и т.д. Параметр $\vec{w}$ определяет вектор нормали к гиперплоскости, а через $\frac{b}{\lVert \vec{w} \rVert}$ выражается расстояние от гиперплоскости до начала координат.&lt;br /&gt;
&lt;br /&gt;
Гиперплоскость делит $\mathbb{R}^n$ на два полупространства: $\langle \vec{w}, \vec{x} \rangle - b &amp;gt; 0$ и $\langle \vec{w}, \vec{x} \rangle - b &amp;lt; 0$. &lt;br /&gt;
&lt;br /&gt;
Говорят, что гиперплоскость разделяет два класса $C_1$ и $C_2$, если объекты этих классов лежат по разные стороны от гиперплоскости, то есть выполнено либо&lt;br /&gt;
&lt;br /&gt;
$\begin{cases}\langle \vec{w}, \vec{x} \rangle - b &amp;gt; 0, &amp;amp;&amp;amp; \forall x \in C_1 \\ \langle \vec{w}, \vec{x} \rangle - b &amp;lt; 0, &amp;amp;&amp;amp; \forall x \in C_2\end{cases}$&lt;br /&gt;
&lt;br /&gt;
либо&lt;br /&gt;
&lt;br /&gt;
$\begin{cases}\langle \vec{w}, \vec{x} \rangle - b &amp;lt; 0, &amp;amp;&amp;amp; \forall x \in C_1 \\ \langle \vec{w}, \vec{x} \rangle - b &amp;gt; 0, &amp;amp;&amp;amp; \forall x \in C_2\end{cases}$&lt;br /&gt;
&lt;br /&gt;
=== Линейно разделимая выборка ===&lt;br /&gt;
&lt;br /&gt;
Пусть выборка линейно разделима, то есть существует некоторая гиперплоскость, разделяющая классы $-1$ и $+1$. Тогда в качестве алгоритма классификации можно использовать линейный пороговый классификатор:&lt;br /&gt;
&lt;br /&gt;
$a(\vec{x}) = sign(\langle \vec{w}, \vec{x} \rangle - b) = sign\left(\sum\limits_{i=1}^\ell w_i x_i - b\right)$&lt;br /&gt;
&lt;br /&gt;
где $\vec{x} = (x_1, \ldots, x_n)$ — вектор значений признаков объекта, а $\vec{w} = (w_1, \ldots, w_n) \in \mathbb{R}^n$ и $b \in \mathbb{R}$ — параметры гиперплоскости.&lt;br /&gt;
&lt;br /&gt;
Но для двух линейно разделимых классов возможны различные варианты построения разделяющих гиперплоскостей. Метод опорных векторов выбирает ту гиперплоскость, которая максимизирует отступ между классами:&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
'''Отступ''' (англ. ''margin'') — характеристика, оценивающая, насколько объект &amp;quot;погружён&amp;quot; в свой класс, насколько типичным представителем класса он является. Чем меньше значение отступа $M_i$, тем ближе объект $\vec{x}_i$ подходит к границе классов и тем выше становится вероятность ошибки. Отступ $M_i$ отрицателен тогда и только тогда, когда алгоритм $a(x)$ допускает ошибку на объекте $\vec{x}_i$. &amp;lt;br&amp;gt;&amp;lt;br&amp;gt; Для линейного классификатора отступ определяется уравнением: $M_i(\vec{w}, b) = y_i(\langle \vec{w}, \vec{x}_i \rangle - b)$&lt;br /&gt;
}}&lt;br /&gt;
Если выборка линейно разделима, то существует такая гиперплоскость, отступ от которой до каждого объекта положителен:&lt;br /&gt;
&lt;br /&gt;
$\exists \vec{w}, b : \; M_i(\vec{w}, b) = y_i(\langle \vec{w}, \vec{x}_i \rangle - b) &amp;gt; 0, \; i = 1\ldots\ell$&lt;br /&gt;
&lt;br /&gt;
Мы хотим построить такую разделяющую гиперплоскость, чтобы объекты обучающей выборки находились на наибольшем расстоянии от неё.&lt;br /&gt;
&lt;br /&gt;
[[Файл:SVM_margin.png|300px|thumb|right|Оптимальная разделяющая гиперплоскость в $\mathbb{R}^2$]]&lt;br /&gt;
Заметим, что при умножении $\vec{w}$ и $b$ на константу $c \neq 0$ уравнение $\langle c\vec{w}, \vec{x} \rangle - cb = 0$ определяет ту же самую гиперплоскость, что и $\langle \vec{w}, \vec{x} \rangle - b = 0$. Для удобства проведём нормировку: выберем константу $c$ таким образом, чтобы $\min M_i(\vec{w}, b) = 1$. При этом в каждом из двух классов найдётся хотя бы один &amp;quot;граничный&amp;quot; объект обучающей выборки, отступ которого равен этому минимуму: иначе можно было бы сместить гиперплоскость в сторону класса с большим отступом, тем самым увеличив минимальное расстояние от гиперплоскости до объектов обучающей выборки. &lt;br /&gt;
&lt;br /&gt;
Обозначим любой &amp;quot;граничный&amp;quot; объект из класса $+1$ как $\vec{x}_+$, из класса $-1$ как $\vec{x}_-$. Их отступ равен единице, то есть&lt;br /&gt;
&lt;br /&gt;
$\begin{cases}&lt;br /&gt;
M_+(\vec{w}, b) = (+1)(\langle \vec{w}, \vec{x}_+ \rangle - b) = 1 \\&lt;br /&gt;
M_-(\vec{w}, b) = (-1)(\langle \vec{w}, \vec{x}_- \rangle - b) = 1&lt;br /&gt;
\end{cases}$&lt;br /&gt;
&lt;br /&gt;
Нормировка позволяет ограничить разделяющую полосу между классами: $\{x: -1 &amp;lt; \langle \vec{w}, \vec{x}_i \rangle - b &amp;lt; 1\}$. Внутри неё не может лежать ни один объект обучающей выборки. Ширину разделяющей полосы можно выразить как проекцию вектора $\vec{x}_+ - \vec{x}_-$ на нормаль к гиперплоскости $\vec{w}$. Чтобы разделяющая гиперплоскость находилась на наибольшем расстоянии от точек выборки, ширина полосы должна быть максимальной: &lt;br /&gt;
&lt;br /&gt;
$\frac{\langle \vec{x}_+ - \vec{x}_-, \vec{w} \rangle}{\lVert w \rVert} = \frac{\langle \vec{x}_+, \vec{w} \rangle - \langle \vec{x}_-, \vec{w} \rangle - b + b}{\lVert w \rVert} = \frac{(+1)\left(\langle \vec{x}_+, \vec{w} \rangle - b\right) \, + \, (-1)\left(\langle \vec{x}_-, \vec{w} \rangle - b\right)}{\lVert w \rVert} = \\ = \frac{M_+(\vec{w}, b) \, + \, M_-(\vec{w}, b)}{\lVert w \rVert} = \frac{2}{\lVert w \rVert} \to \max \; \Rightarrow \; \lVert w \rVert \to \min$&lt;br /&gt;
&lt;br /&gt;
Это приводит нас к постановке задачи оптимизации в терминах квадратичного программирования:&lt;br /&gt;
&lt;br /&gt;
$\begin{cases}&lt;br /&gt;
\lVert \vec{w} \rVert^2 \to \min\limits_{w,b} \\&lt;br /&gt;
M_i(\vec{w}, b) \geq 1, \quad i = 1, \ldots, \ell&lt;br /&gt;
\end{cases}$&lt;br /&gt;
&lt;br /&gt;
=== Линейно неразделимая выборка ===&lt;br /&gt;
&lt;br /&gt;
На практике линейно разделимые выборки практически не встречаются: в данных возможны выбросы и нечёткие границы между классами. В таком случае поставленная выше задача не имеет решений, и необходимо ослабить ограничения, позволив некоторым объектам попадать на &amp;quot;территорию&amp;quot; другого класса. Для каждого объекта отнимем от отступа некоторую положительную величину $\xi_i$, но потребуем чтобы эти введённые поправки были минимальны. Это приведёт к следующей постановке задачи:&lt;br /&gt;
&lt;br /&gt;
$\begin{cases}&lt;br /&gt;
\frac{1}{2} \lVert \vec{w} \rVert^2 \color{red}{+ C \sum\limits_{i=1}^\ell \xi_i} \to \min\limits_{w, b, \color{red}{\xi}} \\&lt;br /&gt;
M_i(\vec{w}, b) \geq 1 \color{red}{- \xi_i}, \quad i = 1, \ldots, \ell \\&lt;br /&gt;
\color{red}{\xi_i \geq 0, \quad i = 1, \ldots, \ell} \\&lt;br /&gt;
\end{cases}$&lt;br /&gt;
&lt;br /&gt;
Мы не знаем, какой из функционалов $\frac{1}{2} \lVert \vec{w} \rVert^2$ и $\sum\limits_{i=1}^\ell \xi_i$ важнее, поэтому вводим коэффициент $C$, который будем оптимизировать с помощью кросс-валидации. В итоге мы получили задачу, у которой всегда есть единственное решение.&lt;br /&gt;
&lt;br /&gt;
Заметим, что мы можем упростить постановку задачи:&lt;br /&gt;
&lt;br /&gt;
$\begin{cases}&lt;br /&gt;
\xi_i \geq 0 \\&lt;br /&gt;
\xi_i \geq 1 - M_i(\vec{w}, b) \\&lt;br /&gt;
\sum\limits_{i=1}^\ell \xi_i \to \min&lt;br /&gt;
\end{cases} &lt;br /&gt;
\,\Rightarrow\,&lt;br /&gt;
\begin{cases} &lt;br /&gt;
\xi_i \geq \max(0, 1 - M_i(\vec{w}, b)) \\&lt;br /&gt;
\sum\limits_{i=1}^\ell \xi_i \to \min&lt;br /&gt;
\end{cases}&lt;br /&gt;
\,\Rightarrow\,&lt;br /&gt;
\xi_i = (1- M_i(\vec{w}, b))_+$&lt;br /&gt;
&lt;br /&gt;
Получим эквивалентную задачу безусловной минимизации:&lt;br /&gt;
&lt;br /&gt;
$\frac{1}{2} \lVert \vec{w} \rVert^2 + C \sum\limits_{i=1}^\ell \left(1 - M_i(\vec{w}, b)\right)_+ \to \min\limits_{w, b}$&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|id=kkt&lt;br /&gt;
|author=Условия Каруша—Куна—Таккера&lt;br /&gt;
|statement=&lt;br /&gt;
Пусть поставлена задача нелинейного программирования с ограничениями:&lt;br /&gt;
$$&lt;br /&gt;
\begin{cases}&lt;br /&gt;
f(x) \to \min\limits_{x \in X} \\&lt;br /&gt;
g_i(x) \leq 0,\;i=1\ldots m \\&lt;br /&gt;
h_j(x) = 0,\;j=1\ldots k&lt;br /&gt;
\end{cases}&lt;br /&gt;
$$&lt;br /&gt;
&lt;br /&gt;
Если $x$ — точка локального минимума при наложенных ограничениях, то существуют такие множители $\mu_i, i = 1\ldots m$, $\;\lambda_j, j = 1\ldots k$, что для функции Лагранжа $L(x; \mu, \lambda)$ выполняются условия:&lt;br /&gt;
&lt;br /&gt;
$$\begin{cases}\frac{\partial L}{\partial x} = 0, \quad L(x; \mu, \lambda) = f(x) + \sum\limits_{i=1}^m \mu_i g_i(x) + \sum\limits_{j=1}^k \lambda_j h_j(x) \\ g_i(x) \leq 0,\;h_j(x) = 0 \quad \text{(исходные ограничения)} \\ \mu_i \geq 0 \quad \text{(двойственные ограничения)} \\ \mu_i g_i(x) = 0 \quad \text{(условие дополняющей нежёсткости)} \end{cases}$$&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
По теореме Каруша—Куна—Таккера, поставленная нами задача минимизации эквивалентна двойственной задаче для функции Лагранжа:&lt;br /&gt;
&lt;br /&gt;
$\mathscr{L}(\vec{w},b,\xi; \lambda, \eta) = \frac{1}{2} \lVert w \rVert^2 - \sum\limits_{i=1}^\ell \lambda_i \left(M_i(\vec{w}, b) - 1\right) - \sum\limits_{i=1}^\ell \xi_i \left(\lambda_i + \eta_i - C\right)$&lt;br /&gt;
&lt;br /&gt;
$\lambda_i$ — переменные, двойственные к ограничениям $M_i \geq 1 - \xi_i$&lt;br /&gt;
&lt;br /&gt;
$\eta_i$ — переменные, двойственные к ограничениям $\xi_i \geq 0$&lt;br /&gt;
&lt;br /&gt;
$\begin{cases}&lt;br /&gt;
1&lt;br /&gt;
\end{cases}$&lt;br /&gt;
&lt;br /&gt;
=== Kernel trick ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Метод опорных векторов в задаче регрессии ==&lt;br /&gt;
// TODO&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
* [[Обзор библиотек для машинного обучения на Python]]&lt;br /&gt;
* [[Общие понятия]]&lt;br /&gt;
&lt;br /&gt;
== Примечания ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
* [http://www.machinelearning.ru/wiki/index.php?title=%D0%9C%D0%B0%D1%88%D0%B8%D0%BD%D0%B0_%D0%BE%D0%BF%D0%BE%D1%80%D0%BD%D1%8B%D1%85_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2 machinelearning.ru {{---}} Машина опорных векторов]&lt;br /&gt;
* [https://www.youtube.com/watch?v=Adi67_94_gc&amp;amp;list=PLJOzdkh8T5kp99tGTEFjH_b9zqEQiiBtC&amp;amp;index=5 Лекция &amp;quot;Линейные методы классификации: метод опорных векторов&amp;quot;]  {{---}} К.В. Воронцов, курс &amp;quot;Машинное обучение&amp;quot; 2014&lt;br /&gt;
* [https://ru.wikipedia.org/wiki/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%BE%D0%BF%D0%BE%D1%80%D0%BD%D1%8B%D1%85_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2 Wikipedia {{---}} Метод опорных векторов]&lt;br /&gt;
* Alexey Nefedov {{---}} [https://svmtutorial.online/ Support Vector Machines: A Simple Tutorial]&lt;br /&gt;
* John Platt {{---}} [https://www.microsoft.com/en-us/research/publication/sequential-minimal-optimization-a-fast-algorithm-for-training-support-vector-machines/ Sequential Minimal Optimization: A Fast Algorithm for Training Support Vector Machines]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Машинное обучение]]&lt;br /&gt;
[[Категория: Классификация]]&lt;br /&gt;
[[Категория: Регрессия]]&lt;/div&gt;</summary>
		<author><name>Egormkn</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%BE%D0%BF%D0%BE%D1%80%D0%BD%D1%8B%D1%85_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2_(SVM)&amp;diff=70642</id>
		<title>Метод опорных векторов (SVM)</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%BE%D0%BF%D0%BE%D1%80%D0%BD%D1%8B%D1%85_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2_(SVM)&amp;diff=70642"/>
				<updated>2019-03-31T14:59:03Z</updated>
		
		<summary type="html">&lt;p&gt;Egormkn: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{в разработке}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Метод опорных векторов''' (англ. ''support vector machine'', ''SVM'') — один из наиболее популярных методов обучения, который применяется для решения задач классификации и регрессии. Основная идея метода заключается в построении гиперплоскости, разделяющей объекты выборки наиболее оптимальным способом. Алгоритм работает в предположении, что чем больше расстояние (зазор) между разделяющей гиперплоскостью и объектами разделяемых классов, тем меньше будет средняя ошибка классификатора.&lt;br /&gt;
&lt;br /&gt;
== Метод опорных векторов в задаче классификации ==&lt;br /&gt;
&lt;br /&gt;
Рассмотрим задачу бинарной классификации, в которой объектам из $X=\mathbb{R}^n$ соответствует один из двух классов $Y = \{-1, +1\}$.&lt;br /&gt;
&lt;br /&gt;
Пусть задана обучающая выборка пар &amp;quot;объект-ответ&amp;quot;: $T^\ell = (\vec{x}_i, y_i)_{i=1}^\ell$. Необходимо построить алгоритм классификации $a(\vec{x}) : X \to Y$.&lt;br /&gt;
&lt;br /&gt;
=== Разделяющая гиперплоскость ===&lt;br /&gt;
&lt;br /&gt;
[[Файл:svm_hyperplane.png|300px|thumb|right|Примеры разделяющих гиперплоскостей в $\mathbb{R}^2$]]&lt;br /&gt;
&lt;br /&gt;
В пространстве $\mathbb{R}^n$ уравнение $\langle \vec{w}, \vec{x} \rangle - b = 0$ при заданных $\vec{w}$ и $b$ определяет гиперплоскость — множество векторов $\vec{x} = (x_1, \ldots, x_n)$, принадлежащих пространству меньшей размерности $\mathbb{R}^{n-1}$. Например, для $\mathbb{R}^1$ гиперплоскостью является точка, для $\mathbb{R}^2$ — прямая, для $\mathbb{R}^3$ — плоскость и т.д. Параметр $\vec{w}$ определяет вектор нормали к гиперплоскости, а через $\frac{b}{\lVert \vec{w} \rVert}$ выражается расстояние от гиперплоскости до начала координат.&lt;br /&gt;
&lt;br /&gt;
Гиперплоскость делит $\mathbb{R}^n$ на два полупространства: $\langle \vec{w}, \vec{x} \rangle - b &amp;gt; 0$ и $\langle \vec{w}, \vec{x} \rangle - b &amp;lt; 0$.&lt;br /&gt;
&lt;br /&gt;
Говорят, что гиперплоскость разделяет два класса $C_1$ и $C_2$, если объекты этих классов лежат по разные стороны от гиперплоскости, то есть выполнено либо&lt;br /&gt;
&lt;br /&gt;
$\begin{cases}\langle \vec{w}, \vec{x} \rangle - b &amp;gt; 0, &amp;amp;&amp;amp; \forall x \in C_1 \\ \langle \vec{w}, \vec{x} \rangle - b &amp;lt; 0, &amp;amp;&amp;amp; \forall x \in C_2\end{cases}$&lt;br /&gt;
&lt;br /&gt;
либо&lt;br /&gt;
&lt;br /&gt;
$\begin{cases}\langle \vec{w}, \vec{x} \rangle - b &amp;lt; 0, &amp;amp;&amp;amp; \forall x \in C_1 \\ \langle \vec{w}, \vec{x} \rangle - b &amp;gt; 0, &amp;amp;&amp;amp; \forall x \in C_2\end{cases}$&lt;br /&gt;
&lt;br /&gt;
=== Линейно разделимая выборка ===&lt;br /&gt;
&lt;br /&gt;
Пусть выборка линейно разделима, то есть существует некоторая гиперплоскость, разделяющая классы $-1$ и $+1$. Тогда в качестве алгоритма классификации можно использовать линейный пороговый классификатор:&lt;br /&gt;
&lt;br /&gt;
$a(\vec{x}) = sign(\langle \vec{w}, \vec{x} \rangle - b) = sign\left(\sum\limits_{i=1}^\ell w_i x_i - b\right)$&lt;br /&gt;
&lt;br /&gt;
где $\vec{x} = (x_1, \ldots, x_n)$ — вектор значений признаков объекта, а $\vec{w} = (w_1, \ldots, w_n) \in \mathbb{R}^n$ и $b \in \mathbb{R}$ — параметры гиперплоскости.&lt;br /&gt;
&lt;br /&gt;
Но для двух линейно разделимых классов существует бесконечное множество разделяющих гиперплоскостей. Метод опорных векторов выбирает ту гиперплоскость, которая максимизирует отступ между классами:&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition='''Отступ''' (англ. ''margin'') — характеристика, оценивающая, насколько объект &amp;quot;погружён&amp;quot; в свой класс, насколько типичным представителем класса он является. Чем меньше значение отступа $M_i$, тем ближе объект $\vec{x}_i$ подходит к границе классов и тем выше становится вероятность ошибки. Отступ $M_i$ отрицателен тогда и только тогда, когда алгоритм $a(x)$ допускает ошибку на объекте $\vec{x}_i$.  &lt;br /&gt;
&lt;br /&gt;
Для линейного классификатора отступ определяется уравнением: $M_i(\vec{w}, b) = y_i(\langle \vec{w}, \vec{x}_i \rangle - b)$&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Таким образом, для линейно разделимой выборки существует такая гиперплоскость, отступ от которой до каждого объекта положителен:&lt;br /&gt;
&lt;br /&gt;
$\exists \vec{w}, b : M_i(\vec{w}, b) = y_i(\langle \vec{w}, \vec{x} \rangle - b) &amp;gt; 0, \; i = 1\ldots\ell$&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:SVM_margin.png|300px|thumb|right|Оптимальная разделяющая гиперплоскость в $\mathbb{R}^2$]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|id=kkt&lt;br /&gt;
|author=Условия Каруша—Куна—Таккера&lt;br /&gt;
|statement=&lt;br /&gt;
Пусть поставлена задача нелинейного программирования с ограничениями:&lt;br /&gt;
$$&lt;br /&gt;
\begin{cases}&lt;br /&gt;
f(x) \to \min\limits_{x \in X} \\&lt;br /&gt;
g_i(x) \leq 0,\;i=1\ldots m \\&lt;br /&gt;
h_j(x) = 0,\;j=1\ldots k&lt;br /&gt;
\end{cases}&lt;br /&gt;
$$&lt;br /&gt;
&lt;br /&gt;
Если $\hat{x} \in \arg\min f$ — решение задачи при наложенных ограничениях, то существуют множители $\mu_i, i = 1\ldots m$, $\lambda_j, j = 1\ldots k$, что для функции Лагранжа $L(x; \mu, \lambda)$ выполняются условия:&lt;br /&gt;
&lt;br /&gt;
$$\begin{cases}\frac{\partial L}{\partial x} = 0 \quad L(x; \mu, \lambda) = f(x) + \sum\limits_{i=1}^m \mu_i g_i(x) + \sum\limits_{j=1}^k \lambda_j h_j(x) \\ g_i(x) \leq 0,\;h_j(x) = 0 \quad \text{(исходные ограничения)} \\ \mu_i \geq 0 \quad \text{(двойственные ограничения)} \\ \mu_i g_i(x) = 0 \quad \text{(условие дополняющей нежёсткости)} \end{cases}$$&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
В качестве аппроксимации функции потерь возьмём $L(x_i, y_i) = max(0, 1 - M_i(w, w_0))$&lt;br /&gt;
&lt;br /&gt;
Запишем функционал для метода оптимизации эмпирического риска с использованием данной функции потерь и регуляризации:&lt;br /&gt;
&lt;br /&gt;
$\sum\limits_{i=1}^\ell (1 - M_i(w, w_0))_+ + \frac{1}{2C} \lVert w \rVert^2 \to \min\limits_{w, w_0}$&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Линейно неразделимая выборка ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Метод опорных векторов в задаче регрессии ==&lt;br /&gt;
// TODO&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
* [[Обзор библиотек для машинного обучения на Python]]&lt;br /&gt;
* [[Общие понятия]]&lt;br /&gt;
&lt;br /&gt;
== Примечания ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
* [http://www.machinelearning.ru/wiki/index.php?title=%D0%9C%D0%B0%D1%88%D0%B8%D0%BD%D0%B0_%D0%BE%D0%BF%D0%BE%D1%80%D0%BD%D1%8B%D1%85_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2 machinelearning.ru {{---}} Машина опорных векторов]&lt;br /&gt;
* [https://www.youtube.com/watch?v=Adi67_94_gc&amp;amp;list=PLJOzdkh8T5kp99tGTEFjH_b9zqEQiiBtC&amp;amp;index=5 Лекция &amp;quot;Линейные методы классификации: метод опорных векторов&amp;quot;]  {{---}} К.В. Воронцов, курс &amp;quot;Машинное обучение&amp;quot; 2014&lt;br /&gt;
* [https://ru.wikipedia.org/wiki/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%BE%D0%BF%D0%BE%D1%80%D0%BD%D1%8B%D1%85_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2 Wikipedia {{---}} Метод опорных векторов]&lt;br /&gt;
* Alexey Nefedov {{---}} [https://svmtutorial.online/ Support Vector Machines: A Simple Tutorial]&lt;br /&gt;
* John Platt {{---}} [https://www.microsoft.com/en-us/research/publication/sequential-minimal-optimization-a-fast-algorithm-for-training-support-vector-machines/ Sequential Minimal Optimization: A Fast Algorithm for Training Support Vector Machines]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Машинное обучение]]&lt;br /&gt;
[[Категория: Классификация]]&lt;br /&gt;
[[Категория: Регрессия]]&lt;/div&gt;</summary>
		<author><name>Egormkn</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%BE%D0%BF%D0%BE%D1%80%D0%BD%D1%8B%D1%85_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2_(SVM)&amp;diff=70641</id>
		<title>Метод опорных векторов (SVM)</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%BE%D0%BF%D0%BE%D1%80%D0%BD%D1%8B%D1%85_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2_(SVM)&amp;diff=70641"/>
				<updated>2019-03-31T14:04:25Z</updated>
		
		<summary type="html">&lt;p&gt;Egormkn: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{в разработке}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Метод опорных векторов''' (англ. ''support vector machine'', ''SVM'') — один из наиболее популярных методов обучения, который применяется для решения задач классификации и регрессии. Основная идея метода заключается в построении гиперплоскости, разделяющей объекты выборки наиболее оптимальным способом. Алгоритм работает в предположении, что чем больше расстояние (зазор) между разделяющей гиперплоскостью и объектами разделяемых классов, тем меньше будет средняя ошибка классификатора.&lt;br /&gt;
&lt;br /&gt;
== Метод опорных векторов в задаче классификации ==&lt;br /&gt;
&lt;br /&gt;
Рассмотрим задачу бинарной классификации, в которой объектам из $X=\mathbb{R}^n$ соответствует один из двух классов $Y = \{-1, +1\}$.&lt;br /&gt;
&lt;br /&gt;
Пусть задана обучающая выборка пар &amp;quot;объект-ответ&amp;quot;: $T^\ell = (\vec{x}_i, y_i)_{i=1}^\ell$. Необходимо построить алгоритм классификации $a(\vec{x}) : X \to Y$.&lt;br /&gt;
&lt;br /&gt;
=== Разделяющая гиперплоскость ===&lt;br /&gt;
&lt;br /&gt;
[[Файл:svm_hyperplane.png|300px|thumb|right|Примеры разделяющих гиперплоскостей в $\mathbb{R}^2$]]&lt;br /&gt;
&lt;br /&gt;
В пространстве $\mathbb{R}^n$ уравнение $\langle \vec{w}, \vec{x} \rangle - b = 0$ при заданных $\vec{w}$ и $b$ определяет гиперплоскость — множество векторов $\vec{x} = (x_1, \ldots, x_n)$, принадлежащих пространству меньшей размерности $\mathbb{R}^{n-1}$. Например, для $\mathbb{R}^1$ гиперплоскостью является точка, для $\mathbb{R}^2$ — прямая, для $\mathbb{R}^3$ — плоскость и т.д. Параметр $\vec{w}$ определяет вектор нормали к гиперплоскости, а через $\frac{b}{\lVert \vec{w} \rVert}$ выражается расстояние от гиперплоскости до начала координат.&lt;br /&gt;
&lt;br /&gt;
Гиперплоскость делит $\mathbb{R}^n$ на два полупространства: $\langle \vec{w}, \vec{x} \rangle - b &amp;gt; 0$ и $\langle \vec{w}, \vec{x} \rangle - b &amp;lt; 0$.&lt;br /&gt;
&lt;br /&gt;
Говорят, что гиперплоскость разделяет два класса $C_1$ и $C_2$, если объекты этих классов лежат по разные стороны от гиперплоскости, то есть выполнено либо&lt;br /&gt;
&lt;br /&gt;
$\begin{cases}\langle \vec{w}, \vec{x} \rangle - b &amp;gt; 0, &amp;amp;&amp;amp; \forall x \in C_1 \\ \langle \vec{w}, \vec{x} \rangle - b &amp;lt; 0, &amp;amp;&amp;amp; \forall x \in C_2\end{cases}$&lt;br /&gt;
&lt;br /&gt;
либо&lt;br /&gt;
&lt;br /&gt;
$\begin{cases}\langle \vec{w}, \vec{x} \rangle - b &amp;lt; 0, &amp;amp;&amp;amp; \forall x \in C_1 \\ \langle \vec{w}, \vec{x} \rangle - b &amp;gt; 0, &amp;amp;&amp;amp; \forall x \in C_2\end{cases}$&lt;br /&gt;
&lt;br /&gt;
=== Линейно разделимая выборка ===&lt;br /&gt;
&lt;br /&gt;
Пусть выборка линейно разделима, то есть существует некоторая гиперплоскость, разделяющая классы $-1$ и $+1$. Тогда в качестве алгоритма классификации можно использовать линейный пороговый классификатор:&lt;br /&gt;
&lt;br /&gt;
$a(\vec{x}) = sign(\langle \vec{w}, \vec{x} \rangle - b) = sign\left(\sum\limits_{i=1}^\ell w_i x_i - b\right)$&lt;br /&gt;
&lt;br /&gt;
где $\vec{x} = (x_1, \ldots, x_n)$ — вектор значений признаков объекта, а $\vec{w} = (w_1, \ldots, w_n) \in \mathbb{R}^n$ и $b \in \mathbb{R}$ — параметры гиперплоскости.&lt;br /&gt;
&lt;br /&gt;
Но для двух линейно разделимых классов существует бесконечное множество разделяющих гиперплоскостей. Метод опорных векторов выбирает ту гиперплоскость, которая максимизирует отступ между классами:&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition='''Отступ''' (англ. ''margin'') — характеристика, оценивающая, насколько объект &amp;quot;погружён&amp;quot; в свой класс, насколько типичным представителем класса он является. Чем меньше значение отступа $M_i$, тем ближе объект $\vec{x}_i$ подходит к границе классов и тем выше становится вероятность ошибки. Отступ $M_i$ отрицателен тогда и только тогда, когда алгоритм $a(x)$ допускает ошибку на объекте $\vec{x}_i$. &lt;br /&gt;
Для задачи бинарной классификации: $M(x_i, y_i) = y_i(\langle x_i, w \rangle - w_0)$&lt;br /&gt;
Для задачи классификации на несколько классов: $M(x_i, y_i) = \langle x_i, w_{y_i}\rangle - \max\limits_{y \in \mathbb{Y}, y \ne y_i} \langle x_i, w_y\rangle$ &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Таким образом, для линейно разделимой выборки существует такая гиперплоскость, отступ от которой до каждого объекта положителен:&lt;br /&gt;
&lt;br /&gt;
$\exists \vec{w}, b : M_i(\vec{w}, b) = y_i(\langle \vec{w}, \vec{x} \rangle - b) &amp;gt; 0, \; i = 1\ldots\ell$&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:SVM_margin.png|300px|thumb|right|Оптимальная разделяющая гиперплоскость в $\mathbb{R}^2$]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|id=kkt&lt;br /&gt;
|author=Условия Каруша—Куна—Таккера&lt;br /&gt;
|statement=&lt;br /&gt;
Пусть поставлена задача нелинейного программирования с ограничениями:&lt;br /&gt;
$$&lt;br /&gt;
\begin{cases}&lt;br /&gt;
f(x) \to \min\limits_{x \in X} \\&lt;br /&gt;
g_i(x) \leq 0,\;i=1\ldots m \\&lt;br /&gt;
h_j(x) = 0,\;j=1\ldots k&lt;br /&gt;
\end{cases}&lt;br /&gt;
$$&lt;br /&gt;
&lt;br /&gt;
Если $\hat{x} \in \arg\min f$ — решение задачи при наложенных ограничениях, то существуют множители $\mu_i, i = 1\ldots m$, $\lambda_j, j = 1\ldots k$, что для функции Лагранжа $L(x; \mu, \lambda)$ выполняются условия:&lt;br /&gt;
&lt;br /&gt;
$$\begin{cases}\frac{\partial L}{\partial x} = 0 \quad L(x; \mu, \lambda) = f(x) + \sum\limits_{i=1}^m \mu_i g_i(x) + \sum\limits_{j=1}^k \lambda_j h_j(x) \\ g_i(x) \leq 0,\;h_j(x) = 0 \quad \text{(исходные ограничения)} \\ \mu_i \geq 0 \quad \text{(двойственные ограничения)} \\ \mu_i g_i(x) = 0 \quad \text{(условие дополняющей нежёсткости)} \end{cases}$$&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
В качестве аппроксимации функции потерь возьмём $L(x_i, y_i) = max(0, 1 - M_i(w, w_0))$&lt;br /&gt;
&lt;br /&gt;
Запишем функционал для метода оптимизации эмпирического риска с использованием данной функции потерь и регуляризации:&lt;br /&gt;
&lt;br /&gt;
$\sum\limits_{i=1}^\ell (1 - M_i(w, w_0))_+ + \frac{1}{2C} \lVert w \rVert^2 \to \min\limits_{w, w_0}$&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Линейно неразделимая выборка ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Метод опорных векторов в задаче регрессии ==&lt;br /&gt;
// TODO&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
* [[Обзор библиотек для машинного обучения на Python]]&lt;br /&gt;
* [[Общие понятия]]&lt;br /&gt;
&lt;br /&gt;
== Примечания ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
* [http://www.machinelearning.ru/wiki/index.php?title=%D0%9C%D0%B0%D1%88%D0%B8%D0%BD%D0%B0_%D0%BE%D0%BF%D0%BE%D1%80%D0%BD%D1%8B%D1%85_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2 machinelearning.ru {{---}} Машина опорных векторов]&lt;br /&gt;
* [https://www.youtube.com/watch?v=Adi67_94_gc&amp;amp;list=PLJOzdkh8T5kp99tGTEFjH_b9zqEQiiBtC&amp;amp;index=5 Лекция &amp;quot;Линейные методы классификации: метод опорных векторов&amp;quot;]  {{---}} К.В. Воронцов, курс &amp;quot;Машинное обучение&amp;quot; 2014&lt;br /&gt;
* [https://ru.wikipedia.org/wiki/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%BE%D0%BF%D0%BE%D1%80%D0%BD%D1%8B%D1%85_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2 Wikipedia {{---}} Метод опорных векторов]&lt;br /&gt;
* Alexey Nefedov {{---}} [https://svmtutorial.online/ Support Vector Machines: A Simple Tutorial]&lt;br /&gt;
* John Platt {{---}} [https://www.microsoft.com/en-us/research/publication/sequential-minimal-optimization-a-fast-algorithm-for-training-support-vector-machines/ Sequential Minimal Optimization: A Fast Algorithm for Training Support Vector Machines]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Машинное обучение]]&lt;br /&gt;
[[Категория: Классификация]]&lt;br /&gt;
[[Категория: Регрессия]]&lt;/div&gt;</summary>
		<author><name>Egormkn</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Svm_hyperplane.png&amp;diff=70640</id>
		<title>Файл:Svm hyperplane.png</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Svm_hyperplane.png&amp;diff=70640"/>
				<updated>2019-03-31T13:40:11Z</updated>
		
		<summary type="html">&lt;p&gt;Egormkn: Egormkn загрузил новую версию Файл:Svm hyperplane.png&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Egormkn</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Svm_hyperplane.png&amp;diff=70639</id>
		<title>Файл:Svm hyperplane.png</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Svm_hyperplane.png&amp;diff=70639"/>
				<updated>2019-03-31T13:25:30Z</updated>
		
		<summary type="html">&lt;p&gt;Egormkn: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Egormkn</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%BE%D0%BF%D0%BE%D1%80%D0%BD%D1%8B%D1%85_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2_(SVM)&amp;diff=70529</id>
		<title>Метод опорных векторов (SVM)</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%BE%D0%BF%D0%BE%D1%80%D0%BD%D1%8B%D1%85_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2_(SVM)&amp;diff=70529"/>
				<updated>2019-03-21T18:56:59Z</updated>
		
		<summary type="html">&lt;p&gt;Egormkn: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{в разработке}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Метод опорных векторов''' (англ. ''support vector machine'', ''SVM'') — семейство алгоритмов обучения с учителем, использующихся для решения задач классификации и регрессии. Основная идея метода заключается в построении гиперплоскости, разделяющей объекты выборки наиболее оптимальным способом.&lt;br /&gt;
&lt;br /&gt;
== Метод опорных векторов в задаче классификации ==&lt;br /&gt;
&lt;br /&gt;
Рассмотрим задачу бинарной классификации, в которой объектам из $X=\mathbb{R}^n$ соответствует один из двух классов $Y = \{-1, +1\}$.&lt;br /&gt;
&lt;br /&gt;
Пусть задана обучающая выборка пар &amp;quot;объект-ответ&amp;quot;: $X^\ell = (\vec{x}_i, y_i)_{i=1}^\ell$. Необходимо построить алгоритм классификации $a(\vec{x}) : X \to Y$.&lt;br /&gt;
&lt;br /&gt;
=== Разделяющая гиперплоскость ===&lt;br /&gt;
&lt;br /&gt;
В пространстве $\mathbb{R}^n$ уравнение $\langle \vec{w}, \vec{x} \rangle - b = 0$ при заданных $\vec{w}$ и $b$ определяет гиперплоскость — (n-1)-мерное множество векторов $\vec{x} = (x^1, \ldots, x^n)$. Для $\mathbb{R}^1$ это точка, для $\mathbb{R}^2$ — прямая, для $\mathbb{R}^3$ — плоскость и т.д. Эта гиперплоскость делит $\mathbb{R}^n$ на два полупространства: $\langle \vec{w}, \vec{x} \rangle - b &amp;gt; 0$ и $\langle \vec{w}, \vec{x} \rangle - b &amp;lt; 0$.&lt;br /&gt;
&lt;br /&gt;
Говорят, что гиперплоскость разделяет два класса $C_1$ и $C_2$, если выполнено&lt;br /&gt;
&lt;br /&gt;
$\begin{cases}\langle \vec{w}, \vec{x} \rangle - b &amp;gt; 0, &amp;amp;&amp;amp; \forall x \in C_1 \\ \langle \vec{w}, \vec{x} \rangle - b &amp;lt; 0, &amp;amp;&amp;amp; \forall x \in C_2\end{cases}$&lt;br /&gt;
&lt;br /&gt;
либо&lt;br /&gt;
&lt;br /&gt;
$\begin{cases}\langle \vec{w}, \vec{x} \rangle - b &amp;lt; 0, &amp;amp;&amp;amp; \forall x \in C_1 \\ \langle \vec{w}, \vec{x} \rangle - b &amp;gt; 0, &amp;amp;&amp;amp; \forall x \in C_2\end{cases}$&lt;br /&gt;
&lt;br /&gt;
=== Линейно разделимая выборка ===&lt;br /&gt;
&lt;br /&gt;
Пусть выборка линейно разделима, то есть существует некоторая гиперплоскость, разделяющая классы $-1$ и $+1$. Тогда в качестве алгоритма классификации можно взять линейный пороговый классификатор:&lt;br /&gt;
&lt;br /&gt;
$a(\vec{x}) = sign(\langle \vec{w}, \vec{x} \rangle - b) = sign\left(\sum\limits_{j=1}^\ell w_j x^j - b\right)$&lt;br /&gt;
&lt;br /&gt;
где $\vec{x} = (x^1, \ldots, x^n)$ — вектор значений признаков объекта, а $\vec{w} = (w_1, \ldots, w_n) \in \mathbb{R}^n$ и $b \in \mathbb{R}$ — параметры алгоритма.&lt;br /&gt;
&lt;br /&gt;
Но для двух линейно разделимых классов существует бесконечное множество разделяющих гиперплоскостей. Метод опорных векторов выбирает ту гиперплоскость, которая максимизирует отступ между классами:&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
'''Отступ''' (англ. ''margin'') — характеристика, оценивающая, насколько объект &amp;quot;погружён&amp;quot; в свой класс, насколько типичным представителем класса он является. Чем меньше значение отступа $M(x_i, y_i)$, тем ближе объект подходит к границе классов и тем выше становится вероятность ошибки. Отступ $M(x_i, y_i)$ отрицателен тогда и только тогда, когда алгоритм $a(x)$ допускает ошибку на объекте $x_i$. &lt;br /&gt;
Для задачи бинарной классификации: $M(x_i, y_i) = y_i(\langle x_i, w \rangle - w_0)$&lt;br /&gt;
Для задачи классификации на несколько классов: $M(x_i, y_i) = \langle x_i, w_{y_i}\rangle - \max\limits_{y \in \mathbb{Y}, y \ne y_i} \langle x_i, w_y\rangle$ &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Таким образом, для линейно разделимой выборки существует такая гиперплоскость, отступ от которой до каждого объекта положителен:&lt;br /&gt;
&lt;br /&gt;
$\exists \vec{w}, b : M_i(\vec{w}, b) = y_i(\langle \vec{w}, \vec{x} \rangle - b) &amp;gt; 0, \; i = 1\ldots\ell$&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:SVM_margin.png|300px|thumb|right|Оптимальная разделяющая гиперплоскость в $\mathbb{R}^2$]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|id=kkt&lt;br /&gt;
|author=Условия Каруша—Куна—Таккера&lt;br /&gt;
|statement=&lt;br /&gt;
Пусть поставлена задача нелинейного программирования с ограничениями:&lt;br /&gt;
$$&lt;br /&gt;
\begin{cases}&lt;br /&gt;
f(x) \to \min\limits_{x \in X} \\&lt;br /&gt;
g_i(x) \leq 0,\;i=1\ldots m \\&lt;br /&gt;
h_j(x) = 0,\;j=1\ldots k&lt;br /&gt;
\end{cases}&lt;br /&gt;
$$&lt;br /&gt;
&lt;br /&gt;
Если $\hat{x} \in \arg\min f$ — решение задачи при наложенных ограничениях, то существуют множители $\mu_i, i = 1\ldots m$, $\lambda_j, j = 1\ldots k$, что для функции Лагранжа $L(x; \mu, \lambda)$ выполняются условия:&lt;br /&gt;
&lt;br /&gt;
$$\begin{cases}\frac{\partial L}{\partial x} = 0 \quad L(x; \mu, \lambda) = f(x) + \sum\limits_{i=1}^m \mu_i g_i(x) + \sum\limits_{j=1}^k \lambda_j h_j(x) \\ g_i(x) \leq 0,\;h_j(x) = 0 \quad \text{(исходные ограничения)} \\ \mu_i \geq 0 \quad \text{(двойственные ограничения)} \\ \mu_i g_i(x) = 0 \quad \text{(условие дополняющей нежёсткости)} \end{cases}$$&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
В качестве аппроксимации функции потерь возьмём $L(x_i, y_i) = max(0, 1 - M_i(w, w_0))$&lt;br /&gt;
&lt;br /&gt;
Запишем функционал для метода оптимизации эмпирического риска с использованием данной функции потерь и регуляризации:&lt;br /&gt;
&lt;br /&gt;
$\sum\limits_{i=1}^\ell (1 - M_i(w, w_0))_+ + \frac{1}{2C} \lVert w \rVert^2 \to \min\limits_{w, w_0}$&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Линейно неразделимая выборка ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Метод опорных векторов в задаче регрессии ==&lt;br /&gt;
// TODO&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
* [[Обзор библиотек для машинного обучения на Python]]&lt;br /&gt;
* [[Общие понятия]]&lt;br /&gt;
&lt;br /&gt;
== Примечания ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
* [http://www.machinelearning.ru/wiki/index.php?title=%D0%9C%D0%B0%D1%88%D0%B8%D0%BD%D0%B0_%D0%BE%D0%BF%D0%BE%D1%80%D0%BD%D1%8B%D1%85_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2 machinelearning.ru {{---}} Машина опорных векторов]&lt;br /&gt;
* [https://www.youtube.com/watch?v=Adi67_94_gc&amp;amp;list=PLJOzdkh8T5kp99tGTEFjH_b9zqEQiiBtC&amp;amp;index=5 Лекция &amp;quot;Линейные методы классификации: метод опорных векторов&amp;quot;]  {{---}} К.В. Воронцов, курс &amp;quot;Машинное обучение&amp;quot; 2014&lt;br /&gt;
* [https://ru.wikipedia.org/wiki/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%BE%D0%BF%D0%BE%D1%80%D0%BD%D1%8B%D1%85_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2 Wikipedia {{---}} Метод опорных векторов]&lt;br /&gt;
* Alexey Nefedov {{---}} [https://svmtutorial.online/ Support Vector Machines: A Simple Tutorial]&lt;br /&gt;
* John Platt {{---}} [https://www.microsoft.com/en-us/research/publication/sequential-minimal-optimization-a-fast-algorithm-for-training-support-vector-machines/ Sequential Minimal Optimization: A Fast Algorithm for Training Support Vector Machines]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Машинное обучение]]&lt;br /&gt;
[[Категория: Классификация]]&lt;br /&gt;
[[Категория: Регрессия]]&lt;/div&gt;</summary>
		<author><name>Egormkn</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%BE%D0%BF%D0%BE%D1%80%D0%BD%D1%8B%D1%85_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2_(SVM)&amp;diff=70528</id>
		<title>Метод опорных векторов (SVM)</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%BE%D0%BF%D0%BE%D1%80%D0%BD%D1%8B%D1%85_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2_(SVM)&amp;diff=70528"/>
				<updated>2019-03-21T18:50:46Z</updated>
		
		<summary type="html">&lt;p&gt;Egormkn: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{в разработке}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Метод опорных векторов''' (англ. ''support vector machine'', ''SVM'') — семейство алгоритмов обучения с учителем, использующихся для решения задач классификации и регрессии. Основная идея метода заключается в построении гиперплоскости, разделяющей объекты выборки наиболее оптимальным способом.&lt;br /&gt;
&lt;br /&gt;
== Метод опорных векторов в задаче классификации ==&lt;br /&gt;
&lt;br /&gt;
Рассмотрим задачу бинарной классификации, в которой объектам из $X=\mathbb{R}^n$ соответствует один из двух классов $Y = \{-1, +1\}$.&lt;br /&gt;
&lt;br /&gt;
Пусть задана обучающая выборка пар &amp;quot;объект-ответ&amp;quot;: $X^\ell = (\vec{x}_i, y_i)_{i=1}^\ell$. Необходимо построить алгоритм классификации $a(\vec{x}) : X \to Y$.&lt;br /&gt;
&lt;br /&gt;
=== Разделяющая гиперплоскость ===&lt;br /&gt;
&lt;br /&gt;
В пространстве $\mathbb{R}^n$ уравнение $\langle \vec{w}, \vec{x} \rangle - b = 0$ при заданных $\vec{w}$ и $b$ определяет гиперплоскость — (n-1)-мерное множество векторов $\vec{x} = (x^1, \ldots, x^n)$. Для $\mathbb{R}^1$ это точка, для $\mathbb{R}^2$ — прямая, для $\mathbb{R}^3$ — плоскость и т.д. Эта гиперплоскость делит $\mathbb{R}^n$ на два полупространства: $\langle \vec{w}, \vec{x} \rangle - b &amp;gt; 0$ и $\langle \vec{w}, \vec{x} \rangle - b &amp;lt; 0$.&lt;br /&gt;
&lt;br /&gt;
Говорят, что гиперплоскость разделяет два класса $C_1$ и $C_2$, если выполнено&lt;br /&gt;
&lt;br /&gt;
$\begin{cases}\langle \vec{w}, \vec{x} \rangle - b &amp;gt; 0, &amp;amp;&amp;amp; \forall x \in C_1 \\ \langle \vec{w}, \vec{x} \rangle - b &amp;lt; 0, &amp;amp;&amp;amp; \forall x \in C_2\end{cases}$&lt;br /&gt;
&lt;br /&gt;
либо&lt;br /&gt;
&lt;br /&gt;
$\begin{cases}\langle \vec{w}, \vec{x} \rangle - b &amp;lt; 0, &amp;amp;&amp;amp; \forall x \in C_1 \\ \langle \vec{w}, \vec{x} \rangle - b &amp;gt; 0, &amp;amp;&amp;amp; \forall x \in C_2\end{cases}$&lt;br /&gt;
&lt;br /&gt;
=== Линейно разделимая выборка ===&lt;br /&gt;
&lt;br /&gt;
Пусть выборка линейно разделима, то есть существует некоторая гиперплоскость, разделяющая классы $-1$ и $+1$. Тогда в качестве алгоритма классификации можно взять линейный пороговый классификатор:&lt;br /&gt;
&lt;br /&gt;
$a(\vec{x}) = sign(\langle \vec{w}, \vec{x} \rangle - b) = sign\left(\sum\limits_{j=1}^\ell w_j x^j - b\right)$&lt;br /&gt;
&lt;br /&gt;
где $\vec{x} = (x^1, \ldots, x^n)$ — вектор значений признаков объекта, а $\vec{w} = (w_1, \ldots, w_n) \in \mathbb{R}^n$ и $b \in \mathbb{R}$ — параметры алгоритма.&lt;br /&gt;
&lt;br /&gt;
Но для двух линейно разделимых классов существует бесконечное множество разделяющих гиперплоскостей. Метод опорных векторов выбирает ту гиперплоскость, которая максимизирует отступ между классами:&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
'''Отступ''' (англ. ''margin'') — характеристика, оценивающая, насколько объект &amp;quot;погружён&amp;quot; в свой класс, насколько типичным представителем класса он является. Чем меньше значение отступа $M(x_i, y_i)$, тем ближе объект подходит к границе классов и тем выше становится вероятность ошибки. Отступ $M(x_i, y_i)$ отрицателен тогда и только тогда, когда алгоритм $a(x)$ допускает ошибку на объекте $x_i$. &lt;br /&gt;
Для задачи бинарной классификации: $M(x_i, y_i) = y_i(\langle x_i, w \rangle - w_0)$&lt;br /&gt;
Для задачи классификации на несколько классов: $M(x_i, y_i) = \langle x_i, w_{y_i}\rangle - \max\limits_{y \in \mathbb{Y}, y \ne y_i} \langle x_i, w_y\rangle$ &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Таким образом, для линейно разделимой выборки существует такая гиперплоскость, отступ от которой до каждого объекта положителен:&lt;br /&gt;
&lt;br /&gt;
$\exists \vec{w}, b : M_i(\vec{w}, b) = y_i(\langle \vec{w}, \vec{x} \rangle - b) &amp;gt; 0, \; i = 1\ldots\ell$&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|id=kkt&lt;br /&gt;
|author=Условия Каруша—Куна—Таккера&lt;br /&gt;
|statement=&lt;br /&gt;
Пусть поставлена задача нелинейного программирования с ограничениями:&lt;br /&gt;
$$&lt;br /&gt;
\begin{cases}&lt;br /&gt;
f(x) \to \min\limits_{x \in X} \\&lt;br /&gt;
g_i(x) \leq 0,\;i=1\ldots m \\&lt;br /&gt;
h_j(x) = 0,\;j=1\ldots k&lt;br /&gt;
\end{cases}&lt;br /&gt;
$$&lt;br /&gt;
&lt;br /&gt;
Если $\hat{x} \in \arg\min f$ — решение задачи при наложенных ограничениях, то существуют множители $\mu_i, i = 1\ldots m$, $\lambda_j, j = 1\ldots k$, что для функции Лагранжа $L(x; \mu, \lambda)$ выполняются условия:&lt;br /&gt;
&lt;br /&gt;
$$\begin{cases}\frac{\partial L}{\partial x} = 0 \quad L(x; \mu, \lambda) = f(x) + \sum\limits_{i=1}^m \mu_i g_i(x) + \sum\limits_{j=1}^k \lambda_j h_j(x) \\ g_i(x) \leq 0,\;h_j(x) = 0 \quad \text{(исходные ограничения)} \\ \mu_i \geq 0 \quad \text{(двойственные ограничения)} \\ \mu_i g_i(x) = 0 \quad \text{(условие дополняющей нежёсткости)} \end{cases}$$&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
В качестве аппроксимации функции потерь возьмём $L(x_i, y_i) = max(0, 1 - M_i(w, w_0))$&lt;br /&gt;
&lt;br /&gt;
Запишем функционал для метода оптимизации эмпирического риска с использованием данной функции потерь и регуляризации:&lt;br /&gt;
&lt;br /&gt;
$\sum\limits_{i=1}^\ell (1 - M_i(w, w_0))_+ + \frac{1}{2C} \lVert w \rVert^2 \to \min\limits_{w, w_0}$&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Линейно неразделимая выборка ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Метод опорных векторов в задаче регрессии ==&lt;br /&gt;
// TODO&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
* [[Обзор библиотек для машинного обучения на Python]]&lt;br /&gt;
* [[Общие понятия]]&lt;br /&gt;
&lt;br /&gt;
== Примечания ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
* [http://www.machinelearning.ru/wiki/index.php?title=%D0%9C%D0%B0%D1%88%D0%B8%D0%BD%D0%B0_%D0%BE%D0%BF%D0%BE%D1%80%D0%BD%D1%8B%D1%85_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2 machinelearning.ru {{---}} Машина опорных векторов]&lt;br /&gt;
* [https://www.youtube.com/watch?v=Adi67_94_gc&amp;amp;list=PLJOzdkh8T5kp99tGTEFjH_b9zqEQiiBtC&amp;amp;index=5 Лекция &amp;quot;Линейные методы классификации: метод опорных векторов&amp;quot;]  {{---}} К.В. Воронцов, курс &amp;quot;Машинное обучение&amp;quot; 2014&lt;br /&gt;
* [https://ru.wikipedia.org/wiki/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%BE%D0%BF%D0%BE%D1%80%D0%BD%D1%8B%D1%85_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2 Wikipedia {{---}} Метод опорных векторов]&lt;br /&gt;
* Alexey Nefedov {{---}} [https://svmtutorial.online/ Support Vector Machines: A Simple Tutorial]&lt;br /&gt;
* John Platt {{---}} [https://www.microsoft.com/en-us/research/publication/sequential-minimal-optimization-a-fast-algorithm-for-training-support-vector-machines/ Sequential Minimal Optimization: A Fast Algorithm for Training Support Vector Machines]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Машинное обучение]]&lt;br /&gt;
[[Категория: Классификация]]&lt;br /&gt;
[[Категория: Регрессия]]&lt;/div&gt;</summary>
		<author><name>Egormkn</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%BE%D0%BF%D0%BE%D1%80%D0%BD%D1%8B%D1%85_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2_(SVM)&amp;diff=70527</id>
		<title>Метод опорных векторов (SVM)</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%BE%D0%BF%D0%BE%D1%80%D0%BD%D1%8B%D1%85_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2_(SVM)&amp;diff=70527"/>
				<updated>2019-03-21T18:28:11Z</updated>
		
		<summary type="html">&lt;p&gt;Egormkn: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{в разработке}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Метод опорных векторов''' (англ. ''support vector machine'', ''SVM'') — семейство алгоритмов обучения с учителем, использующихся для решения задач классификации и регрессии. Основная идея метода заключается в построении гиперплоскости, разделяющей объекты выборки наиболее оптимальным способом.&lt;br /&gt;
&lt;br /&gt;
== Метод опорных векторов в задаче классификации ==&lt;br /&gt;
&lt;br /&gt;
Рассмотрим задачу бинарной классификации, в которой объектам из $X=\mathbb{R}^n$ соответствует один из двух классов $Y = \{-1, +1\}$.&lt;br /&gt;
&lt;br /&gt;
Пусть задана обучающая выборка пар &amp;quot;объект-ответ&amp;quot;: $X^\ell = (\vec{x}_i, y_i)_{i=1}^\ell$. Необходимо построить алгоритм классификации $a(\vec{x}) : X \to Y$.&lt;br /&gt;
&lt;br /&gt;
=== Разделяющая гиперплоскость ===&lt;br /&gt;
&lt;br /&gt;
В пространстве $\mathbb{R}^n$ уравнение $\langle \vec{w}, \vec{x} \rangle - b = 0$ при заданных $\vec{w}$ и $b$ определяет гиперплоскость — (n-1)-мерное множество векторов $\vec{x} = (x^1, \ldots, x^n)$. Для $\mathbb{R}^1$ это точка, для $\mathbb{R}^2$ — прямая, для $\mathbb{R}^3$ — плоскость и т.д. Эта гиперплоскость делит $\mathbb{R}^n$ на два полупространства: $\langle \vec{w}, \vec{x} \rangle - b &amp;gt; 0$ и $\langle \vec{w}, \vec{x} \rangle - b &amp;lt; 0$.&lt;br /&gt;
&lt;br /&gt;
Говорят, что гиперплоскость разделяет два класса $C_1$ и $C_2$, если выполнено&lt;br /&gt;
&lt;br /&gt;
$\begin{cases}\langle \vec{w}, \vec{x} \rangle - b &amp;gt; 0, &amp;amp;&amp;amp; \forall x \in C_1 \\ \langle \vec{w}, \vec{x} \rangle - b &amp;lt; 0, &amp;amp;&amp;amp; \forall x \in C_2\end{cases}$&lt;br /&gt;
&lt;br /&gt;
либо&lt;br /&gt;
&lt;br /&gt;
$\begin{cases}\langle \vec{w}, \vec{x} \rangle - b &amp;lt; 0, &amp;amp;&amp;amp; \forall x \in C_1 \\ \langle \vec{w}, \vec{x} \rangle - b &amp;gt; 0, &amp;amp;&amp;amp; \forall x \in C_2\end{cases}$&lt;br /&gt;
&lt;br /&gt;
=== Линейно разделимая выборка ===&lt;br /&gt;
&lt;br /&gt;
Пусть выборка линейно разделима, то есть существует некоторая гиперплоскость, разделяющая классы $-1$ и $+1$.&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
'''Отступ''' (англ. ''margin'') — характеристика, оценивающая, насколько объект &amp;quot;погружён&amp;quot; в свой класс, насколько типичным представителем класса он является. Чем меньше значение отступа $M(x_i, y_i)$, тем ближе объект подходит к границе классов и тем выше становится вероятность ошибки. Отступ $M(x_i, y_i)$ отрицателен тогда и только тогда, когда алгоритм $a(x)$ допускает ошибку на объекте $x_i$. &lt;br /&gt;
Для задачи бинарной классификации: $M(x_i, y_i) = y_i(\langle x_i, w \rangle - w_0)$&lt;br /&gt;
Для задачи классификации на несколько классов: $M(x_i, y_i) = \langle x_i, w_{y_i}\rangle - \max\limits_{y \in \mathbb{Y}, y \ne y_i} \langle x_i, w_y\rangle$ &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
[[Файл:SVM_margin.png|300px|thumb|right]]&lt;br /&gt;
&lt;br /&gt;
Возьмём в качестве алгоритма классификации $a(x) : X \to Y$ линейный пороговый классификатор:&lt;br /&gt;
&lt;br /&gt;
$$a(x) = sign\left(\sum\limits_{j=1}^\ell w_j x^j - w_0\right) = sign(\langle w, x \rangle - w_0)$$&lt;br /&gt;
&lt;br /&gt;
где $x = (x^1, \ldots, x^n)$ — вектор значений признаков объекта, а $w = (w_1, \ldots, w_n)$ и $w_0 \in \mathbb{R}$ — параметры алгоритма.&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|id=kkt&lt;br /&gt;
|author=Условия Каруша—Куна—Таккера&lt;br /&gt;
|statement=&lt;br /&gt;
Пусть поставлена задача нелинейного программирования с ограничениями:&lt;br /&gt;
$$&lt;br /&gt;
\begin{cases}&lt;br /&gt;
f(x) \to \min\limits_{x \in X} \\&lt;br /&gt;
g_i(x) \leq 0,\;i=1\ldots m \\&lt;br /&gt;
h_j(x) = 0,\;j=1\ldots k&lt;br /&gt;
\end{cases}&lt;br /&gt;
$$&lt;br /&gt;
&lt;br /&gt;
Если $\hat{x} \in \arg\min f$ — решение задачи при наложенных ограничениях, то существуют множители $\mu_i, i = 1\ldots m$, $\lambda_j, j = 1\ldots k$, что для функции Лагранжа $L(x; \mu, \lambda)$ выполняются условия:&lt;br /&gt;
&lt;br /&gt;
$$\begin{cases}\frac{\partial L}{\partial x} = 0 \quad L(x; \mu, \lambda) = f(x) + \sum\limits_{i=1}^m \mu_i g_i(x) + \sum\limits_{j=1}^k \lambda_j h_j(x) \\ g_i(x) \leq 0,\;h_j(x) = 0 \quad \text{(исходные ограничения)} \\ \mu_i \geq 0 \quad \text{(двойственные ограничения)} \\ \mu_i g_i(x) = 0 \quad \text{(условие дополняющей нежёсткости)} \end{cases}$$&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
В качестве аппроксимации функции потерь возьмём $L(x_i, y_i) = max(0, 1 - M_i(w, w_0))$&lt;br /&gt;
&lt;br /&gt;
Запишем функционал для метода оптимизации эмпирического риска с использованием данной функции потерь и регуляризации:&lt;br /&gt;
&lt;br /&gt;
$\sum\limits_{i=1}^\ell (1 - M_i(w, w_0))_+ + \frac{1}{2C} \lVert w \rVert^2 \to \min\limits_{w, w_0}$&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Линейно неразделимая выборка ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Метод опорных векторов в задаче регрессии ==&lt;br /&gt;
// TODO&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
* [[Обзор библиотек для машинного обучения на Python]]&lt;br /&gt;
* [[Общие понятия]]&lt;br /&gt;
&lt;br /&gt;
== Примечания ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
* [http://www.machinelearning.ru/wiki/index.php?title=%D0%9C%D0%B0%D1%88%D0%B8%D0%BD%D0%B0_%D0%BE%D0%BF%D0%BE%D1%80%D0%BD%D1%8B%D1%85_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2 machinelearning.ru {{---}} Машина опорных векторов]&lt;br /&gt;
* [https://www.youtube.com/watch?v=Adi67_94_gc&amp;amp;list=PLJOzdkh8T5kp99tGTEFjH_b9zqEQiiBtC&amp;amp;index=5 Лекция &amp;quot;Линейные методы классификации: метод опорных векторов&amp;quot;]  {{---}} К.В. Воронцов, курс &amp;quot;Машинное обучение&amp;quot; 2014&lt;br /&gt;
* [https://ru.wikipedia.org/wiki/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%BE%D0%BF%D0%BE%D1%80%D0%BD%D1%8B%D1%85_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2 Wikipedia {{---}} Метод опорных векторов]&lt;br /&gt;
* Alexey Nefedov {{---}} [https://svmtutorial.online/ Support Vector Machines: A Simple Tutorial]&lt;br /&gt;
* John Platt {{---}} [https://www.microsoft.com/en-us/research/publication/sequential-minimal-optimization-a-fast-algorithm-for-training-support-vector-machines/ Sequential Minimal Optimization: A Fast Algorithm for Training Support Vector Machines]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Машинное обучение]]&lt;br /&gt;
[[Категория: Классификация]]&lt;br /&gt;
[[Категория: Регрессия]]&lt;/div&gt;</summary>
		<author><name>Egormkn</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:SVM_margin.png&amp;diff=70524</id>
		<title>Файл:SVM margin.png</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:SVM_margin.png&amp;diff=70524"/>
				<updated>2019-03-21T16:46:10Z</updated>
		
		<summary type="html">&lt;p&gt;Egormkn: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Egormkn</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%BE%D0%BF%D0%BE%D1%80%D0%BD%D1%8B%D1%85_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2_(SVM)&amp;diff=70523</id>
		<title>Метод опорных векторов (SVM)</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%BE%D0%BF%D0%BE%D1%80%D0%BD%D1%8B%D1%85_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2_(SVM)&amp;diff=70523"/>
				<updated>2019-03-21T16:41:49Z</updated>
		
		<summary type="html">&lt;p&gt;Egormkn: Новая страница: «{{в разработке}}   '''Метод опорных векторов''' (англ. ''support vector machine'', ''SVM'') — семейство алгори…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{в разработке}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Метод опорных векторов''' (англ. ''support vector machine'', ''SVM'') — семейство алгоритмов обучения с учителем, использующихся для решения задач классификации и регрессии. Основная идея метода заключается в построении гиперплоскости, разделяющей объекты выборки наиболее оптимальным способом.&lt;br /&gt;
&lt;br /&gt;
== Метод опорных векторов в задаче классификации ==&lt;br /&gt;
Рассмотрим задачу классификации, в которой объектам из $X=\mathbb{R}^n$ соответствует один из двух классов $Y = \{-1, 1\}$.&lt;br /&gt;
&lt;br /&gt;
Пусть задана обучающая выборка пар &amp;quot;объект-ответ&amp;quot; $X^\ell = (x_i, y_i)_{i=1}^\ell$. Будем строить линейный пороговый классификатор:&lt;br /&gt;
&lt;br /&gt;
$$a(x) = sign\left(\sum\limits_{j=1}^\ell w_j x^j - w_0\right) = sign(\langle w, x \rangle - w_0)$$&lt;br /&gt;
&lt;br /&gt;
где $x = (x^1, \ldots, x^n)$ — вектор значений признаков объекта, а $w = (w_1, \ldots, w_n)$ и $w_0 \in \mathbb{R}$ — параметры алгоритма.&lt;br /&gt;
&lt;br /&gt;
=== Оптимальная разделяющая гиперплоскость ===&lt;br /&gt;
&lt;br /&gt;
Пусть выборка линейно разделима, то есть существуют такие значения параметров $w$ и $w_0$, для которых функционал количества ошибок равен нулю.&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
'''Отступ''' (англ. ''margin'') — характеристика, оценивающая, насколько объект &amp;quot;погружён&amp;quot; в свой класс, насколько типичным представителем класса он является. Чем меньше значение отступа $M(x_i, y_i)$, тем ближе объект подходит к границе классов и тем выше становится вероятность ошибки. Отступ $M(x_i, y_i)$ отрицателен тогда и только тогда, когда алгоритм $a(x)$ допускает ошибку на объекте $x_i$. &lt;br /&gt;
Для задачи бинарной классификации: $M(x_i, y_i) = y_i(\langle x_i, w \rangle - w_0)$&lt;br /&gt;
Для задачи классификации на несколько классов: $M(x_i, y_i) = \langle x_i, w_{y_i}\rangle - \max\limits_{y \in \mathbb{Y}, y \ne y_i} \langle x_i, w_y\rangle$ &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|id=kkt&lt;br /&gt;
|author=Условия Каруша—Куна—Таккера&lt;br /&gt;
|statement=&lt;br /&gt;
Пусть поставлена задача нелинейного программирования с ограничениями:&lt;br /&gt;
$$&lt;br /&gt;
\begin{cases}&lt;br /&gt;
f(x) \to \min\limits_{x \in X} \\&lt;br /&gt;
g_i(x) \leq 0,\;i=1\ldots m \\&lt;br /&gt;
h_j(x) = 0,\;j=1\ldots k&lt;br /&gt;
\end{cases}&lt;br /&gt;
$$&lt;br /&gt;
&lt;br /&gt;
Если $\hat{x} \in \arg\min f$ — решение задачи при наложенных ограничениях, то существуют множители $\mu_i, i = 1\ldots m$, $\lambda_j, j = 1\ldots k$, что для функции Лагранжа $L(x; \mu, \lambda)$ выполняются условия:&lt;br /&gt;
&lt;br /&gt;
$$\begin{cases}\frac{\partial L}{\partial x} = 0 \quad L(x; \mu, \lambda) = f(x) + \sum\limits_{i=1}^m \mu_i g_i(x) + \sum\limits_{j=1}^k \lambda_j h_j(x) \\ g_i(x) \leq 0,\;h_j(x) = 0 \quad \text{(исходные ограничения)} \\ \mu_i \geq 0 \quad \text{(двойственные ограничения)} \\ \mu_i g_i(x) = 0 \quad \text{(условие дополняющей нежёсткости)} \end{cases}$$&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
В качестве аппроксимации функции потерь возьмём $L(x_i, y_i) = max(0, 1 - M_i(w, w_0))$&lt;br /&gt;
&lt;br /&gt;
Запишем функционал для метода оптимизации эмпирического риска с использованием данной функции потерь и регуляризации:&lt;br /&gt;
&lt;br /&gt;
$\sum\limits_{i=1}^\ell (1 - M_i(w, w_0))_+ + \frac{1}{2C} \lVert w \rVert^2 \to \min\limits_{w, w_0}$&lt;br /&gt;
&lt;br /&gt;
=== Двойственная задача ===&lt;br /&gt;
&lt;br /&gt;
=== Линейно неразделимая выборка ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Метод опорных векторов в задаче регрессии ==&lt;br /&gt;
// TODO&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
* [[Обзор библиотек для машинного обучения на Python]]&lt;br /&gt;
* [[Общие понятия]]&lt;br /&gt;
&lt;br /&gt;
== Примечания ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
* [http://www.machinelearning.ru/wiki/index.php?title=%D0%9C%D0%B0%D1%88%D0%B8%D0%BD%D0%B0_%D0%BE%D0%BF%D0%BE%D1%80%D0%BD%D1%8B%D1%85_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2 machinelearning.ru {{---}} Машина опорных векторов]&lt;br /&gt;
* [https://www.youtube.com/watch?v=Adi67_94_gc&amp;amp;list=PLJOzdkh8T5kp99tGTEFjH_b9zqEQiiBtC&amp;amp;index=5 Лекция &amp;quot;Линейные методы классификации: метод опорных векторов&amp;quot;]  {{---}} К.В. Воронцов, курс &amp;quot;Машинное обучение&amp;quot; 2014&lt;br /&gt;
* [https://ru.wikipedia.org/wiki/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%BE%D0%BF%D0%BE%D1%80%D0%BD%D1%8B%D1%85_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2 Wikipedia {{---}} Метод опорных векторов]&lt;br /&gt;
* Alexey Nefedov {{---}} [https://svmtutorial.online/ Support Vector Machines: A Simple Tutorial]&lt;br /&gt;
* John Platt {{---}} [https://www.microsoft.com/en-us/research/publication/sequential-minimal-optimization-a-fast-algorithm-for-training-support-vector-machines/ Sequential Minimal Optimization: A Fast Algorithm for Training Support Vector Machines]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Машинное обучение]]&lt;br /&gt;
[[Категория: Классификация]]&lt;br /&gt;
[[Категория: Регрессия]]&lt;/div&gt;</summary>
		<author><name>Egormkn</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%BE%D0%BB%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D0%BB%D0%B5%D0%B4%D1%83%D1%8E%D1%89%D0%B5%D0%B3%D0%BE_%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D0%B0&amp;diff=53523</id>
		<title>Получение следующего объекта</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%BE%D0%BB%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D0%BB%D0%B5%D0%B4%D1%83%D1%8E%D1%89%D0%B5%D0%B3%D0%BE_%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D0%B0&amp;diff=53523"/>
				<updated>2016-05-01T10:57:57Z</updated>
		
		<summary type="html">&lt;p&gt;Egormkn: /* Специализация алгоритма для генерации следующего сочетания */ Лишняя скобка в псевдокоде&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Алгоритм ==&lt;br /&gt;
{{Определение|definition= '''Получение следующего объекта''' {{---}} это нахождение объекта, следующего за данным в [[Лексикографический порядок|лексикографическом порядке]].&lt;br /&gt;
}}&lt;br /&gt;
Объект &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt; называется следующим за &amp;lt;tex&amp;gt;P&amp;lt;/tex&amp;gt;, если &amp;lt;tex&amp;gt;P &amp;lt; Q&amp;lt;/tex&amp;gt; и не найдется такого &amp;lt;tex&amp;gt;R&amp;lt;/tex&amp;gt;, что &amp;lt;tex&amp;gt;P &amp;lt; R &amp;lt; Q&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Отсюда понятен алгоритм:&lt;br /&gt;
* находим суффикс минимальной длины, который можно изменить без изменения префикса текущего объекта &amp;lt;tex&amp;gt;P&amp;lt;/tex&amp;gt;,&lt;br /&gt;
* к оставшейся части дописываем минимальный возможный элемент (чтобы было выполнено правило &amp;lt;tex&amp;gt;P &amp;lt; Q&amp;lt;/tex&amp;gt;),&lt;br /&gt;
* дописываем минимальный возможный хвост.&lt;br /&gt;
По построению получаем, что &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt; {{---}} минимально возможный.&lt;br /&gt;
&lt;br /&gt;
== Специализация алгоритма для генерации следующего битового вектора ==&lt;br /&gt;
* Находим минимальный суффикс, в котором есть &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;, его можно увеличить, не меняя оставшейся части&lt;br /&gt;
* Вместо &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt; записываем &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt; &lt;br /&gt;
* Дописываем минимально возможный хвост из нулей&lt;br /&gt;
 '''int[]''' nextVector('''int[]''' a): &amp;lt;font color=green&amp;gt;// &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; {{---}} длина вектора&amp;lt;/font&amp;gt;&lt;br /&gt;
   '''while''' (n &amp;gt;= 0) '''and''' (a[n] != 0)&lt;br /&gt;
       a[n] = 0&lt;br /&gt;
       n--&lt;br /&gt;
   '''if''' n == -1&lt;br /&gt;
     '''return''' ''null''&lt;br /&gt;
   a[n] = 1&lt;br /&gt;
   '''return''' a&lt;br /&gt;
Приведённый алгоритм эквивалентен прибавлению единицы к битовому вектору. &lt;br /&gt;
=== Пример работы ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border = 1&lt;br /&gt;
|0||1||0||1||style=&amp;quot;background:#FFCC00&amp;quot;|1||исходный битовый вектор&lt;br /&gt;
|-&lt;br /&gt;
| || || || ||^|| начинаем идти с конца&lt;br /&gt;
|-&lt;br /&gt;
|0||1||0||style=&amp;quot;background:#FFCC00&amp;quot;|0||style=&amp;quot;background:#FFCC00&amp;quot;|0|| пока элементы равны 1, заменяем их на 0&lt;br /&gt;
|-&lt;br /&gt;
|0||1||style=&amp;quot;background:#FFCC00&amp;quot;|1||0||0|| меняем первый не удовлетворяющий условию цикла элемент на 1&lt;br /&gt;
|-&lt;br /&gt;
|'''0'''||'''1'''||'''1'''||'''0'''||'''0'''||следующий битовый вектор&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Специализация алгоритма для генерации следующей перестановки ==&lt;br /&gt;
* Двигаясь справа налево, находим элемент, нарушающий убывающую последовательность (в обычном порядке, слева направо, см. пример)&lt;br /&gt;
* Меняем его с минимальным элементом, большим нашего, стоящим правее&lt;br /&gt;
* Перевернем правую часть&lt;br /&gt;
&lt;br /&gt;
 '''int[]''' nextPermutation('''int[]''' a): &amp;lt;font color=green&amp;gt;// &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; {{---}} длина перестановки&amp;lt;/font&amp;gt;&lt;br /&gt;
   '''for''' i = n - 2 '''downto''' 0&lt;br /&gt;
     '''if''' a[i] &amp;lt; a[i + 1]&lt;br /&gt;
       min = i + 1;&lt;br /&gt;
       '''for''' j = i + 1 '''to''' n - 1&lt;br /&gt;
         '''if''' (a[j] &amp;lt; a[min]) '''and''' (a[j] &amp;gt; a[i])&lt;br /&gt;
           min = j&lt;br /&gt;
       swap(a[i], a[min])&lt;br /&gt;
       reverse(a, i + 1, n - 1)&lt;br /&gt;
       '''return''' a&lt;br /&gt;
   '''return''' ''null'' &lt;br /&gt;
&lt;br /&gt;
=== Пример работы ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border = 1&lt;br /&gt;
|1||3||style=&amp;quot;background:#FFCC00&amp;quot;|2||5||style=&amp;quot;background:#FFCC00&amp;quot;|4||исходная перестановка&lt;br /&gt;
|-&lt;br /&gt;
| || ||^|| || ||находим элемент, нарушающий убывающую последовательность&lt;br /&gt;
|-&lt;br /&gt;
| || || || ||^||минимальный элемент больше нашего&lt;br /&gt;
|-&lt;br /&gt;
|1||3||style=&amp;quot;background:#FFCC00&amp;quot;|4||5||style=&amp;quot;background:#FFCC00&amp;quot;|2||меняем их местами&lt;br /&gt;
|-&lt;br /&gt;
|1||3||4||style=&amp;quot;background:#FFCC00&amp;quot;|2||style=&amp;quot;background:#FFCC00&amp;quot;|5||разворачивам правую часть&lt;br /&gt;
|-&lt;br /&gt;
|'''1'''||'''3'''||'''4'''||'''2'''||'''5'''||следующая перестановка&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Специализация алгоритма для генерации следующей мультиперестановки ==&lt;br /&gt;
* Двигаясь справа налево, находим элемент, нарушающий убывающую последовательность (в обычном порядке, слева направо, см. пример).&lt;br /&gt;
* Меняем его с минимальным элементом, большим нашего, стоящим правее.&lt;br /&gt;
* Переворачиваем правую часть.&lt;br /&gt;
 '''int[]''' nextMultiperm('''int[]''' b):  &amp;lt;font color=green&amp;gt;// &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; {{---}} длина мультиперестановки&amp;lt;/font&amp;gt;&lt;br /&gt;
     i = n - 2&lt;br /&gt;
     '''while''' (i &amp;gt;= 0) '''and''' (b[i] &amp;gt;= b[i + 1]) &lt;br /&gt;
       i--&lt;br /&gt;
     '''if''' i &amp;gt;= 0 &lt;br /&gt;
       j = i + 1&lt;br /&gt;
       '''while''' (j &amp;lt; n - 1) '''and''' (b[j + 1] &amp;gt; b[i]) &lt;br /&gt;
         j++&lt;br /&gt;
       swap(b[i] , b[j])&lt;br /&gt;
       reverse(b, i + 1, n - 1)&lt;br /&gt;
       '''return''' b&lt;br /&gt;
     '''else'''&lt;br /&gt;
       '''return''' ''null''&lt;br /&gt;
&lt;br /&gt;
=== Пример работы ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border = 1&lt;br /&gt;
|1||2||3||1||style=&amp;quot;background:#FFCC00&amp;quot;|2||style=&amp;quot;background:#FFCC00&amp;quot;|3||Исходная перестановка.&lt;br /&gt;
|-&lt;br /&gt;
| || || || ||^|| ||Находим элемент, нарушающий убывающую последовательность.&lt;br /&gt;
|-&lt;br /&gt;
| || || || || ||^||Минимальный элемент больше нашего.&lt;br /&gt;
|-&lt;br /&gt;
|1||2||3||1||style=&amp;quot;background:#FFCC00&amp;quot;|3||style=&amp;quot;background:#FFCC00&amp;quot;|2||Меняем их местами.&lt;br /&gt;
|-&lt;br /&gt;
|'''1'''||'''2'''||'''3'''||'''1'''||'''3'''||'''2'''||Следующая мультиперестановка.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Специализация алгоритма для генерации следующего сочетания ==&lt;br /&gt;
&lt;br /&gt;
* Добавим в конец массива с сочетанием &amp;lt;tex&amp;gt;N+1&amp;lt;/tex&amp;gt; – максимальный элемент.&lt;br /&gt;
* Пойдём справа налево. Будем искать номер элемента, который отличается от предыдущего на &amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt;.&lt;br /&gt;
* Увеличим найденный элемент на &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;, и допишем в конец минимально возможный хвост, если такого элемента нет – на вход было дано последнее сочетание.&lt;br /&gt;
 '''int[]''' nextChoose('''int[]''' a, '''int''' n, '''int''' k): &amp;lt;font color=green&amp;gt;// &amp;lt;tex&amp;gt;n,k &amp;lt;/tex&amp;gt; {{---}} параметры сочетания&amp;lt;/font&amp;gt;&lt;br /&gt;
   '''for''' i = 0 '''to''' k - 1 &lt;br /&gt;
     b[i] = a[i]&lt;br /&gt;
   b[k] = n + 1&lt;br /&gt;
   i = k - 1&lt;br /&gt;
   '''while''' (i &amp;gt;= 0) '''and''' (b[i + 1] - b[i] &amp;lt; 2) &lt;br /&gt;
     i--&lt;br /&gt;
   '''if''' i &amp;gt;= 0 &lt;br /&gt;
      b[i]++&lt;br /&gt;
      '''for''' j = i + 1 '''to''' k - 1 &lt;br /&gt;
        b[j] = b[j - 1] + 1&lt;br /&gt;
      '''for''' i = 0 '''to''' k - 1 &lt;br /&gt;
        a[i] = b[i]&lt;br /&gt;
      '''return''' a&lt;br /&gt;
   '''else'''&lt;br /&gt;
     '''return''' ''null''&lt;br /&gt;
&lt;br /&gt;
=== Пример работы ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border = 1&lt;br /&gt;
|1||2||5||6||style=&amp;quot;background:#FFCC00&amp;quot;|'''7'''||Дописываем 7 в конец сочетания.&lt;br /&gt;
|-&lt;br /&gt;
|1||style=&amp;quot;background:#FFCC00&amp;quot;|2||5||6||'''7'''||&lt;br /&gt;
|-&lt;br /&gt;
| ||^|| || || ||Находим элемент i, a[i + 1] - a[ i ] &amp;gt;= 2&lt;br /&gt;
|-&lt;br /&gt;
|1||style=&amp;quot;background:#FFCC00&amp;quot;|3||5||6||'''7'''||Увеличиваем его на 1.&lt;br /&gt;
|-&lt;br /&gt;
|1||3||style=&amp;quot;background:#FFCC00&amp;quot;|4||style=&amp;quot;background:#FFCC00&amp;quot;|5||style=&amp;quot;background:#FFCC00&amp;quot;|'''6'''||Дописываем минимальный хвост.&lt;br /&gt;
|-&lt;br /&gt;
|'''1'''||'''3'''||'''4'''||'''5'''||''' '''||Следующее сочетание.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Специализация алгоритма для генерации следующего разбиения на слагаемые ==&lt;br /&gt;
Рассматриваемый алгоритм находит следующее [[комбинаторные объекты|разбиение на слагаемые]], при этом разбиение упорядоченно по возрастанию.&lt;br /&gt;
* Увеличим предпоследнее слагаемое на &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;, уменьшим последнее слагаемое на &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;.&lt;br /&gt;
** Если предпоследнее слагаемое стало больше последнего, то увеличиваем предпоследнее слагаемое на величину последнего.&lt;br /&gt;
** Если предпоследнее слагаемое меньше последнего, то разбиваем последнее слагаемое &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; на два слагаемых &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt; таких, что &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt; равно предпоследнему слагаемому, а &amp;lt;tex&amp;gt;b = s - a&amp;lt;/tex&amp;gt;. Повторяем этот процесс, пока разбиение остается корректным, то есть предпоследнее слагаемое хотя бы в два раза меньше последнего.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 &amp;lt;font color=green&amp;gt;// &amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt; {{---}} список, содержащий разбиение данного числа &amp;lt;tex&amp;gt;b.size&amp;lt;/tex&amp;gt;{{---}} его размер &amp;lt;/font&amp;gt;&lt;br /&gt;
 '''list&amp;lt;int&amp;gt;'''  nextPartition('''list&amp;lt;int&amp;gt;''' b): &lt;br /&gt;
    b[b.size - 1]--&lt;br /&gt;
    b[b.size - 2]++&lt;br /&gt;
    '''if''' b[b.size - 2] &amp;gt; b[b.size - 1] &lt;br /&gt;
       b[b.size - 2] += b[b.size - 1]&lt;br /&gt;
       b.remove(b.size - 1)&lt;br /&gt;
    '''else'''&lt;br /&gt;
      '''while''' b[b.size - 2] * 2 &amp;lt;= b[b.size - 1] &lt;br /&gt;
        b.add(b[b.size - 1] - b[b.size - 2])&lt;br /&gt;
        b[b.size - 2] = b[b.size - 3]&lt;br /&gt;
    '''return''' b&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Пример работы ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border = 1&lt;br /&gt;
|1||style=&amp;quot;background:#FFCC00&amp;quot;|1||style=&amp;quot;background:#FFCC00&amp;quot;|7|| || ||Прибавим 1 + 1, вычтем 7 - 1.&lt;br /&gt;
|-&lt;br /&gt;
|1||style=&amp;quot;background:#FFCC00&amp;quot;|2||style=&amp;quot;background:#FFCC00&amp;quot;|6|| || ||Проверяем: 2 &amp;lt; 6, значит разбиваем 6 пока оно не станет меньше 4&lt;br /&gt;
|-&lt;br /&gt;
|1||2||style=&amp;quot;background:#FFCC00&amp;quot;|2||style=&amp;quot;background:#FFCC00&amp;quot;|4|| ||&lt;br /&gt;
|-&lt;br /&gt;
|1||2||2||style=&amp;quot;background:#FFCC00&amp;quot;|2||style=&amp;quot;background:#FFCC00&amp;quot;|2||&lt;br /&gt;
|-&lt;br /&gt;
|'''1'''||'''2'''||'''2'''||'''2'''||'''2'''||Следующее разбиение на слагаемые числа 9.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border = 1&lt;br /&gt;
|1||style=&amp;quot;background:#FFCC00&amp;quot;|4||style=&amp;quot;background:#FFCC00&amp;quot;|5||Прибавим 4 + 1, вычтем 5 - 1.&lt;br /&gt;
|-&lt;br /&gt;
|1||style=&amp;quot;background:#FFCC00&amp;quot;|5||style=&amp;quot;background:#FFCC00&amp;quot;|4||Проверяем: 5 &amp;gt; 4, значит прибавим к 5 + 4.&lt;br /&gt;
|-&lt;br /&gt;
|1||9||style=&amp;quot;background:#FFCC00&amp;quot;|4||Удалим последний элемент.&lt;br /&gt;
|-&lt;br /&gt;
|'''1'''||'''9'''||||Следующее разбиение на слагаемые числа 10.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Специализация алгоритма для генерации следующего разбиения на подмножества ==&lt;br /&gt;
&lt;br /&gt;
Рассмотрим множество первых n натуральных чисел:&amp;lt;tex&amp;gt;N_n = \{1, 2, ..., n\}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Упорядочим все разбиения на множества &amp;lt;tex&amp;gt;N_n&amp;lt;/tex&amp;gt; лексикографически. Для этого, во-первых, в каждом разбиении упорядочим множества лексикографически. Будем говорить, что подмножество &amp;lt;tex&amp;gt; A \subset N_n &amp;lt;/tex&amp;gt; лексикографически меньше подмножества &amp;lt;tex&amp;gt; B \subset N_n &amp;lt;/tex&amp;gt; , если верно одно из следующих условий:&lt;br /&gt;
&lt;br /&gt;
*существует &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; такое, что &amp;lt;tex&amp;gt;i \in A&amp;lt;/tex&amp;gt; , &amp;lt;tex&amp;gt;i \notin B&amp;lt;/tex&amp;gt;, для всех &amp;lt;tex&amp;gt;j &amp;lt; i: j \in A&amp;lt;/tex&amp;gt; если и только если &amp;lt;tex&amp;gt;j \in B&amp;lt;/tex&amp;gt; , и существует &amp;lt;tex&amp;gt;k &amp;gt; i&amp;lt;/tex&amp;gt; такое что &amp;lt;tex&amp;gt;k \in B&amp;lt;/tex&amp;gt;;&lt;br /&gt;
* &amp;lt;tex&amp;gt; A \subset B &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;i &amp;lt; j&amp;lt;/tex&amp;gt; для всех &amp;lt;tex&amp;gt;i \in A&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;j \in B&amp;lt;/tex&amp;gt; \ &amp;lt;tex&amp;gt; A &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Разбиения упорядочены лексикографически следующим образом. Разбиение &amp;lt;tex&amp;gt;N_n = A_1 \cup A_2 \cup . . . \cup A_k&amp;lt;/tex&amp;gt; лексикографически меньше разбиения &amp;lt;tex&amp;gt;N_n = B_1 \cup B_2 \cup . . . \cup B_l&amp;lt;/tex&amp;gt; если существует такое &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;, что &amp;lt;tex&amp;gt;A_1 = B_1, A_2 = B_2, . . . ,A_{i - 1} = B_{i - 1}, A_i &amp;lt; B_i&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Рассмотрим алгоритм нахождения лексикографически следующего разбиения на подмножества:'''&lt;br /&gt;
*Будем хранить подмножества в списке списков, например, разбиение &amp;lt;tex&amp;gt; \{1, 2, 3\}~ \{4, 5\}&amp;lt;/tex&amp;gt; будет выглядеть так:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border = 1&lt;br /&gt;
|1||2||3&lt;br /&gt;
|-&lt;br /&gt;
|4||5|| &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* Двигаясь снизу вверх и справа налево, будем удалять элементы, записывая их в отдельный массив. Будем повторять эту операцию, пока не сможем выполнить одно из действий, описанных ниже:&lt;br /&gt;
** Заменить рассматриваемый элемент уже удаленным. Из всех подходящих элементов выбираем минимальный. '''Важное замечание''': мы не можем заменить первый элемент подмножества, мы можем только удалить его.&lt;br /&gt;
** Дополнить рассматриваемое подмножество уже удаленным элементом. Из всех подходящих элементов выбираем минимальный.&lt;br /&gt;
* Допишем лексикографически минимальный хвост подмножеств из оставшихся элементов.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 '''list&amp;lt;list&amp;lt;int&amp;gt;&amp;gt;''' nextSetPartition('''list&amp;lt;list&amp;lt;int&amp;gt;&amp;gt;''' a):&lt;br /&gt;
  &amp;lt;font color=green&amp;gt;// &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt; {{---}} список, содержащий подмножества&amp;lt;/font&amp;gt;&lt;br /&gt;
  &amp;lt;font color=green&amp;gt;// &amp;lt;tex&amp;gt;used&amp;lt;/tex&amp;gt; {{---}} список, в котором мы храним удаленные элементы&amp;lt;/font&amp;gt;&lt;br /&gt;
  used = '''list&amp;lt;int&amp;gt;'''&lt;br /&gt;
  fl = ''false''&lt;br /&gt;
  '''for''' i = a.size - 1 '''downto''' 0&lt;br /&gt;
      '''if''' (used.size != 0) '''and''' (used[used.size - 1] &amp;gt; a[i][a[i].size - 1])   &amp;lt;font color=green&amp;gt;// если можем добавить в конец подмножества элемент из &amp;lt;tex&amp;gt;used&amp;lt;/tex&amp;gt;&amp;lt;/font&amp;gt;&lt;br /&gt;
          a[i].add(used[used.size - 1])   &amp;lt;font color=green&amp;gt;//добавляем&amp;lt;/font&amp;gt;&lt;br /&gt;
          used.remove(used.size - 1)&lt;br /&gt;
          '''break'''&lt;br /&gt;
      '''for''' j = a[i].size - 1 '''downto''' 0&lt;br /&gt;
          '''if''' (used.size != 0) '''and''' (j != 0) '''and''' (used[used.size - 1] &amp;gt; a[i][j])    &amp;lt;font color=green&amp;gt;//если можем заменить элемент, другим элементом из списка &amp;lt;tex&amp;gt;used&amp;lt;/tex&amp;gt; &amp;lt;/font&amp;gt;&lt;br /&gt;
             a[i][j] = used[used.size - 1]   &amp;lt;font color=green&amp;gt;//заменяем&amp;lt;/font&amp;gt;&lt;br /&gt;
             fl = ''true''&lt;br /&gt;
             '''break'''&lt;br /&gt;
      '''if''' fl '''break'''&lt;br /&gt;
      used.add(a[i][j])   &amp;lt;font color=green&amp;gt;//добавляем в &amp;lt;tex&amp;gt;used&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt; элемент &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-го подмножества&amp;lt;/font&amp;gt; &lt;br /&gt;
      a[i].remove(j)   &amp;lt;font color=green&amp;gt;//удаляем &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt; элемент &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-го подмножества&amp;lt;/font&amp;gt;&lt;br /&gt;
  &amp;lt;font color=green&amp;gt;//далее выведем все получившиеся подмножества&amp;lt;/font&amp;gt;&lt;br /&gt;
  sort(used)&lt;br /&gt;
  '''for''' i = 0 '''to''' used.size - 1&lt;br /&gt;
     a.add('''list&amp;lt;int&amp;gt;'''(used[i]))   &amp;lt;font color=green&amp;gt;//добавляем лексикографически минимальных хвост&amp;lt;/font&amp;gt;&lt;br /&gt;
  '''return''' a&lt;br /&gt;
&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
=== Пример работы ===&lt;br /&gt;
&lt;br /&gt;
'''Рассмотрим следующее разбиение:'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border = 1&lt;br /&gt;
|1||2||3&lt;br /&gt;
|-&lt;br /&gt;
|4||5|| &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''1 Шаг:'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border = 1&lt;br /&gt;
|1||2||3||&lt;br /&gt;
|-&lt;br /&gt;
|4||style=&amp;quot;background:#FFCC00&amp;quot;|5||||&lt;br /&gt;
|-&lt;br /&gt;
| ||^|| ||Удалили элемент 5.&lt;br /&gt;
|-&lt;br /&gt;
| || || ||used&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''2 Шаг:'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border = 1&lt;br /&gt;
|1||2||3||&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background:#FFCC00&amp;quot;|4|| ||||&lt;br /&gt;
|-&lt;br /&gt;
|^|| || ||Удалили элемент 4. Так как он является первым в подмножестве, то мы не можем заменить его на другой.&lt;br /&gt;
|-&lt;br /&gt;
|5|| || ||used&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''3 Шаг:'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border = 1&lt;br /&gt;
|1||2||3||style=&amp;quot;background:#FFCC00&amp;quot;|4||&lt;br /&gt;
|-&lt;br /&gt;
| || || ||^||Дополнили первое подмножество элементом 4&lt;br /&gt;
|-&lt;br /&gt;
|5|| || || ||used&lt;br /&gt;
|}  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''4 Шаг:''' &lt;br /&gt;
     &lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border = 1&lt;br /&gt;
|1||2||3||4||&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background:#FFCC00&amp;quot;|5|| || || ||Дописали лексикографически минимальный хвост&lt;br /&gt;
|-&lt;br /&gt;
| || || || ||used&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== См.также ==&lt;br /&gt;
* [[Получение предыдущего объекта]]&lt;br /&gt;
* [[Получение объекта по номеру]]&lt;br /&gt;
* [[Получение номера по объекту]]&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
&lt;br /&gt;
* [http://rain.ifmo.ru/cat/view.php/vis/combinations/permutations-2000 Визуализатор перестановок]&lt;br /&gt;
* [http://cppalgo.blogspot.com/2011/02/episode-2.html Пример компактного кода для перестановок (С++)]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Комбинаторика]]&lt;/div&gt;</summary>
		<author><name>Egormkn</name></author>	</entry>

	</feed>