Я обучил кучу SVM RBF, используя scikits.learn на Python, а затем обработал результаты. Они предназначены для задач обработки изображений, и одна вещь, которую я хочу сделать для тестирования, - это запустить каждый классификатор на каждом пикселе некоторых тестовых изображений. То есть извлеките вектор признаков из окна с центром в пикселе (i, j), запустите каждый классификатор на этом векторе признаков, а затем перейдите к следующему пикселю и повторите. Это слишком медленно для Python.
Уточнение: Когда я говорю «это слишком медленно ...», я имею в виду, что даже внутренний код Libsvm, который использует scikits.learn, слишком медленный. На самом деле я пишу функцию принятия решения вручную для графического процессора, поэтому классификация для каждого пикселя происходит параллельно.
Могу ли я загрузить классификаторы с помощью Pickle, а затем получить какой-то атрибут, описывающий, как вычисляется решение из вектора признаков, а затем передать эту информацию в свой собственный код на C? В случае линейных SVM я мог бы просто извлечь вектор весов и вектор смещения и добавить их в качестве входных данных в функцию C. Но что эквивалентно делать для классификаторов RBF и как получить эту информацию из объекта scikits.learn?
Добавлено: Первые попытки решения.
Похоже, что у объекта классификатора есть атрибут support_vectors_
, который содержит опорные векторы в каждой строке массива. Существует также атрибут dual_coef_
, который представляет собой массив коэффициентов 1 на len (support_vectors _)
. Из стандартных руководств по нелинейным SVM следует сделать следующее:
v
из тестируемой точки данных. Это будет вектор той же длины, что и строки support_vectors_
. i
в support_vectors_
вычислите квадрат евклидова расстояния d [i]
между этим опорным вектором и v
. t [i]
как gamma * exp {-d [i]}
, где gamma
- параметр RBF. dual_coef_ [i] * t [i]
по всем i
. Добавьте к этой сумме значение атрибута intercept_
классификатора scikits.learn. Добавлено: На пронумерованной странице 9 по этой ссылке на документацию упоминается, что действительно intercept_ Атрибут
классификатора содержит член смещения. Я обновил приведенные выше шаги, чтобы отразить это.