Подтвердить что ты не робот

Проектирование ядра для векторной машины поддержки (XOR)

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

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

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

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

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

4b9b3361

Ответ 1

Q: "Как создать функцию ядра для проблемы обучения?"

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

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

Если вы действительно хотите создать ядро ​​для конкретной проблемы, тогда вы правы, это проблема машинного обучения сама по себе. Он назывался "проблемой выбора модели". Я не совсем эксперт здесь, но лучшим источником понимания методов ядра для меня была книга " Gaussian Processes от Rasumussen и Уильямс (он свободно доступен онлайн), в особенности главы 4 и 5. Мне жаль, что я не могу сказать гораздо больше, чем" прочитать эту огромную книгу, полную математики", но это сложная проблема, и они действительно хорошо объясняют он.

Ответ 2

(Для тех, кто не знаком с использованием функций ядра в Machine Learning, ядра просто сопоставляют входные векторы (точки данных, которые составляют набор данных), в более высокоразмерное пространство, например, "Feature Space". затем находит разделительную гиперплоскость с максимальным запасом (расстояние между гиперплоскостью и опорными векторами) в этом преобразованном пространстве.)

Ну, начните с ядер, которые, как известно, работают с классификаторами 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):

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

  • Полином

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

Ответ 3

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

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

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

Ответ 4

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

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

3D before 3D after

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

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

checkerboard

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

Cristianini-like?

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

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

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

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

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

XOR_II

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