Это делается путем применения того, что известно как [Уловка ядра] (http://en.wikipedia.org/wiki/Kernel_trick)). Что в основном делается, так это то, что если что-то не является линейно разделяемым в существующем пространстве ввода (в вашем случае это 2-D),оно проецируется в более высокое измерение, где это было бы разделимо. Функция ядра (может быть нелинейной) применяется для изменения вашего пространственного объекта. Все вычисления затем выполняются в этом пространственном объекте (который также может быть бесконечного размера).
Каждая точка в вашем входе преобразуется с помощью этой функции ядра, и все дальнейшие вычисления выполняются так, как если бы это было ваше исходное пространство ввода. Таким образом, ваши точки могут быть разделены в более высоком измерении (возможно, бесконечном) итаким образом, линейная гиперплоскость в более высоких измерениях может не быть линейной в исходных измерениях.
Для простого примера рассмотрим пример XOR. Если вы нанесите Input1 по оси X и Input2 по оси Y, тоВыходные классы будут:
- Класс 0: (0,0), (1,1)
- Class 1: (0,1), (1,0)
Как вы можете заметить, это не линейно разделимо в 2-D.Но если я возьму эти упорядоченные пары в 3-D, (просто переместив 1 точку в 3-D), скажем:
- Класс 0: (0,0,1), (1,1,0)
- Класс 1: (0,1,0), (1,0,0)
Теперь вы можете легко заметить, что в 3D есть плоскость дляразделите эти два класса линейно.
Таким образом, если вы проецируете свои входные данные в достаточно большое измерение (возможно, бесконечное), то вы сможете линейно разделить ваши классы в этом измерении.
OneЗдесь важно отметить (и, возможно, я отвечу и на другой ваш вопрос), что вам не нужно делать функцию ядра самостоятельно (как я сделал выше).Хорошо, что функция ядра автоматически позаботится о вашем вводе и выяснит, как его «линеаризовать».