Проектирование ядра для машины опорных векторов (XOR) - PullRequest
20 голосов
/ 14 мая 2011

Суть моего вопроса в том, "как спроектировать функцию ядра для задачи обучения?"

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

Вероятно, самый простой пример - это изучение XOR, наименьшего (4 балла) набора нелинейных данных, встроенного в реальную плоскость.,Как создать естественное (и нетривиальное) ядро ​​для линейного разделения этих данных?

Как более сложный пример (см. Cristianini, Введение в SVM, рис. 6.2), как можно спроектировать ядро ​​для изучения шаблона шахматной доски?Кристианини заявляет, что картина была получена «с использованием гауссовых ядер», но, похоже, он использует несколько, и они комбинируются и изменяются неопределенным образом.

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

Ответы [ 4 ]

8 голосов
/ 14 мая 2011

В: «Как спроектировать функцию ядра для задачи обучения?»

A: "Очень осторожно"

Попытка обычных подозреваемых (линейный, полиномиальный, RBF) и использование того, что работает лучше всего, - это хороший совет для тех, кто пытается получить наиболее точную прогнозную модель, какую только можно. Для чего это стоит, это общая критика SVM, что у них, кажется, есть много параметров, которые вам нужно настроить опытным путем. Так что, по крайней мере, вы не одиноки.

Если вы действительно хотите спроектировать ядро ​​для конкретной проблемы, тогда вы правы, это проблема машинного обучения сама по себе. Это называется «проблема выбора модели». Я здесь не совсем эксперт, но лучшим источником понимания методов ядра для меня стала книга Расумуссена и Уильямса « Гауссовские процессы » (в свободном доступе онлайн), особенно главы 4 и 5. Мне жаль, что я не могу сказать намного больше, чем «прочитать эту огромную книгу, полную математики», но это сложная проблема, и они действительно хорошо ее объясняют.

6 голосов
/ 14 мая 2011

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

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

def RBF():
    return NP.exp(-gamma * NP.abs(x - y)**2)

, в котором гамма равно 1 / числу объектов (столбцы в наборе данных), а x, y - декартова пара.

(Радиальный базисный функциональный модуль также находится в scipy.interpolate.Rbf )

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

  • линейное ядро ​​

  • Полином

  • сигмовидной

1 голос
/ 26 октября 2017

Мой подход заключается в изучении данных: как бы я разделил точки в проблеме XOR?Когда я начал изучать ML в целом и SVM в частности, то, что я и сделал, взял задачу с игрушкой, нарисовал ее от руки и попытался разделить классы.

Когда я посмотрел на проблему XOR, первыеВ то время мне пришло в голову, что обе фиолетовые точки (внизу слева) имеют X и Y одного и того же знака, в одном случае отрицательный в одном положительном, тогда как обе зеленые точки имеют X и Y противоположных знаков.Следовательно, квадратичная сумма X и Y будет 0 (или очень мала с небольшим шумом в исходной задаче) для зеленых точек и 2 (или почти 2) для фиолетовых.Следовательно, добавление третьей координаты Z = np.sqrt(np.square(X + Y)) приятно разделит два набора:

3D before 3D after

На примечании стороны, Z не слишком отличается от формулировки rbf Дуга , если учесть, что np.sqrt(np.square(X + Y)) в сущности совпадает с np.abs(X + Y) в этом случае.

У меня нет доступа кБумага Кризитанини, но я бы тоже подошел к этой проблеме аналогичным образом, начиная с игрушечной версии (кстати, код шахматной доски , благодаря чему-либо, кроме doug ):

checkerboard

Возможная интуиция здесь заключается в том, что сумма индексов строк и столбцов для черных квадратов будет всегда четной, тогда как для белых квадратов будет всегда нечетной,поэтому добавление в качестве третьего измерения чего-то вроде (row_index + col_index) % 2 поможет в этой простой версии.В большом, более сложном наборе данных шахматной доски, как я нашел в Интернете:

Cristianini-like?

все не так просто, но, возможно, можно было бы каскаднокластеризация, чтобы найти средние координаты X и Y для 16 кластеров (возможно, с использованием кластеризация медоидов ), а затем применить версию «трюка с модулем ядра»?

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

* 1045Наконец, как написано в комментарии к ответу Дуга, я не нахожу ничего плохого в эмпирическом подходе , таком как его , изучающем производительность всех возможных ядер путем передачи их в поиск по сетке во вложенной перекрестной проверке с помощьюТот же алгоритм (SVC) и изменение только ядра.Вы можете добавить к этому подходу, построив соответствующие поля в преобразованных пространственных объектах: например, для rbf, используя уравнение, предложенное Дагом (и процедуру Себастьяна Рашки для построения областей решения - ячейка 13 здесь ).

ОБНОВЛЕНИЕ 27 октября / 17 В разговоре на моем слабом канале другой геофизик спросил меня о случае, когда ворота XOR имеют вид 0 и 1, а не -1 и 1.(последнее похоже на классическую проблему в разведочной геофизике, отсюда и мой первоначальный игрушечный пример).

Если бы я взялся за ворота XOR с 0 и 1, и не имел в своем распоряжении знания о rbfЯдро, в этом случае я бы тоже сидел и смотрел на проблему с точки зрения координат этих проблем и смотрел, смогу ли я придумать преобразование.

XOR_II

Мое первое наблюдение здесь состояло в том, что Os располагаются на линии x=y, X на линии x=-y, поэтому разница x-y будет 0 (или небольшим с небольшим шумом) в случае, +/- 1 в другом, соответственно.Абсолютное значение будет заботиться о знаке, следовательно, Z = np.abs(X-Y) будет работать.Что, кстати, очень похоже на Дуга rbf = np.exp(-gamma * np.abs(x - y)**2) (еще одна причина, чтобы поднять свой ответ);и на самом деле его rbf - более общее решение, работающее во всех случаях XOR.

0 голосов
/ 07 ноября 2012

Я ищу полиномиальную работу ядра на примерах и наткнулся на этот пост.Несколько вещей, которые могут помочь, если вы все еще ищете, - это инструментарий (http://www2.fml.tuebingen.mpg.de/raetsch/projects/shogun), который использует множественное изучение ядра, где вы можете выбрать широкий выбор методов ядра, а затем обучение выберет лучшее для проблемы, так что вы не

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

Надеюсь, это поможет вам или кому-либо еще читатьвокруг методов ядра.

...