PHP
Maschinelles lernen
Suche…
Bemerkungen
Das Thema verwendet PHP-ML für alle Algorithmen zum maschinellen Lernen. Die Installation der Bibliothek kann mit durchgeführt werden
composer require php-ai/php-ml
Das github-Repository für dasselbe kann hier gefunden werden .
Es ist auch erwähnenswert, dass die Beispiele nur zu Demonstrationszwecken sehr kleine Daten sind. Der tatsächliche Datensatz sollte umfassender sein.
Klassifizierung mit PHP-ML
Klassifizierung beim Maschinellen Lernen ist das Problem, das angibt, zu welcher Gruppe von Kategorien eine neue Beobachtung gehört. Die Klassifizierung fällt in die Kategorie des Supervised Machine Learning
.
Jeder Algorithmus, der Klassifikation implementiert, wird als Klassifizierer bezeichnet
Die in PHP-ML unterstützten Klassifizierer sind
- SVC (Support Vector Classification)
- k-Nächste Nachbarn
- Naive Bayes
Die train
und predict
ist für alle Klassifizierer gleich. Der einzige Unterschied wäre der zugrunde liegende Algorithmus.
SVC (Support Vector Classification)
Bevor wir mit der Vorhersage einer neuen Beobachtung beginnen können, müssen wir unseren Klassifikator trainieren. Betrachten Sie den folgenden Code
// 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);
Der Code ist ziemlich einfach. $cost
oben verwendeten $cost
sind ein Maß dafür, wie viel wir vermeiden möchten, jedes Trainingsbeispiel falsch zu klassifizieren. Für einen geringeren Wert von $cost
Sie möglicherweise falsch klassifizierte Beispiele. Standardmäßig ist es auf 1,0 eingestellt
Jetzt, da wir den Klassifikator trainiert haben, können wir einige Vorhersagen treffen. Betrachten Sie die folgenden Codes, die wir für Vorhersagen haben
$classifier->predict([3, 2]); // return 'b'
$classifier->predict([[3, 2], [1, 5]]); // return ['b', 'a']
Der Klassifizierer in dem obigen Fall kann nicht klassifizierte Proben nehmen und sagt dort Labels aus. predict
Methode kann eine einzelne Probe sowie ein Array von Proben aufnehmen.
k-Nächste Nachbarn
Der Classfier für diesen Algorithmus nimmt zwei Parameter auf und kann auf ähnliche Weise initialisiert werden
$classifier = new KNearestNeighbors($neighbor_num=4);
$classifier = new KNearestNeighbors($neighbor_num=3, new Minkowski($lambda=4));
$neighbor_num
ist die Anzahl der nächsten Nachbarn, die im Knn- Algorithmus gescannt werden sollen, während der zweite Parameter die Entfernungsmetrik ist, die standardmäßig im ersten Fall Euclidean
. Mehr über Minkowski finden Sie hier .
Im Folgenden finden Sie ein kurzes Beispiel zur Verwendung dieses Klassifikators
// 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-Klassifizierer
NaiveBayes Classifier
basiert auf Bayes' theorem
von Bayes' theorem
und benötigt keine Parameter im Konstruktor.
Der folgende Code veranschaulicht eine einfache Vorhersageimplementierung
// 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']
Praktischer Fall
Bis jetzt haben wir in allen Fällen nur ganzzahlige Arrays verwendet, aber das ist im wirklichen Leben nicht der Fall. Lassen Sie mich daher versuchen, eine praktische Situation zu beschreiben, wie Klassifizierer verwendet werden.
Angenommen, Sie haben eine Anwendung, die die Eigenschaften von Blumen in der Natur speichert. Der Einfachheit halber können wir die Farbe und Länge der Blütenblätter berücksichtigen. Es werden also zwei Merkmale verwendet, um unsere Daten zu trainieren.
color
ist die einfachere, bei der Sie jedem einen Int-Wert zuweisen können, und für die Länge können Sie einen Bereich wie(0 mm,10 mm)=1 , (10 mm,20 mm)=2
. Mit dem Anfangsdaten-Train trainieren Sie Ihren Klassifikator. Nun muss ein Benutzer die Art der Blume identifizieren, die in seinem Garten wächst. Er wählt diecolor
der Blüte und fügt die Länge der Blütenblätter hinzu. Der laufende Klassifizierer kann die Art der Blume erkennen ("Etiketten im obigen Beispiel").
Regression
Bei der Klassifizierung mit PHP-ML
wir der neuen Beobachtung Labels zugewiesen. Die Regression ist fast identisch mit dem Unterschied, dass der Ausgabewert keine Klassenbezeichnung ist, sondern ein fortlaufender Wert. Es wird häufig für Vorhersagen und Prognosen verwendet. PHP-ML unterstützt die folgenden Regressionsalgorithmen
- Vektorregression unterstützen
- LeastSquares Lineare Regression
Die Regression hat die gleichen train
und predict
wie bei der Klassifizierung.
Vektorregression unterstützen
Dies ist die Regressionsversion für SVM (Support Vector Machine). Der erste Schritt wie bei der Klassifizierung besteht darin, unser Modell zu trainieren.
// Import library
use Phpml\Regression\SVR;
use Phpml\SupportVectorMachine\Kernel;
// Training data
$samples = [[60], [61], [62], [63], [65]];
$targets = [3.1, 3.6, 3.8, 4, 4.1];
// Initialize regression engine
$regression = new SVR(Kernel::LINEAR);
// Train regression engine
$regression->train($samples, $targets);
In der Regression sind $targets
keine Klassensymbole. Dies ist einer der Differenzierungsfaktoren für beide. Nachdem wir unser Modell mit den Daten trainiert haben, können wir mit den tatsächlichen Vorhersagen beginnen
$regression->predict([64]) // return 4.03
Beachten Sie, dass die Vorhersagen einen Wert außerhalb des Ziels zurückgeben.
LeastSquares Lineare Regression
Dieser Algorithmus verwendet die least squares method
der least squares method
um die Lösung zu approximieren. Im Folgenden wird ein einfacher Code für das Training und die Vorhersage dargestellt
// Training data
$samples = [[60], [61], [62], [63], [65]];
$targets = [3.1, 3.6, 3.8, 4, 4.1];
// Initialize regression engine
$regression = new LeastSquares();
// Train engine
$regression->train($samples, $targets);
// Predict using trained engine
$regression->predict([64]); // return 4.06
PHP-ML bietet auch die Option der Multiple Linear Regression
. Ein Beispielcode für dasselbe kann wie folgt sein
$samples = [[73676, 1996], [77006, 1998], [10565, 2000], [146088, 1995], [15000, 2001], [65940, 2000], [9300, 2000], [93739, 1996], [153260, 1994], [17764, 2002], [57000, 1998], [15000, 2000]];
$targets = [2000, 2750, 15500, 960, 4400, 8800, 7100, 2550, 1025, 5900, 4600, 4400];
$regression = new LeastSquares();
$regression->train($samples, $targets);
$regression->predict([60000, 1996]) // return 4094.82
Multiple Linear Regression
ist besonders nützlich, wenn mehrere Faktoren oder Merkmale das Ergebnis identifizieren.
Praktischer Fall
Lassen Sie uns nun eine Regression im realen Szenario anwenden.
Angenommen, Sie betreiben eine sehr beliebte Website, aber der Verkehr ändert sich ständig. Sie möchten eine Lösung, die die Anzahl der Server vorhersagt, die Sie zu einem bestimmten Zeitpunkt bereitstellen müssen. Nehmen wir an, der Hosting-Provider gibt Ihnen eine API, um Server hervorzubringen, und jeder Server benötigt 15 Minuten, um zu booten. Basierend auf früheren Daten des Verkehrs und der Regression können Sie den Verkehr vorhersagen, der Ihre Anwendung zu einem beliebigen Zeitpunkt treffen würde. Mit diesem Wissen können Sie einen Server 15 Minuten vor dem Anstieg starten, um zu verhindern, dass Ihre Anwendung offline geht.
Clustering
Beim Clustering werden ähnliche Objekte zusammengefasst. Es wird häufig für die Mustererkennung verwendet. Clustering
unsupervised machine learning
, daher ist keine Schulung erforderlich. PHP-ML unterstützt die folgenden Clustering-Algorithmen
- k-Means
- dbscan
k-Means
k-Means trennt die Daten in n
Gruppen gleicher Varianz. Dies bedeutet, dass wir eine Anzahl n
eingeben müssen, die die Anzahl der Cluster ist, die wir in unserer Lösung benötigen. Der folgende Code wird für mehr Klarheit sorgen
// Our data set
$samples = [[1, 1], [8, 7], [1, 2], [7, 8], [2, 1], [8, 9]];
// Initialize clustering with parameter `n`
$kmeans = new KMeans(3);
$kmeans->cluster($samples); // return [0=>[[7, 8]], 1=>[[8, 7]], 2=>[[1,1]]]
Beachten Sie, dass die Ausgabe 3 Arrays enthält, da dies der Wert von n
im KMeans
Konstruktor war. Im Konstruktor kann auch ein optionaler zweiter Parameter vorhanden sein, der die initialization method
. Zum Beispiel betrachten
$kmeans = new KMeans(4, KMeans::INIT_RANDOM);
INIT_RANDOM
platziert einen vollständig zufälligen Schwerpunkt, während er versucht, die Cluster zu bestimmen. Aber nur um zu vermeiden, dass der Schwerpunkt zu weit von den Daten entfernt ist, ist er an die räumlichen Grenzen der Daten gebunden.
Die Standard-Konstruktor- initialization method
ist kmeans ++, wodurch der Zentroid auf intelligente Weise ausgewählt wird, um den Prozess zu beschleunigen.
DBSCAN
Im Gegensatz zu KMeans
ist DBSCAN
ein auf Dichte basierender Clustering-Algorithmus, was bedeutet, dass wir n
nicht übergeben würden, wodurch die Anzahl der Cluster bestimmt wird, die wir für unser Ergebnis KMeans
. Auf der anderen Seite sind dafür zwei Parameter erforderlich
- $ minSamples: Die Mindestanzahl von Objekten, die in einem Cluster vorhanden sein sollten
- $ epsilon: Dies ist die maximale Entfernung zwischen zwei Proben, die als im selben Cluster betrachtet werden kann.
Ein schnelles Beispiel für dasselbe ist wie folgt
// Our sample data set
$samples = [[1, 1], [8, 7], [1, 2], [7, 8], [2, 1], [8, 9]];
$dbscan = new DBSCAN($epsilon = 2, $minSamples = 3);
$dbscan->cluster($samples); // return [0=>[[1, 1]], 1=>[[8, 7]]]
Der Code ist ziemlich selbsterklärend. Ein Hauptunterschied besteht darin, dass es nicht möglich ist, die Anzahl der Elemente im Ausgabearray im Gegensatz zu KMeans zu kennen.
Praktischer Fall
Lassen Sie uns nun einen Blick auf die Verwendung von Clustering in der Praxis werfen
Clustering wird häufig bei der
pattern recognition
und beimdata mining
. Beachten Sie, dass Sie über eine Anwendung zur Veröffentlichung von Inhalten verfügen. Nun, um Ihre Benutzer zu behalten, sollten sie sich die Inhalte anschauen, die sie lieben. Nehmen wir zur Vereinfachung an, dass sie, wenn sie sich länger als eine Minute auf einer bestimmten Webseite befinden und sie nach unten rollen, diesen Inhalt lieben. Jetzt hat jeder Ihrer Inhalte eine eindeutige Kennung und der Benutzer auch. Erstellen Sie Cluster auf dieser Grundlage, und Sie werden erfahren, welches Segment von Benutzern einen ähnlichen Inhaltsgeschmack aufweist. Dies könnte wiederum in einem Empfehlungssystem verwendet werden, in dem Sie davon ausgehen können, dass einige Benutzer desselben Clusters den Artikel lieben, andere dies auch tun und dies als Empfehlungen für Ihre Anwendung angezeigt wird.