№ xlii L'Almanacco di GST · EN IT

Enrico·rubbo.li

Tech · Longevity · Mercati · Opinioni Enrico Rubboli, propr. Dubai, UAE
tech October 1, 2015 3 min

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:

Windsor, ON house prices · lot size vs price · red line = hypothesis

Questa linea rossa prende il nome di funzione di ipotesi (o previsione) e si presenta in questa forma:

hθ(x)=θ0+θ1xh_{\theta}(x) = \theta_0 + \theta_1 x

dove xx rappresenta la feature, ovvero la caratteristica presa in esame (la dimensione del lotto, lot size), mentre il risultato hθ(x)h_\theta(x) 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:

hθ(x)=θ0+θ1x1+θ2x12+θ3x2+θ4x22h_{\theta}(x) = \theta_0 + \theta_1 x_1 + \theta_2 x_1 ^ 2 + \theta_3 x_2 + \theta_4 x_2 ^ 2

In questo caso, x1x_1 indica ancora la dimensione del lotto (lot size) ma è espresso come funzione quadratica, mentre x2x_2 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 θ=θ0,θ1,θ2,θ3,θ4\theta = \langle\theta_0,\theta_1,\theta_2,\theta_3,\theta_4\rangle.

L’uso di matrici e vettori

Definendo arbitrariamente un nuovo valore x0x_0 pari a 1, la funzione di ipotesi può essere riscritta nel modo seguente:

hθ(x)=θ0x0+θ1x1+θ2x2+θ3x3+θ4x4=j=0nθjxjh_{\theta}(x) = \theta_0 x_0 + \theta_1 x_1 + \theta_2 x_2 + \theta_3 x_3 + \theta_4 x_4 = \displaystyle\sum_{j=0}^{n}\theta_j x_j

dove nn è il numero di feature e xx assume una forma di questo tipo:

x=[x0=1x1xn]x = \begin{bmatrix} x_0 = 1 \\ x_1 \\ \vdots \\ x_n \end{bmatrix}

Poiché x0=1x_0=1, le due equazioni risultano equivalenti, permettendo così di giungere al formato vettorializzato:

hθ(x)=θTxh_{\theta}(x) = \theta^T x

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 θ\theta, mentre la seconda è una funzione che farà convergere θ\theta verso i valori ottimali.

La seconda parte è disponibile qui