Regressione lineare in Go - Parte 1
Python si sta affermando come standard di fatto nel campo dei Big Data e del Machine Learning. Questo successo è dovuto in gran parte a strumenti straordinari come IPython Notebook, che agevola la visualizzazione dei dati, o scikit learn, che mette a disposizione le implementazioni degli algoritmi di apprendimento automatico più diffusi.
Di conseguenza, implementare un algoritmo di Machine Learning in Go rappresenta un puro esercizio.
Cos’è la regressione lineare
La regressione lineare è un algoritmo di Machine Learning supervisionato, impiegato per prevedere un valore continuo; trova applicazione, ad esempio, nella stima dei prezzi di mercato.
Il termine supervisionato indica che l’algoritmo necessita di essere addestrato tramite un set di dati di apprendimento. In futuro avremo modo di esaminare ulteriori esempi di algoritmi appartenenti a questa categoria.
Di seguito è riportato un grafico basato su dati reali relativi ai prezzi delle abitazioni a Windsor, nell’Ontario: l’asse X rappresenta la dimensione del lotto, l’asse Y il prezzo. Come si può notare, i lotti più ampi tendono ad avere un costo maggiore. La linea rossa costituisce la stima migliore di tale relazione:
Questa linea rossa prende il nome di funzione di ipotesi (o previsione) e si presenta in questa forma:
dove rappresenta la feature, ovvero la caratteristica presa in esame (la dimensione del lotto, lot size), mentre il risultato corrisponde al prezzo previsto.
Tuttavia, è possibile includere molteplici feature, come il numero di bagni o di camere da letto; si può persino ricorrere a funzioni polinomiali delle caratteristiche stesse. Un esempio più complesso è il seguente:
In questo caso, indica ancora la dimensione del lotto (lot size) ma è espresso come funzione quadratica, mentre potrebbe rappresentare il numero di camere da letto (bedrooms).
In uno scenario simile, il compito dell’algoritmo di Machine Learning consiste nell’individuare i pesi corretti affinché la funzione restituisca i risultati ottimali; in altre parole, dovrà calcolare il vettore .
L’uso di matrici e vettori
Definendo arbitrariamente un nuovo valore pari a 1, la funzione di ipotesi può essere riscritta nel modo seguente:
dove è il numero di feature e assume una forma di questo tipo:
Poiché , le due equazioni risultano equivalenti, permettendo così di giungere al formato vettorializzato:
Questa notazione non solo risulta più chiara alla lettura, ma è anche indipendente dal numero di feature e consente di sfruttare funzioni ottimizzate dal punto di vista computazionale, come quelle offerte da pacchetti quali gonum matrix. Il pacchetto gonum si appoggia alle implementazioni BLAS e LAPACK; ulteriori dettagli sono disponibili qui.
Questo primo articolo si conclude con la stesura della funzione di ipotesi in linguaggio Go, sfruttando la funzione mat64.Dot:
func Hypothesis(x, theta *mat64.Vector) float64 {
return mat64.Dot(x, theta)
}
Il codice completo del file è reperibile qui, mentre il relativo test si trova qui.
Nel prossimo articolo dedicato alla regressione lineare verranno implementate la funzione di costo e la discesa del gradiente. La prima serve a misurare l’errore associato a uno specifico insieme di parametri , mentre la seconda è una funzione che farà convergere verso i valori ottimali.
La seconda parte è disponibile qui