Как извлечь информацию из классификатора scikits.learn для последующего использования в коде C

Я обучил кучу 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.
  • Если сумма положительна, классифицируйте как 1. В противном случае классифицируйте как 0.

Добавлено: На пронумерованной странице 9 по этой ссылке на документацию упоминается, что действительно intercept_ Атрибут классификатора содержит член смещения. Я обновил приведенные выше шаги, чтобы отразить это.

8
задан ogrisel 24 June 2012 в 07:34
поделиться