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, вы можете обучать модель, сохранять ее, перезагружать и делать прогнозы, теперь все зависит от вас!

Получите доступ к экспертному обзору - Подпишитесь на DDI Intel