使用 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
並增加花瓣的長度。你執行的分類器可以檢測花的型別(上面示例中的標籤)