使用 PHP-ML 进行分类
机器学习中的分类是识别新观察属于哪一类别的问题。分类属于 Supervised Machine Learning
类别。
任何实现分类的算法都称为分类器
PHP-ML 支持的分类器是
- SVC(支持向量分类)
- k-最近邻居
- 朴素贝叶斯
train
和 predict
方法对于所有分类器都是相同的。唯一的区别在于使用的基础算法。
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_num
是 knn 算法中扫描的最近邻居的数量,而第二个参数是距离度量,默认情况下,第一个参数是 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
并增加花瓣的长度。你运行的分类器可以检测花的类型(上面示例中的标签)