Как извлечь информацию из scikits.изучите классификатор, чтобы затем использовать в коде C

StackOverflow https://stackoverflow.com/questions/8360253

Вопрос

Я обучил кучу RBF SVM с помощью scikits.изучите 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.изучите классификатор для этой суммы.
  • Если сумма положительна, классифицируйте как 1.В противном случае классифицируйте как 0.

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

Это было полезно?

Решение

Да, ваше решение выглядит нормально.Чтобы передать необработанную память массива numpy непосредственно в программу на языке Си, вы можете использовать ctypes - помощники из numpy или оберните свою программу на C cython и вызовите ее напрямую, передав массив numpy (см. Документ по адресу http://cython.org для получения более подробной информации).

Однако я не уверен, что попытка ускорить предсказание на графическом процессоре - самый простой подход:известно, что машины опорных векторов ядра медленны во время прогнозирования, поскольку их сложность напрямую зависит от количества опорных векторов, которое может быть высоким для сильно нелинейных (мультимодальных) задач.

Альтернативные подходы, которые быстрее во время прогнозирования, включают нейронные сети (вероятно, более сложные или медленные для правильного обучения, чем SVM, которые имеют только 2 гиперпараметра C и gamma) или преобразование ваших данных с помощью нелинейного преобразования, основанного на расстояниях до прототипов + пороговое значение + максимальное объединение по областям изображения (только для классификации изображений).

Наконец, вы также можете попробовать использовать модели NuSVC, параметр регуляризации которых nu оказывает прямое влияние на количество опорных векторов в подобранной модели:меньшее количество опорных векторов означает более быстрое время прогнозирования (однако проверьте точность, в конечном итоге это будет компромисс между скоростью прогнозирования и точностью).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top