Zoeken…


Opmerkingen

Het onderwerp gebruikt PHP-ML voor alle machine learning-algoritmen. De installatie van de bibliotheek kan worden gedaan met behulp van

composer require php-ai/php-ml

De github-repository voor dezelfde vind je hier .

Het is ook vermeldenswaard dat de gegeven voorbeelden slechts zeer kleine gegevens zijn voor demonstratiedoeleinden. De feitelijke gegevensset zou uitgebreider moeten zijn.

Classificatie met behulp van PHP-ML

Classificatie in machine learning is het probleem dat aangeeft tot welke set categorieën een nieuwe waarneming behoort. Classificatie valt onder de categorie Supervised Machine Learning .

Elk algoritme dat classificatie implementeert, staat bekend als classifier

De classificaties die worden ondersteund in PHP-ML zijn

  • SVC (Ondersteuning Vector classificatie)
  • k-dichtstbijzijnde buren
  • Naïeve Bayes

De train en predict zijn voor alle classificaties hetzelfde. Het enige verschil zou zijn in het onderliggende onderliggende algoritme.

SVC (Ondersteuning Vector classificatie)

Voordat we kunnen beginnen met het voorspellen van een nieuwe waarneming, moeten we onze classificator trainen. Overweeg de volgende 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);

De code is vrij eenvoudig. $cost hierboven gebruikte $cost zijn een maat voor hoeveel we willen voorkomen dat elk trainingsvoorbeeld verkeerd wordt geclassificeerd. Voor een kleinere waarde van $cost u mogelijk verkeerd geclassificeerde voorbeelden. Standaard is deze ingesteld op 1.0

Nu we de classifier hebben getraind, kunnen we een aantal werkelijke voorspellingen doen. Overweeg de volgende codes die we hebben voor voorspellingen

$classifier->predict([3, 2]); // return 'b'
$classifier->predict([[3, 2], [1, 5]]); // return ['b', 'a']

De classificeerder in het bovenstaande geval kan niet-geclassificeerde monsters nemen en voorspelt zijn labels. predict kan zowel een enkel monster als een reeks monsters nemen.

k-dichtstbijzijnde buren

De classfier voor dit algoritme neemt twee parameters op en kan als volgt worden geïnitialiseerd

$classifier = new KNearestNeighbors($neighbor_num=4);
$classifier = new KNearestNeighbors($neighbor_num=3, new Minkowski($lambda=4));

$neighbor_num is het aantal dichtstbijzijnde buren dat moet worden gescand in het bekende algoritme, terwijl de tweede parameter afstandsmetriek is, die standaard in het eerste geval Euclidean zou zijn. Meer over Minkowski kan worden gevonden hier .

Hierna volgt een kort voorbeeld van het gebruik van deze classifier

// 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 is gebaseerd op Bayes' theorem van Bayes' theorem en heeft geen parameters nodig in de constructor.

De volgende code toont een eenvoudige voorspellingsimplementatie

// 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']

Praktisch geval

Tot nu toe hebben we alleen reeksen integer in al ons geval gebruikt, maar dat is in het echte leven niet het geval. Laat me daarom proberen een praktische situatie te beschrijven over het gebruik van classificaties.

Stel dat u een toepassing hebt die eigenschappen van bloemen in de natuur opslaat. Voor de eenvoud kunnen we rekening houden met de kleur en de lengte van de bloemblaadjes. Er zouden dus twee kenmerken worden gebruikt om onze gegevens te trainen. color is de eenvoudigste waar u een int-waarde aan elk van hen kunt toewijzen en voor lengte kunt u een bereik hebben zoals (0 mm,10 mm)=1 , (10 mm,20 mm)=2 . Met de eerste gegevenstrain uw classifier. Nu moet een van uw gebruikers het soort bloem identificeren dat in zijn achtertuin groeit. Wat hij doet, is de color van de bloem selecteren en de lengte van de bloemblaadjes toevoegen. Uw lopende classifier kan het type bloem detecteren ("Labels in voorbeeld hierboven")

regressie

In classificatie met behulp van PHP-ML hebben we labels toegewezen aan nieuwe observatie. Regressie is bijna hetzelfde met het verschil dat de uitvoerwaarde geen klassenlabel is, maar een continue waarde. Het wordt veel gebruikt voor voorspellingen en voorspellingen. PHP-ML ondersteunt de volgende regressie-algoritmen

  • Ondersteuning van vectorregressie
  • LeastSquares Lineaire regressie

Regressie heeft dezelfde train en predict als gebruikt bij classificatie.

Ondersteuning van vectorregressie

