PHP
Maskininlärning
Sök…
Anmärkningar
Ämnet använder PHP-ML för alla maskininlärningsalgoritmer. Installationen av biblioteket kan göras med
composer require php-ai/php-ml
Github-förvaret för samma kan hittas här .
Det är också värt att notera att exemplen som ges är mycket små datasätt endast för demonstration. Den faktiska datamängden borde vara mer omfattande än så.
Klassificering med PHP-ML
Klassificering i maskininlärning är problemet som identifierar till vilken uppsättning kategorier tillhör en ny observation. Klassificering faller under kategorin Supervised Machine Learning
.
Alla algoritmer som implementerar klassificering kallas klassificerare
Klassificeringarna som stöds i PHP-ML är
- SVC (Support Vector Classification)
- k-närmaste grannar
- Naive Bayes
train
och predict
är desamma för alla klassificerare. Den enda skillnaden skulle vara i den underliggande algoritmen som används.
SVC (Support Vector Classification)
Innan vi kan börja med att förutsäga en ny observation måste vi utbilda vår klassificerare. Tänk på följande kod
// 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);
Koden är ganska rak framåt. $cost
används ovan är ett mått på hur mycket vi vill undvika felklassificering av varje träningsexempel. För ett mindre värde på $cost
kan du få felklassificerade exempel. Som standard är det satt till 1.0
Nu när vi har utbildat klassificeringen kan vi börja göra några faktiska förutsägelser. Tänk på följande koder som vi har för förutsägelser
$classifier->predict([3, 2]); // return 'b'
$classifier->predict([[3, 2], [1, 5]]); // return ['b', 'a']
Klassificeringen i fallet ovan kan ta oklassificerade prover och förutsäger där etiketter. predict
metod kan ta ett enda prov såväl som en rad prover.
k-närmaste grannar
Klassificeringen för denna algoritm tar två parametrar och kan initieras som
$classifier = new KNearestNeighbors($neighbor_num=4);
$classifier = new KNearestNeighbors($neighbor_num=3, new Minkowski($lambda=4));
$neighbor_num
är antalet närmaste grannar att skanna i knn- algoritmen medan den andra parametern är avståndsmetrisk som som standard i första fall skulle vara Euclidean
. Mer om Minkowski finns här .
Följande är ett kort exempel på hur man använder denna klassificerare
// 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 Classifier
NaiveBayes Classifier
är baserad på Bayes' theorem
och behöver inte några parametrar i konstruktören.
Följande kod visar en enkel förutsägelseimplementering
// 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']
Praktiskt fall
Hittills har vi bara använt matriser av heltal i alla våra fall men det är inte fallet i verkliga livet. Låt mig därför försöka beskriva en praktisk situation för hur man använder klassificerare.
Anta att du har en applikation som lagrar egenskaper för blommor i naturen. För enkelhetens skull kan vi ta hänsyn till kronbladets färg och längd. Så det skulle två egenskaper användas för att träna våra uppgifter.
color
är den enklare där du kan tilldela ett int-värde till var och en av dem och för längd kan du ha ett intervall som(0 mm,10 mm)=1 , (10 mm,20 mm)=2
. Med den ursprungliga datatrain din klassificerare. Nu måste en av dina användare identifiera vilken typ av blomma som växer i hans trädgård. Vad han gör är att väljacolor
på blomman och lägger till kronbladens längd. Din klassificerare som kör kan upptäcka blommatypen ("Etiketter i exemplet ovan")
regression
Vid klassificering med PHP-ML
tilldelade vi etiketter till ny observation. Regression är nästan densamma med skillnaden att utgångsvärdet inte är en klassetikett utan ett kontinuerligt värde. Det används ofta för förutsägelser och prognoser. PHP-ML stöder följande regressionsalgoritmer
- Stöd vektorregression
- LeastSquares Linear Regression
Regression har samma train
och predict
som används i klassificeringen.
Stöd vektorregression
Detta är regressionsversionen för SVM (Support Vector Machine). Det första steget som i klassificeringen är att träna vår modell.
// 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);
I regression är $targets
inte klassetiketter i motsats till klassificering. Detta är en av de åtskiljande faktorerna för de två. Efter att ha tränat vår modell med data kan vi börja med de faktiska förutsägelserna
$regression->predict([64]) // return 4.03
Observera att prognoserna returnerar ett värde utanför målet.
LeastSquares Linear Regression
Denna algoritm använder least squares method
att ungefärlig lösning. Följande visar en enkel kod för träning och förutsägelse
// 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 ger också möjligheten att Multiple Linear Regression
. En provkod för samma kan vara följande
$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
är särskilt användbar när flera faktorer eller drag identifierar resultatet.
Praktiskt fall
Låt oss nu ta en tillämpning av regression i det verkliga livet.
Anta att du driver en mycket populär webbplats, men trafiken fortsätter att ändras. Du vill ha en lösning som kan förutsäga antalet servrar du behöver distribuera vid en viss tidpunkt. Låt oss anta för att din webbhotell ger dig en api för att leka ut servrar och det tar 15 minuter att starta varje server. Baserat på tidigare trafikdata och regression kan du förutsäga den trafik som skulle träffa din applikation när som helst. Med hjälp av den kunskapen kan du starta en server 15 minuter före överspänningen och därmed förhindra att din ansökan går offline.
Clustering
Clustering handlar om att gruppera liknande objekt ihop. Det används ofta för mönsterigenkänning. Clustering
unsupervised machine learning
, därför behövs ingen utbildning. PHP-ML har stöd för följande klusteralgoritmer
- k-Medel
- dbscan
k-Medel
k-Means separerar data i n
grupper med lika varians. Detta innebär att vi måste lämna in ett nummer n
som skulle vara antalet kluster vi behöver i vår lösning. Följande kod hjälper dig att få mer tydlighet
// 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]]]
Observera att utgången innehåller 3 matriser eftersom det var värdet på n
i KMeans
konstruktör. Det kan också finnas en valfri andra parameter i konstruktorn som skulle vara initialization method
. Tänk till exempel
$kmeans = new KMeans(4, KMeans::INIT_RANDOM);
INIT_RANDOM
placerar en helt slumpmässig centroid när man försöker bestämma klustren. Men bara för att undvika att centroid är för långt borta från data, är det bundet av rymdgränserna för data.
Den standardkonstruktor initialization method
är kmeans ++ vilka väljer centroid på ett smart sätt att påskynda processen.
DBSCAN
I motsats till KMeans
är DBSCAN
en densitetsbaserad klusteralgoritm som innebär att vi inte skulle passera n
vilket skulle bestämma antalet kluster vi vill ha i vårt resultat. Å andra sidan kräver detta två parametrar för att fungera
- $ minSamples: Det minsta antalet objekt som ska finnas i ett kluster
- $ epsilon: Vilket är det maximala avståndet mellan två prover för dem att betraktas som i samma kluster.
Ett snabbt prov för samma är följande
// 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]]]
Koden är ganska mycket självförklarande. En viktig skillnad är att det inte finns något sätt att känna till antalet element i utmatningsfältet i motsats till KMeans.
Praktiskt fall
Låt oss nu titta på att använda kluster i verkliga scenariot
Clustering används i stor utsträckning för
pattern recognition
ochdata mining
. Tänk på att du har en applikation för publicering av innehåll. För att behålla dina användare bör de nu titta på innehåll som de älskar. Låt oss för enkelhetens skull anta att om de finns på en specifik webbsida mer än en minut och de skrattar till botten så älskar de det innehållet. Nu kommer vart och ett av dina innehåll att ha en unik identifierare med det och så kommer användaren att göra det. Gör ett kluster baserat på det så får du veta vilket segment av användare som har en liknande innehållsmak. Detta i sin tur skulle kunna användas i rekommendationssystem där du kan anta att om vissa användare av samma kluster älskar artikeln så kommer andra också att visas som rekommendationer på din applikation.