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