2012-03-17 5 views
5

Мне нужно подготовить модель поддержки Vector Machine, и я бы хотел использовать нестандартную матрицу ядра, а не предустановленные (например, RBF, Poly, ecc.). Как я могу это сделать (если это возможно) с библиотекой обучения авторизованного языка opencv?Создайте собственную матрицу ядра svm с opencv

Спасибо!

ответ

6

AFAICT, пользовательские ядра для SVM не поддерживаются непосредственно в OpenCV. Похоже, что LIBSVM, которая является базовой библиотекой, которую использует OpenCV для этого, не обеспечивает особо простого способа определения пользовательских ядер. Таким образом, многие из оберток, которые используют LIBSVM, также не предоставляют этого. Кажется, что есть несколько, например. scikit for python: scikit example of SVM with custom kernel

Вы также можете взглянуть на совершенно другую библиотеку, такую ​​как SVMlight. Он напрямую поддерживает пользовательские ядра. Также взгляните на this SO question. В ответах есть несколько библиотек SVM, а также краткие обзоры.

Если у вас есть веские причины оставаться в пределах OpenCV, вы можете выполнить его, используя тип ядра CvSVM::LINEAR и применяя свое настраиваемое ядро ​​к данным перед обучением SVM. Я немного неясен в отношении того, будет ли это направление плодотворным, поэтому я надеюсь, что кто-то, у кого больше опыта работы с SVM, может прослушивать и комментировать. Если это можно использовать «предварительно вычислившее ядро», выбрав «linear» в качестве вашего ядра, а затем взгляните на this answer, чтобы узнать больше о том, как действовать.

Вы также можете рассмотреть возможность включения LIBSVM и вызов его напрямую, без использования OpenCV. См. FAQ #418 for LIBSVM, в котором кратко говорится о том, как делать пользовательские ядра:

Вопрос: Я хотел бы использовать свое собственное ядро. Любой пример? В svm.cpp существуют две подпрограммы для оценки ядра: k_function() и kernel_function(). Какой я должен изменить?

Примером является «LIBSVM для строковых данных» в LIBSVM Tools.

Причина, по которой мы имеем две функции, состоит в следующем. Для ядра RBF exp (-g | xi - xj |^2), если мы сначала вычисляем xi-xj, а затем квадрат нормы, выполняются 3n операции. Таким образом, мы рассматриваем ехр (-g (| xi |^2 - 2dot (xi, xj) + | xj |^2)) и, вычисляя все | xi |^2 в начале, число операций сводится к 2n. Это для обучения. Для прогнозирования мы не можем этого сделать, поэтому необходима регулярная подпрограмма с использованием этих 3n операций. Самый простой способ иметь собственное ядро ​​- поместить тот же код в эти две подпрограммы, заменив любое ядро.

Этот последний вариант звучит немного больно. Я бы рекомендовал scikit или SVMlight. Удачи тебе!

+0

Большое спасибо за этот полный ответ! Кстати, я думаю, что буду использовать непосредственно LibSVM ... Кажется, нет возможности использовать предварительно скомпилированное ядро ​​с OpenCV :( –

2

Если вы не состоите в браке с OpenCV для материалов SVM, посмотрите на the shogun toolbox ... много вуду SVM там.

+0

Shogun выглядит красиво. Спасибо за обмен! – justis

Смежные вопросы