PHP机器学习:现实还是妥协?
传统上,机器学习(ML)与Python、R或Julia相关联。然而,PHP作为最流行的Web开发语言之一,也拥有ML库生态系统。使用PHP进行机器学习是一种妥协:与Python相比,你在性能和现成模型数量上有所损失,但获得了与Web应用的无缝集成、统一的技术栈,以及无需启动微服务即可快速实现简单ML算法的能力。
在本文中,我们将介绍PHP机器学习的主要库、它们的功能和使用示例。
1. PHP-ML (PHP Machine Learning)
PHP-ML 是最流行的PHP ML库。它不需要外部依赖,完全用PHP编写。实现了经典算法:分类、回归、聚类、降维和评估指标。
功能:
- 分类:Naive Bayes、SVM、k-Nearest Neighbors、Decision Tree
- 回归:Linear Regression、SVR
- 聚类:k-Means、DBSCAN
- 数据预处理:归一化、标准化
- 指标:accuracy、precision、recall、F1-score
示例:Fisher鸢尾花分类
require_once __DIR__ . '/vendor/autoload.php';
use Phpml\\Classification\\KNearestNeighbors;use Phpml\\Dataset\\Demo\\IrisDataset;
$dataset = new IrisDataset();$samples = $dataset->getSamples();$labels = $dataset->getTargets();
$classifier = new KNearestNeighbors(3);$classifier->train($samples, $labels);
// 预测新样本(花萼长度、花萼宽度、花瓣长度、花瓣宽度)$newSample = [5.1, 3.5, 1.4, 0.2];$predicted = $classifier->predict($newSample);
echo "预测类别: " . $predicted; // 'Iris-setosa'2. Rubix ML
Rubix ML 是一个更现代、更强大的库。与PHP-ML不同,它支持神经网络、梯度提升、集成方法以及通过生成器(惰性求值)处理大型数据集。
特点:
- 神经网络(多层感知器、通过转换的CNN)
- 集成方法:Random Forest、Gradient Boosted Trees
- 数据处理管道(pipelines)
- 支持分类特征和One-Hot编码
- 以PHP序列化格式导出模型
示例:带管道的线性回归
require_once __DIR__ . '/vendor/autoload.php';
use Rubix\\ML\\Datasets\\Labeled;use Rubix\\ML\\Regressors\\Ridge;use Rubix\\ML\\Transformers\\NumericStringConverter;use Rubix\\ML\\Transformers\\MinMaxNormalizer;use Rubix\\ML\\Pipeline;
// 创建数据集$samples = [[1], [2], [3], [4], [5]];$labels = [1.5, 2.8, 4.1, 5.9, 7.2];
$dataset = new Labeled($samples, $labels);
// 创建管道$estimator = new Pipeline([ new NumericStringConverter(), new MinMaxNormalizer(),], new Ridge(1.0));
$estimator->train($dataset);
// 预测$prediction = $estimator->predict([[6]]);echo "预测值: " . $prediction[0]; // ~8.33. Keras PHP (TensorFlow PHP Binding)
要在PHP中使用深度神经网络,可以使用 Keras PHP——一个对Python库Keras/TensorFlow的封装。实际上,它是一个从PHP运行Python脚本的桥梁。这不是一个纯PHP解决方案,但允许使用TensorFlow的全部功能。
示例:加载预训练模型
use KerasPHP\\Keras;
$keras = new Keras();
// 从.h5文件加载模型$model = $keras->load_model('/path/to/model.h5');
// 准备数据(数组)$input = [[0.5, 0.2, 0.1]];
// 预测$result =