PHP
Apprendimento automatico
Ricerca…
Osservazioni
L'argomento utilizza PHP-ML per tutti gli algoritmi di apprendimento automatico. L'installazione della libreria può essere eseguita utilizzando
composer require php-ai/php-ml
Il repository github per lo stesso può essere trovato qui .
Inoltre, vale la pena notare che gli esempi forniti sono dati molto piccoli, solo a scopo dimostrativo. Il set di dati effettivo dovrebbe essere più completo di quello.
Classificazione usando PHP-ML
La classificazione in Machine Learning è il problema che identifica a quale gruppo di categorie appartiene una nuova osservazione. La classificazione rientra nella categoria Supervised Machine Learning
.
Qualsiasi algoritmo che implementa la classificazione è noto come classificatore
I classificatori supportati in PHP-ML lo sono
- SVC (Support Vector Classification)
- k-Nearest Neighbours
- Naive Bayes
Il train
e il metodo di predict
sono gli stessi per tutti i classificatori. L'unica differenza sarebbe nell'algoritmo sottostante utilizzato.
SVC (Support Vector Classification)
Prima di poter iniziare a prevedere una nuova osservazione, dobbiamo addestrare il nostro classificatore. Considera il seguente codice
// 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);
Il codice è abbastanza semplice. $cost
utilizzato sopra è una misura di quanto vogliamo evitare di classificare erroneamente ogni esempio di addestramento. Per un valore inferiore di $cost
potresti ottenere esempi errati. Di default è impostato su 1.0
Ora che abbiamo addestrato il classificatore, possiamo iniziare a fare delle previsioni reali. Considera i seguenti codici che abbiamo per le previsioni
$classifier->predict([3, 2]); // return 'b'
$classifier->predict([[3, 2], [1, 5]]); // return ['b', 'a']
Il classificatore nel caso precedente può prendere campioni non classificati e prevedere le etichette. predict
metodo può richiedere un singolo campione e una serie di campioni.
k-Nearest Neighbours
Il classfier per questo algoritmo accetta due parametri e può essere inizializzato come
$classifier = new KNearestNeighbors($neighbor_num=4);
$classifier = new KNearestNeighbors($neighbor_num=3, new Minkowski($lambda=4));
$neighbor_num
è il numero di vicini più vicini da scansionare nell'algoritmo knn mentre il secondo parametro è metrica di distanza che, di default, nel primo caso sarebbe Euclidean
. Maggiori informazioni su Minkowski possono essere trovate qui .
Di seguito è riportato un breve esempio su come utilizzare questo classificatore
// 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']
Classificatore NaiveBayes
NaiveBayes Classifier
si basa sul Bayes' theorem
e non richiede alcun parametro nel costruttore.
Il codice seguente dimostra un'implementazione di previsione semplice
// 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']
Caso pratico
Fino ad ora abbiamo usato solo matrici di interi in tutti i casi, ma non è così nella vita reale. Quindi proviamo a descrivere una situazione pratica su come utilizzare i classificatori.
Supponiamo di avere un'applicazione che memorizza le caratteristiche dei fiori in natura. Per semplicità possiamo considerare il colore e la lunghezza dei petali. Quindi ci sarebbero due caratteristiche per allenare i nostri dati.
color
è il più semplice in cui è possibile assegnare un valore int a ciascuno di essi e per la lunghezza, è possibile avere un intervallo come(0 mm,10 mm)=1 , (10 mm,20 mm)=2
. Con i dati iniziali forma il tuo classificatore. Ora uno dei tuoi utenti ha bisogno di identificare il tipo di fiore che cresce nel suo cortile. Quello che fa è selezionare ilcolor
del fiore e aggiungere la lunghezza dei petali. Il classificatore in esecuzione può rilevare il tipo di fiore ("Etichette nell'esempio sopra")
Regressione
Nella classificazione utilizzando PHP-ML
abbiamo assegnato etichette a nuove osservazioni. La regressione è quasi la stessa cosa con la differenza che il valore di output non è un'etichetta di classe ma un valore continuo. È ampiamente utilizzato per previsioni e previsioni. PHP-ML supporta i seguenti algoritmi di regressione
- Supportare la regressione vettoriale
- Regressione lineare LeastSquares
La regressione ha lo stesso train
e predict
metodi usati nella classificazione.
Supportare la regressione vettoriale
Questa è la versione di regressione per SVM (Support Vector Machine). Il primo passo come nella classificazione è di addestrare il nostro modello.
// 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);
Nella regressione gli $targets
non sono etichette di classe rispetto alla classificazione. Questo è uno dei fattori di differenziazione per i due. Dopo aver addestrato il nostro modello con i dati, possiamo iniziare con le previsioni effettive
$regression->predict([64]) // return 4.03
Si noti che le previsioni restituiscono un valore al di fuori del target.
Regressione lineare LeastSquares
Questo algoritmo utilizza il least squares method
per approssimare la soluzione. Quanto segue dimostra un semplice codice di allenamento e previsione
// 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 offre anche l'opzione della Multiple Linear Regression
. Un codice di esempio per lo stesso può essere il seguente
$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
è particolarmente utile quando più fattori o tratti identificano il risultato.
Caso pratico
Ora prendiamo una domanda di regressione nello scenario della vita reale.
Supponiamo che tu gestisca un sito molto popolare, ma il traffico continua a cambiare. Si desidera una soluzione che preveda il numero di server che è necessario distribuire in una determinata istanza di tempo. Supponiamo per il fatto che il tuo provider di hosting ti dà una API per generare i server e ogni server impiega 15 minuti per l'avvio. In base ai precedenti dati sul traffico e alla regressione, puoi prevedere il traffico che potrebbe colpire la tua applicazione in qualsiasi istante di tempo. Utilizzando tale conoscenza, è possibile avviare un server 15 minuti prima dell'impulso, impedendo in tal modo l'interruzione della propria applicazione.
Clustering
Il raggruppamento raggruppa oggetti simili. È ampiamente utilizzato per il riconoscimento di modelli. Clustering
rientra unsupervised machine learning
, quindi non è necessario alcun addestramento. PHP-ML supporta i seguenti algoritmi di clustering
- k-means
- DBSCAN
k-means
k-Means separa i dati in n
gruppi di uguale varianza. Ciò significa che dobbiamo passare un numero n
che sarebbe il numero di cluster di cui abbiamo bisogno nella nostra soluzione. Il seguente codice contribuirà a portare più chiarezza
// 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]]]
Notare che l'output contiene 3 matrici perché questo era il valore di n
nel costruttore di KMeans
. Può anche esserci un secondo parametro opzionale nel costruttore che sarebbe il initialization method
. Ad esempio, considera
$kmeans = new KMeans(4, KMeans::INIT_RANDOM);
INIT_RANDOM
posiziona un centroide completamente casuale durante il tentativo di determinare i cluster. Ma solo per evitare che il centroide sia troppo lontano dai dati, è vincolato dai confini dello spazio dei dati.
Il initialization method
costruttore predefinito è kmeans ++ che seleziona il centroide in modo intelligente per accelerare il processo.
DBSCAN
A differenza dei KMeans
, DBSCAN
è un algoritmo di clustering basato sulla densità, il che significa che non KMeans
n
che determinerebbe il numero di cluster che vogliamo nel nostro risultato. D'altra parte questo richiede due parametri per funzionare
- $ minSamples: il numero minimo di oggetti che dovrebbero essere presenti in un cluster
- $ epsilon: qual è la distanza massima tra due campioni per essere considerati come nello stesso cluster.
Un rapido esempio per lo stesso è il seguente
// 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]]]
Il codice è praticamente auto esplicativo. Una delle principali differenze è che non c'è modo di conoscere il numero di elementi nell'array di output rispetto ai KMean.
Caso pratico
Diamo ora un'occhiata all'utilizzo del clustering nello scenario della vita reale
Il clustering è ampiamente utilizzato nel
pattern recognition
e neldata mining
. Considera che hai un'applicazione per la pubblicazione di contenuti. Ora, per mantenere i tuoi utenti, dovrebbero guardare i contenuti che amano. Supponiamo per semplicità che, se si trovano su una pagina web specifica per più di un minuto e scorrono in basso, adorano quel contenuto. Ora ognuno dei tuoi contenuti avrà un identificatore univoco con esso e così sarà l'utente. Crea un cluster basato su quello e scoprirai quale segmento di utenti ha un gusto simile. Questo a sua volta potrebbe essere utilizzato nel sistema di raccomandazione in cui si può presumere che se alcuni utenti dello stesso cluster amano l'articolo, lo saranno anche gli altri e che possono essere visualizzati come consigli sulla propria applicazione.