Dit is de regressieversie voor SVM (Support Vector Machine). De eerste stap zoals in de classificatie is om ons model te trainen.

// 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 regressie zijn $targets geen klassenlabels in tegenstelling tot classificatie. Dit is een van de onderscheidende factoren voor de twee. Na het trainen van ons model met de gegevens kunnen we beginnen met de werkelijke voorspellingen

$regression->predict([64])  // return 4.03

Merk op dat de voorspellingen een waarde buiten het doel opleveren.

LeastSquares Lineaire regressie

Dit algoritme gebruikt de least squares method van de least squares method om de oplossing te benaderen. Het volgende toont een eenvoudige code van training en voorspelling

// 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 biedt ook de optie van Multiple Linear Regression . Een voorbeeldcode hiervoor kan als volgt zijn

$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 is met name handig wanneer meerdere factoren of eigenschappen de uitkomst identificeren.

Praktisch geval

Laten we nu een toepassing van regressie in het echte leven nemen.

Stel dat u een zeer populaire website heeft, maar het verkeer blijft veranderen. U wilt een oplossing die het aantal servers voorspelt dat u op elk gewenst moment moet implementeren. Laten we aannemen dat uw hostingprovider u een API geeft om servers uit te zetten en dat elke server 15 minuten nodig heeft om op te starten. Op basis van eerdere gegevens over verkeer en regressie kunt u het verkeer voorspellen dat uw toepassing op elk gewenst moment zou raken. Met behulp van die kennis kunt u een server 15 minuten vóór de piek starten, waardoor uw toepassing niet offline kan gaan.

clustering

Clustering gaat over het groeperen van vergelijkbare objecten. Het wordt veel gebruikt voor patroonherkenning. Clustering valt onder niet- unsupervised machine learning , daarom is er geen training nodig. PHP-ML biedt ondersteuning voor de volgende clusteringalgoritmen

  • k-Middelen
  • dbscan

k-Middelen

k-Means scheidt de gegevens in n groepen van gelijke variantie. Dit betekent dat we een getal n moeten doorgeven, wat het aantal clusters is dat we nodig hebben in onze oplossing. De volgende code zal helpen meer duidelijkheid te brengen

// 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]]]

Merk op dat de uitvoer 3 arrays bevat omdat dat de waarde van n in KMeans constructor. Er kan ook een optionele tweede parameter in de constructor zijn, die de initialization method zou zijn. Denk bijvoorbeeld aan

$kmeans = new KMeans(4, KMeans::INIT_RANDOM);

INIT_RANDOM plaatst een volledig willekeurig zwaartepunt tijdens het bepalen van de clusters. Maar alleen om te voorkomen dat het zwaartepunt te ver weg is van de gegevens, is het gebonden aan de ruimtegrenzen van gegevens.

De standaard initialization method constructor is kmeans ++, die centroid op een slimme manier selecteert om het proces te versnellen.

DBSCAN

In tegenstelling tot KMeans is DBSCAN een op dichtheid gebaseerd clusteringalgoritme, wat betekent dat we geen n zouden passeren die het aantal clusters zou bepalen dat we in ons resultaat willen. Aan de andere kant vereist dit twee parameters om te werken

  1. $ minSamples: het minimum aantal objecten dat aanwezig moet zijn in een cluster
  2. $ epsilon: wat de maximale afstand is tussen twee monsters die in hetzelfde cluster moeten worden beschouwd.

Een snel voorbeeld voor hetzelfde is als volgt

// 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]]]

De code is vrijwel vanzelfsprekend. Een groot verschil is dat er geen manier is om het aantal elementen in de uitvoerarray te kennen in tegenstelling tot KMeans.

Praktisch geval

Laten we nu eens kijken naar het gebruik van clustering in het echte leven

Clustering wordt veel gebruikt bij pattern recognition en data mining . Overweeg dat u een toepassing voor het publiceren van inhoud hebt. Om uw gebruikers te behouden, moeten ze nu kijken naar inhoud die ze leuk vinden. Laten we er omwille van de eenvoud van uitgaan dat als ze langer dan een minuut op een specifieke webpagina staan en ze naar beneden zoeken, ze van die inhoud houden. Nu heeft elk van uw inhoud een uniek ID en de gebruiker ook. Maak op basis daarvan een cluster en je zult weten welk gebruikerssegment een vergelijkbare inhoudssmaak heeft. Dit kan op zijn beurt worden gebruikt in een aanbevelingssysteem waarbij je kunt aannemen dat als sommige gebruikers van hetzelfde cluster van het artikel houden, anderen dat ook zullen doen en dat kan worden weergegeven als aanbevelingen voor je toepassing.



Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow