Проектирование ядра для векторной машины поддержки (XOR)
Мясо моего вопроса: "Как создать функцию ядра для проблемы обучения?"
В качестве быстрого фона я читаю книги по машинам поддержки и машинам ядра, и везде, где я смотрю, авторы приводят примеры ядер (полиномиальные ядра как однородные, так и неоднородные, гауссовские ядра и аллюзии на текстовые ядра, чтобы назвать несколько), но все либо предоставляют изображения результатов без указания ядра, либо неопределенно утверждают, что "эффективное ядро может быть построено". Я заинтересован в процессе, который продолжается, когда вы разрабатываете ядро для новой проблемы.
Вероятно, самым простым примером является изучение XOR, наименьшего (4 балла) нелинейного набора данных, вложенного в реальную плоскость. Как бы вы придумали естественное (и нетривиальное) ядро для линейного разделения этих данных?
В качестве более сложного примера (см. Cristianini, Введение в SVM, рис. 6.2), как бы создать ядро для изучения шаблона шахматной доски? Кристианини утверждает, что картина была получена "с использованием гауссовых ядер", но кажется, что он использует несколько, и их объединяют и модифицируют неопределенным способом.
Если этот вопрос слишком широк, чтобы ответить здесь, я бы оценил ссылку на построение одной из таких функций ядра, хотя я бы предпочел, чтобы этот пример был несколько простым.
Ответы
Ответ 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 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.