使用 PHP-ML 进行分类

机器学习中的分类是识别新观察属于哪一类别的问题。分类属于 Supervised Machine Learning 类别。

任何实现分类的算法都称为分类器

PHP-ML 支持的分类器是

  • SVC(支持向量分类)
  • k-最近邻居
  • 朴素贝叶斯

trainpredict 方法对于所有分类器都是相同的。唯一的区别在于使用的基础算法。

SVC(支持向量分类)

在我们开始预测新观察之前,我们需要训练我们的分类器。请考虑以下代码

// Import library
use Phpml\Classification\SVC;
use Phpml\SupportVectorMachine\Kernel;

// Data for training classifier
$samples = [[1, 3], [1, 4], [2, 4], [3, 1], [4, 1], [4, 2]];  // Training samples
$labels = ['a', 'a', 'a', 'b', 'b', 'b'];

// Initialize the classifier
$classifier = new SVC(Kernel::LINEAR, $cost = 1000);
// Train the classifier
$classifier->train($samples, $labels);

代码很简单。上面使用的 $cost 是衡量我们希望避免错误分类每个训练样例的程度。对于较小的 $cost 值,你可能会得到错误分类的示例。默认情况下,它设置为 1.0

现在我们已经对分类器进行了训练,我们可以开始做出一些实际的预测。请考虑以下用于预测的代码

$classifier->predict([3, 2]); // return 'b'
$classifier->predict([[3, 2], [1, 5]]); // return ['b', 'a']

上述案例中的分类器可以采用未分类的样本并预测其标签。predict 方法可以采用单个样本以及样本数组。

k-最近邻居

该算法的类表有两个参数,可以初始化为

$classifier = new KNearestNeighbors($neighbor_num=4);
$classifier = new KNearestNeighbors($neighbor_num=3, new Minkowski($lambda=4));

$neighbor_numknn 算法中扫描的最近邻居的数量,而第二个参数是距离度量,默认情况下,第一个参数是 Euclidean。有关 Minkowski 的更多信息,请点击此处

以下是如何使用此分类器的简短示例

// Training data
$samples = [[1, 3], [1, 4], [2, 4], [3, 1], [4, 1], [4, 2]];
$labels = ['a', 'a', 'a', 'b', 'b', 'b'];

// Initialize classifier
$classifier = new KNearestNeighbors();
// Train classifier
$classifier->train($samples, $labels);

// Make predictions
$classifier->predict([3, 2]); // return 'b'
$classifier->predict([[3, 2], [1, 5]]); // return ['b', 'a']

NaiveBayes 分类器

NaiveBayes Classifier 基于 Bayes' theorem,在构造函数中不需要任何参数。

以下代码演示了一个简单的预测实现

// Training data
$samples = [[5, 1, 1], [1, 5, 1], [1, 1, 5]];
$labels = ['a', 'b', 'c'];

// Initialize classifier
$classifier = new NaiveBayes();
// Train classifier
$classifier->train($samples, $labels);

// Make predictions
$classifier->predict([3, 1, 1]); // return 'a'
$classifier->predict([[3, 1, 1], [1, 4, 1]); // return ['a', 'b']

实际案例

到目前为止,我们在所有情况下都只使用了整数数组,但现实情况并非如此。因此,让我试着描述一下如何使用分类器的实际情况。

假设你有一个存储自然特征的应用程序。为简单起见,我们可以考虑花瓣的颜色和长度。因此,将使用两个特征来训练我们的数据。color 是一个更简单的一个,你可以为每个值分配一个 int 值,对于长度,你可以有一个像 (0 mm,10 mm)=1 , (10 mm,20 mm)=2 这样的范围。用初始数据训练你的分类器。现在,你的一个用户需求确定了他后院生长的那种花。他所做的就是选择花的 color 并增加花瓣的长度。你运行的分类器可以检测花的类型(上面示例中的标签