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 il color 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

  1. $ minSamples: il numero minimo di oggetti che dovrebbero essere presenti in un cluster
  2. $ 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 nel data 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.



Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow