PHP для машинного обучения: миф или реальность?
Многие разработчики привыкли считать, что машинное обучение — это прерогатива Python, R или Julia. Однако на практике PHP, несмотря на свою репутацию "веб-языка", тоже может быть использован для решения задач ML, особенно в контексте интеграции с существующими веб-приложениями. В этой статье мы разберем реальные возможности PHP в машинном обучении, покажем примеры кода с использованием популярных библиотек и честно расскажем об ограничениях.
Основные библиотеки для машинного обучения на PHP
Экосистема PHP для ML не так богата, как у Python, но несколько зрелых библиотек заслуживают внимания.
PHP-ML (php-ml/php-ml)
Это самая популярная библиотека для машинного обучения на PHP. Она предоставляет классические алгоритмы: классификацию, регрессию, кластеризацию, ассоциативные правила и даже нейронные сети.
require_once __DIR__ . '/vendor/autoload.php';
use Phpml\Classification\KNearestNeighbors;
use Phpml\Dataset\ArrayDataset;
use Phpml\Metric\Accuracy;
// Обучающие данные: [длина, ширина] -> метка (0 - кошка, 1 - собака)
$samples = [[1, 2], [2, 3], [3, 4], [5, 6], [6, 7], [7, 8]];
$labels = [0, 0, 0, 1, 1, 1];
$classifier = new KNearestNeighbors($k = 3);
$classifier->train($samples, $labels);
// Предсказание для нового образца
$prediction = $classifier->predict([4, 5]);
echo "Предсказанная метка: " . ($prediction == 0 ? "кошка" : "собака") . PHP_EOL;
// Оценка точности
$testSamples = [[2.5, 3.5], [6.5, 7.5]];
$testLabels = [0, 1];
$predictions = $classifier->predict($testSamples);
$accuracy = Accuracy::score($testLabels, $predictions);
echo "Точность: " . ($accuracy * 100) . "%" . PHP_EOL;
Rubix ML (rubix/ml)
Более современная и продвинутая библиотека с поддержкой глубокого обучения, нейронных сетей, ансамблевых методов и конвейеров данных. В отличие от PHP-ML, Rubix ML активно развивается и имеет документацию уровня enterprise.
require_once __DIR__ . '/vendor/autoload.php';
use Rubix\ML\Classifiers\KNearestNeighbors;
use Rubix\ML\Datasets\Labeled;
use Rubix\ML\CrossValidation\Reports\AggregateReport;
use Rubix\ML\CrossValidation\Reports\ConfusionMatrix;
use Rubix\ML\CrossValidation\Reports\MulticlassBreakdown;
// Создаем датасет
$samples = [
[1.2, 2.3, 0.8],
[3.4, 5.6, 1.2],
[7.8, 9.0, 3.4],
[2.1, 4.3, 1.5],
];
$labels = ['A', 'B', 'A', 'B'];
$dataset = new Labeled($samples, $labels);
// Обучаем классификатор
$estimator = new KNearestNeighbors(3);
$estimator->train($dataset);
// Предсказываем
$predictions = $estimator->predict([
[2.0, 3.0, 1.0],
[6.0, 8.0, 2.5],
]);
echo "Предсказания: " . implode(', ', $predictions) . PHP_EOL;
// Оценка
$report = new AggregateReport([
new MulticlassBreakdown(),
new ConfusionMatrix(),
]);
$results = $report->generate($predictions, ['A', 'B']);
print_r($results);
Практические возможности PHP для ML
На практике PHP может быть полезен в следующих сценариях:
- Интеграция ML в существующие веб-приложения — если у вас уже есть сайт на Laravel или Symfony, вы можете добавить простые модели классификации или регрессии без переписывания бэкенда.
- Простая обработка текстов — анализ тональности, спам-фильтры, категоризация новостей.
- Рекомендательные системы — коллаборативная фильтрация на основе данных о покупках или просмотрах.
- Аномалии и мониторинг — обнаружение необычного поведения пользователей в реальном времени.
Пример простого спам-фильтра на PHP-ML:
use Phpml\Classification\NaiveBayes;
use Phpml\FeatureExtraction\TfIdfTransformer;
use Phpml\Tokenization\WhitespaceTokenizer;
use Phpml\FeatureExtraction\TokenCountVectorizer;
$messages = [
'Привет, как дела?',
'Купите дешевые часы!',
'Встречаемся завтра в 10',
'Заработай миллион за неделю!',
'Нужно обсудить проект',
];
$labels = [0, 1, 0, 1, 0]; // 0 - нормальное, 1 - спам
// Векторизация текста
$vectorizer = new TokenCountVectorizer(new WhitespaceTokenizer());
$vectorizer->fit($messages);
$vectorizer->transform($messages);
$transformer = new TfIdfTransformer();
$transformer->fit($messages);
$transformer->transform($messages);
// Обучение
$classifier = new NaiveBayes();
$classifier->train($messages, $labels);
// Тест
$testMessage = ['Получите бесплатный айфон!'];
$vectorizer->transform($testMessage);
$transformer->transform($testMessage);
$prediction = $classifier->predict($testMessage[0]);
echo $prediction == 1 ? "Спам" : "Не спам";
Ограничения PHP в машинном обучении
Несмотря на наличие библиотек, PHP имеет ряд фундаментальных ограничений для ML:
Производительность
PHP — интерпретируемый язык, который значительно медленнее Python в численных вычислениях. Для глубокого обучения или работы с большими датасетами (более 10-50 тыс. записей) время обучения может стать критическим. В Python есть оптимизированные C-расширения (NumPy, TensorFlow, PyTorch), аналогов которым в PHP практически нет.
Отсутствие GPU-ускорения
Ни одна PHP-библиотека не поддерживает CUDA или OpenCL. Обучение нейронных сетей на GPU невозможно, что делает PHP бесполезным для современных задач deep learning (компьютерное зрение, NLP с трансформерами).
Ограниченная экосистема
- Нет полноценных фреймворков для глубокого обучения (аналогов TensorFlow/Keras/PyTorch).