PHP - очень популярный язык, и когда что-то становится очень популярным, обычно бывает, что кто-то выходит и просто говорит: «Это не круто», и это нормально, это случается. Я читал много статей, в которых говорилось, что «PHP не годится для машинного обучения» или говорится: «Просто перейди на язык X, чтобы выполнить это, он будет работать лучше» (я не собираюсь зацикливаться на другом языке, просто говорю о случайных вещах в Интернете. ).
Я любитель PHP, я не скрою, я пробовал разные языки, фреймворки, разрабатывал нативные приложения, я люблю пробовать что-то новое, но я также люблю PHP. Но иногда меня сдерживает тот факт, что в экосистеме PHP отсутствуют некоторые чрезвычайно интересные функции, такие как мощные библиотеки машинного обучения.
В последний раз это случилось во время написания моей кандидатской диссертации. Моя диссертация была на тему «Локализация в помещении»: мне нужно было изучить различные методы, очертить возможный подход к выполнению локализации и, наконец, мне пришлось создать экспериментальную систему, состоящую из веб-интерфейса для выполнения локализации и клиента для использования. Это.
Для изучения внутренней локализации я получил много статей от IEEE Explore благодаря доступу в университет, изучил различные подходы и, наконец, выбрал комбинацию техник для подхода к моей локализации, но это не цель данной статьи.
И какое это имеет отношение к PHP и машинному обучению? Что ж, любопытно, что все тесты, которые я проводил, чтобы узнать, как работает SVM, были на python, потому что инженер, помогавший мне с моей разработкой, имел опыт работы с Python , но мне пришлось написать веб-приложение, и этот инженер не имел практического опыта в написании бэкендов, поэтому у меня возникла идея, я поискал в Google PHP svm, и первым результатом было SVM - Manual - PHP »с PHP.net документация.
Ext-svm: что и зачем
И тут появятся критики, PHP только что приблизился к машинному обучению, другие языки имеют его годами, и почему я должен его выбирать? Это просто, потому что ext-svm - это просто оболочка для библиотеки libSVM (проверьте libsvm на Github), написанной на C ++, это означает, что каждый раз, когда вы хотите выполнить операцию SVM с помощью PHP, она будет выполняться на более низком уровне, и результаты будут переданы в PHP благодаря интерфейсу ext-svm.
LibSVM - это эффективный инструмент для решения проблем классификации и регрессии SVM. Расширение svm превращает это в интерфейс PHP для облегчения использования в сценариях PHP. Начиная с версии 0.2.0 для расширения требуется PHP 7.0 или выше.
Для меня это было круто! Это было все, что мне нужно для перехода от Python (разработчики python, пожалуйста, не ненавидьте меня), о котором я не знал так много, к PHP, с которым я более опытен.
Установка ext-svm
Во-первых, расширение доступно на Pecl, это означает, что если у вас есть доступ к командной строке с правами администратора, вы можете просто
pecl install svm
Обратите внимание, что ext-svm в настоящее время находится в бета-версии, поэтому, если у вас возникли проблемы с pecl, чтобы установить его любым способом, вы можете просто:
pecl install svm-beta
Результат будет примерно таким:
downloading svm-0.2.3.tgz ... Starting to download svm-0.2.3.tgz (130,776 bytes) .............................done: 130,776 bytes 7 source files, building [... skipping the whole output ...] Build process completed successfully Installing '/usr/lib/php/20190902/svm.so' install ok: channel://pecl.php.net/svm-0.2.3 Extension svm enabled in php.ini
Если вы хотите проверить, правильно ли установлено расширение, просто запустите:
$ php -m | grep svm svm
Расширение установлено, и вы готовы к работе!
Создайте свой первый классификатор
Чтобы создать наш первый классификатор, мы просто остановимся на примере документации и проверим, работает ли он. Наш классификатор будет обучаться на основе массива, и мы проверим, может ли он предсказать значение на основе обучающего набора данных.
<?php $data = array( array(-1, 1 => 0.43, 3 => 0.12, 9284 => 0.2), array(1, 1 => 0.22, 5 => 0.01, 94 => 0.11), ); $svm = new SVM(); $model = $svm->train($data); $data = array(1 => 0.43, 3 => 0.12, 9284 => 0.2); $result = $model->predict($data); echo $result;
Если вы сохраните этот файл, а затем запустите его через консоль или поместите его на веб-сервер и получите к нему доступ, результат должен быть -1
. Почему?
Давайте разберем наш код, чтобы понять, как он работает. В первых двух строках мы нашли наш массив массивов, представляющих данные
$data = array( array(-1, 1 => 0.43, 3 => 0.12, 9284 => 0.2), array(1, 1 => 0.22, 5 => 0.01, 94 => 0.11), );
Если вы сосредоточитесь на внутреннем массиве, каждую строку можно разделить на две части: результат и функции для обучения. Первое значение массива (с индексом 0) - это результат классификации, за которым следуют характеристики, поэтому для array(-1, 1 => 0.43, 3 => 0.12, 9284 => 0.2)
результатом классификации будет -1
, а следующие значения, сгруппированные как пары ключ / значение, являются характеристиками.
Позже мы используем SVM:
$svm = new SVM();
Экземпляр SVM можно настроить, вызвав setOptions
, например, вы можете изменить ядро перед обучением:
$svm->setOptions([ SVM::OPT_KERNEL_TYPE => SVM::KERNEL_SIGMOID ]);
Постоянные значения для параметров настройки можно найти в Документации по классам SVM на php.net.
Теперь, когда наша SVM готова, мы можем обучить модель:
$model = $svm->train($data);
Эта строка выводит SVMModel, которую мы можем использовать для прогнозов. Если у вас очень большая модель, вы можете просто сохранить ее в файл с помощью save(string $filename)
и перезагрузить из файловой системы с помощью load(string $filename)
следующим образом:
$model->save('model.svm'); // later... somewhere in the code $model->load('model.svm');
Обратите внимание: save
и load
вернут логическое значение, вы можете проверить его или отбросить, выбор за вами!
Последние три строки - это тестовый код:
$data = array(1 => 0.43, 3 => 0.12, 9284 => 0.2); $result = $model->predict($data); echo $result;
Вы берете характеристики, которые вы измерили, и хотите сравнить их с моделью, и помещаете их в массив, в этом коде массив называется $data
. Эти функции будут обрабатываться из SVM с использованием обучающего набора.
Когда наши данные будут готовы, мы можем вызвать predict
, чтобы классифицировать данные, переданные как входные, и получить выходные данные с плавающей запятой, соответствующие прогнозу. Наконец, мы можем повторить его или использовать где-нибудь еще.
Создан, обучен, спрогнозирован
Теперь в вашей системе установлено расширение PHP SVM, вы можете обучать модель, сохранять ее, перезагружать и делать прогнозы, теперь все зависит от вас!