[ЗАСТАВКА] Пока ансамбли решающих деревьев не набрали своей популярности, очень часто люди использовали SVM даже в тех задачах, где разделяющая поверхность была совсем не похожа на линейную. Это получалось делать с помощью ядер. В основе лежит очень простая и очень красивая идея: если в каком-то исходном пространстве признаков классы не являются линейно разделимыми, то может быть можно отобразить это пространство признаков в какое-то новое, в котором классы будут линейно разделимы. Но если подумать, нам даже необязательно делать это отображение явно, потому что в SVM везде фигурирует только скалярное произведение вектора весов на вектор признаков. Отсюда возникает мысль — давайте вместо этого скалярного произведения использовать какую-нибудь другую, возможно, нелинейную симметричную функцию и таким образом получать нелинейную разделяющую поверхность. Эта идея называется в англоязычной литературе kernel trick. Давайте посмотрим на некоторые наиболее частые примеры ядер. Ну во-первых, можно взять линейное ядро, которое просто совпадает со скалярным произведением. Случай может показаться тривиальным, но его не стоит выкидывать из рассмотрения, потому что в некоторых ситуациях линейное ядро — это самый лучший выбор, ну например, если вы решаете задачу, связанную с классификацией текстов. Очень часто это именно так. Другой пример — это полиномиальное ядро. Полиномиальное ядро отображает исходное пространство признаков в пространство, в котором добавляются разные произведения признаков и степени признаков, и таким образом позволяет разделять классы, которые не были линейно разделимы в исходной выборке. И другое часто используемое ядро — это радиальное ядро. Как вы видите, оно понятным образом выражается через евклидово расстояние, поэтому наследует все проблемы метрических алгоритмов. Оно будет подвержено в некоторой степени проклятию размерности, в том числе поэтому не очень хорошая идея использовать радиальное ядро, например, на текстах, где признаков действительно очень-очень много. Но так или иначе, оно позволяет строить очень сложные границы классов, потому что если задуматься о том, в какое пространство здесь происходит отображение, можно сообразить, что пространство получается бесконечно мерным. Ну чтобы получить какое-то интуитивное доказательство этого факта, можно, например, расписать экспоненту в бесконечный ряд. SVM реализован в различных библиотеках, и в различных библиотеках есть поддержка ядер или неподдержка, ну то есть только линейное ядро. Например, в библиотеке LibSVM можно выбирать ядра, а в библиотеке LibLinear действительно только линейное ядро. Но это сделано осмысленно, именно для того чтобы этот конкретный случай с линейным ядром хорошо оптимизировать. Поэтому если вам на практике потребуется применить SVM с линейным ядром, лучше использовать LibLinear, а не LibSVM с указанием, что ядро должно быть линейным. В Scikit-learn мы видим просто обертку над LibSVM и LibLinear. Поэтому если вы хотите решить задачу с линейным ядром, опять-таки лучше использовать не SVC с линейным ядром, а LinearSVC. Также SVM можно найти в библиотеке Vowpal Wabbit, в которой по факту реализованы просто различные линейные классификаторы, и разумеется, там SVM только с линейным ядром, и представлен он просто в виде линейного классификатора с какой-то функцией потерь и каким-то регуляризатором. Ну то есть с функцией потерь hinge loss, ну или кусочно-линейной функцией потерь, и L2-регуляризатором. Итак, мы познакомились с вами с ядрами. Ядра до какого-то времени очень часто использовались в SVM. Также мы с вами рассмотрели линейное, полиномиальное и радиальное ядро и обсудили библиотеки, в которых SVM реализованы.