<?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=46.159.23.23&amp;*</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=46.159.23.23&amp;*"/>
		<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/46.159.23.23"/>
		<updated>2026-05-11T22:57:57Z</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=71984</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=71984"/>
				<updated>2019-12-12T10:06:44Z</updated>
		
		<summary type="html">&lt;p&gt;46.159.23.23: нет такого понятия &amp;quot;наиболее оптимальный&amp;quot;. Оптимальный - это и так самый лучший.&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;
===Пример на языке Java===&lt;br /&gt;
Пример классификации с применением &amp;lt;code&amp;gt;smile.classification.SVM&amp;lt;/code&amp;gt;&amp;lt;ref&amp;gt;[https://haifengl.github.io/smile/api/java/smile/classification/SVM.html/ Smile, SVM]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;Maven&amp;lt;/code&amp;gt; зависимость:&lt;br /&gt;
  &amp;lt;dependency&amp;gt;&lt;br /&gt;
    &amp;lt;groupId&amp;gt;com.github.haifengl&amp;lt;/groupId&amp;gt;&lt;br /&gt;
    &amp;lt;artifactId&amp;gt;smile-core&amp;lt;/artifactId&amp;gt;&lt;br /&gt;
    &amp;lt;version&amp;gt;1.5.2&amp;lt;/version&amp;gt;&lt;br /&gt;
  &amp;lt;/dependency&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  '''import''' smile.classification.SVM;&lt;br /&gt;
  '''import''' smile.data.NominalAttribute;&lt;br /&gt;
  '''import''' smile.data.parser.DelimitedTextParser;&lt;br /&gt;
  '''import''' smile.math.kernel.GaussianKernel;&lt;br /&gt;
  '''import''' java.util.Arrays;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;// read train &amp;amp; test dataset&amp;lt;/font&amp;gt;&lt;br /&gt;
  '''var''' parser = new DelimitedTextParser();&lt;br /&gt;
  parser.setResponseIndex(new NominalAttribute(&amp;quot;class&amp;quot;), 0);&lt;br /&gt;
  '''var''' train   = parser.parse(&amp;quot;USPS Train&amp;quot;, this.getClass().getResourceAsStream(&amp;quot;/smile/data/usps/zip.train&amp;quot;));&lt;br /&gt;
  '''var''' test    = parser.parse(&amp;quot;USPS Test&amp;quot;, this.getClass().getResourceAsStream(&amp;quot;/smile/data/usps/zip.test&amp;quot;));&lt;br /&gt;
  '''var''' classes = Arrays.stream(test.labels()).max().orElse(0) + 1;&lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;// build SVM classifier&amp;lt;/font&amp;gt;&lt;br /&gt;
  '''var''' svm     = new SVM&amp;lt;&amp;gt;(new GaussianKernel(8.0), 5.0, classes, SVM.Multiclass.ONE_VS_ONE);&lt;br /&gt;
  svm.learn(train.x(), train.labels());&lt;br /&gt;
  svm.finish();&lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;// calculate test error rate&amp;lt;/font&amp;gt;&lt;br /&gt;
  '''var''' error = 0;&lt;br /&gt;
  for (int i = 0; i &amp;lt; test.x().length; i++) {&lt;br /&gt;
   if (svm.predict(test.x()[i]) != test.labels()[i]) {&lt;br /&gt;
     error++;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  System.out.format(&amp;quot;USPS error rate = %.2f%%\n&amp;quot;, 100.0 * error / test.x().length);&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>46.159.23.23</name></author>	</entry>

	</feed>