2015-11-05 2 views
1

Я разрабатываю приложение для Android, которое использует данные датчиков с телефона для классификации действий. Я также очень люблю scikit-учиться в любой из библиотек обучения Java-машин. Поэтому я создал очень минимальный REST api, используя Django и scikit, которые учатся тренировать данные датчиков с использованием машин поддержки векторов и возвращать информацию о модели.Использование обученных scikit-learn svm-классификаторов в Android

Мой вопрос: как я могу использовать модель scikit-learn, которая производит на моем телефоне, чтобы делать прогнозы? До сих пор я рассматривал возможность расширения api, чтобы всякий раз, когда телефон хочет сделать прогноз, он отправляет данные в api, чтобы получить его. Но я бы скорее смог написать некоторый Java-код или использовать библиотеку Java для прогнозирования. Отправка данных для обучения в api не является проблемой, поскольку это не выполняется в режиме реального времени - это делается только тогда, когда данные уже собраны. Однако отправка данных для предсказаний в реальном времени не представляется выполнимой.

Выполнение этого с помощью логистической регрессии намного проще, поскольку формулы прогнозирования и параметры модели довольно просты; Я мог бы отказаться от svms и использовать это вместо этого, но я также хотел бы иметь svms.

Кто-нибудь знает, кто-то делает это раньше? Есть ли способ сделать это в режиме «короткое время» по-кто-то-без-PhD-in-numerical-computing-or-machine? Подробные шаги не нужны, просто схема использования компонентов svm, которые производит scikit-learn.

+0

Я предполагаю, что вы это видели: http://stackoverflow.com/questions/15625359/support-vector-machine-for-java –

ответ

4

Большинство пакетов с SVM (scikit-learn too) полагаются на реализацию libsvm. Но вам не нужно 99% кода из libsvm, и вам не нужно быть PhD, потому что у вас уже есть все параметры после обучения внутри scikit-learn. Все, что вам нужно - любая простая библиотека линейной алгебры (только для векторной векторной операции) в java для реализации функции решения.

Если вы используете линейное ядро ​​в SVC - это относительно просто, потому что scikit-learn автоматически преобразует все эти сложные двойные коэффициенты и поддерживает векторы в простые гиперплоские коэффициенты, поэтому функция принятия решений становится эквивалентной логистической регрессии, все, что вам нужно здесь - dot product - смотрите здесь Exporting SVM classifiers from sklearn to Java codebase

В случае с нелинейным ядром - нужна только функция принятия решения, но теперь вам нужно понять, что такое векторы поддержки, что такое двойные коэффициенты, что такое ядро, и вам нужно реализовать свое нелинейное ядро ​​в java. Я думаю, что это простая задача для выполнения функции решения для нелинейного SVC не без понимания того, как работает процесс оптимизации SVC, я дам вам несколько ссылок:

  1. Layout of SVC attributes
  2. Decision Function
  3. Where all these dual coefficients and support vectors come from

Или вы можете просто найти любую библиотеку SVM для Java и изучить модель с теми же параметрами, которые вы выбираете в SVC (C, eps и т. Д.). Я думаю, что это самое простое решение для нелинейных ядер. SVM - хорошо известный метод, и я думаю, что обучение с одинаковыми параметрами и набором данных даст одинаковые результаты для любой хорошей реализации (кроме того, что большинство реализаций и привязок, как я уже сказал, полагаются на libsvm, в этом случае гарантируется равенство).

+0

Спасибо, это помогает. –

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