Luglio 2015
Volume 30 numero 7
Test Run - regressione lineare utilizzando c#
L'obiettivo di un problema di regressione lineare è di prevedere il valore di una variabile numerica basata sui valori di una o più variabili del preannunciatore numerico. Ad esempio, si potrebbe voler predire il reddito annuo di una persona in base al suo livello di istruzione, anni di esperienza di lavoro e sesso (maschio = 0, femmina = 1).
La variabile di prevedere è solitamente chiamata la variabile dipendente. Le variabili predittive sono di solito chiamate variabili indipendenti. Quando c'è solo una variabile singola predittiva, la tecnica è talvolta chiamata regressione lineare semplice. Quando sono presenti due o più variabili predittive, la tecnica è generalmente chiamata multipli, o regressione multivariata, lineare.
Un buon modo per vedere dove è diretto questo articolo è quello di dare un'occhiata il programma demo in Figura 1. Il programma demo c# predice reddito annuo basato sull'educazione, lavoro e sesso. La demo inizia generando 10 elementi di dati sintetici. Livello di istruzione è un valore compreso tra 12 e 16. Esperienza di lavoro è un valore compreso tra 10 e 30. Il sesso è una variabile indicatore dove maschio è il valore di riferimento, codificato come 0, e la donna è codificata come 1. Reddito, in migliaia di dollari, è nell'ultima colonna. In uno scenario di non-demo, si sarebbe probabilmente leggere dati da un file di testo utilizzando un metodo denominato qualcosa come MatrixLoad.
Figura 1 regressione lineare utilizzando c#
Dopo aver generato i dati sintetici, il programma demo utilizza i dati per creare quello che ha chiamato una matrice di design. Una matrice di design è solo la matrice di dati con una colonna iniziale di tutti i valori 1.0 aggiunto. Esistono diversi algoritmi diversi che possono essere utilizzati per la regressione lineare; Alcune possono utilizzare la matrice di dati grezzi, mentre altri utilizzano una matrice di design. La demo utilizza una tecnica che richiede una matrice di design.
Dopo aver creato la matrice di design, il programma demo rileva che i valori di quattro coefficienti, (1.0180, 12.0157,-2.9566, 0.5489). I coefficienti sono a volte chiamati b-valori o valori di beta. Il primo valore, 12.0157, solitamente è denominato l'intercetta. È una costante non associata a qualsiasi variabile predittiva. Il secondo, i valori del coefficiente di terzo e quarto (1.0180, 0.5489,-2.9566) sono associati con educazione di livello, esperienze lavorative e sesso, rispettivamente.
L'ultima parte dell'output in Figura 1 utilizza i valori dei coefficienti per stimare il reddito per un'ipotetica persona che ha un livello di formazione di 14; 12 anni di esperienza di lavoro; e il cui sesso è 0 (uomo). Il predetto reddito è 32,86, che viene calcolata come segue:
income = 12.0157 + (1.0180)(14) + (0.5489)(12) + (-2.9566)(0)
= 12.0157 + 14.2520 + 6.5868 + 0
= 32.86
In altre parole, per fare una previsione utilizzando la regressione lineare, i valori di predictor vengono moltiplicati per i corrispondenti valori di coefficiente e sommati. È molto semplice. Si noti che il valore iniziale di intercettazione (12.0157 nell'esempio) può essere considerato un coefficiente associato a una variabile predittiva che ha sempre un valore pari a 1. Questo fatto, in parte, spiega la colonna dei valori 1.0 nella matrice.
L'essenza di un problema di regressione lineare è il calcolo dei valori dei coefficienti utilizzando i dati grezzi o, equivalentemente, la matrice di design. Questo non è così facile. La demo utilizza una tecnica chiamata inversione di matrice di forma chiusa, noto anche come il metodo dei minimi quadrati ordinari. Tecniche alternative per trovare i valori dei coefficienti comprendono in modo iterativo reweighted minimi quadrati, stima di massima verosimiglianza, regressione ridge, gradient descent e molti altri.
In Figura 1, prima che la previsione è fatta, il programma demo calcola una metrica chiamata il valore R al quadrato, che è anche chiamato il coefficiente di determinazione. R-squared è un valore compreso tra 0 e 1 che descrive quanto bene il modello di previsione si inserisce i dati grezzi. Questo è talvolta espressa come, "la percentuale di variazione spiegate dal modello". Liberamente interpretata, il più vicino R-squared è a 1, migliore è il modello di previsione. Il valore di demo di 0.7207, o 72 per cento, sarebbe considerato relativamente alto (buono) per i dati reali.
Questo articolo presuppone che hai competenze di programmazione c# almeno intermedio, ma non assumere che si sa nulla di regressione lineare. Il programma demo è troppo lungo per presentare nella sua interezza, ma il codice sorgente completo è disponibile nel download che accompagna questo articolo.
Regressione di comprensione lineare
Regressione lineare è solitamente meglio spiegato utilizzando un diagramma. Date un'occhiata al grafico in Figura 2. I dati del grafico rappresentano la stima del reddito annua da solo una singola variabile, anni di esperienza di lavoro. Ciascuno dei punti rossi corrisponde a un punto dati. Ad esempio, l'elemento più a sinistra dei dati ha lavoro = 10 e income = 32.06. Regressione lineare trova due coefficienti: uno intercetta e uno per la variabile di lavoro. Come si scopre, i valori dei coefficienti sono 27.00 e 0,43.
Figura 2 regressione lineare con una variabile indipendente
I valori di coefficiente determinano l'equazione di una linea, che è indicata in blu in Figura 2. La linea (i coefficienti) minimizza la somma delle deviazioni al quadrato tra i punti di dati effettivi (yi) e i punti di dati stimati (fi). Due delle 10 deviazioni sono indicati con linee tratteggiate in Figura 2. La prima deviazione indicata è yi - fi = 28,6-32,6 = - 4.0. Si noti che le deviazioni possono essere positivi o negativi. Se le deviazioni non erano squadrate, gli aspetti negativi e positivi potrebbero annullarsi a vicenda.
Il grafico in Figura 2 Mostra come semplice regressione lineare, con una sola variabile indipendente, funziona. Regressione lineare multivariata si estende la stessa idea — trovare coefficienti che minimizzano la somma dei quadrati delle deviazioni — utilizzando diverse variabili indipendenti.
Espresso in modo intuitivo, regressione lineare trova la linea migliore attraverso un insieme di punti dati. Questa linea migliore può essere utilizzata per la stima. Ad esempio, in Figura 2, se una persona ipotetica aveva 25 anni di esperienza di lavoro, il suo reddito previsto sulla linea blu sarebbe circa 38.
Risolvendo l'equazione di minimi quadrati
Se un problema di regressione lineare ha variabili predittive n, allora n + 1 coefficiente devono essere trovati valori, uno per ogni fattore predittivo più il valore dell'intercetta. Il programma demo utilizza la tecnica più semplice per trovare i valori di coefficiente. I valori dei coefficienti sono spesso somministrata usando l'equazione un po ' intimidatorio mostrati Figura 3. L'equazione non è così complicato come potrebbe sembrare in primo luogo.
Figura 3 soluzione di coefficienti regressione lineare utilizzando matrici
La lettera greca beta assomiglia ad uno script B e rappresenta i valori di coefficiente. Si noti che tutte le lettere nell'equazione sono in grassetto, che in matematica indica che rappresentano oggetti multivalore (matrici o matrici/vettori) piuttosto che di semplici valori scalari (numeri di piano). Maiuscola X rappresenta la matrice di design. Maiuscola X con esponente T significa la trasposta della matrice. Il * simbolo significa la moltiplicazione di matrici. L'esponente-1 significa inversione di matrice. Maiuscola Y è una vettore (una matrice con una sola colonna) della colonna dei valori di variabile dipendente. Di conseguenza, risolvendo per i valori dei coefficienti davvero significa comprendere operazioni matriciali.
I diagrammi in Figura 4 illustrano la trasposizione della matrice, la moltiplicazione di matrici e inversione di matrice. La trasposta di una matrice scambia solo righe e colonne. Si supponga, ad esempio, che si dispone di una matrice 2 x 3, che è, uno con 2 righe e 3 colonne. La trasposta della matrice sarà 3 x 2 dove le righe della matrice originale diventano le colonne della matrice trasposta.
Figura 4 tre operazioni di matrice utilizzate per trovare i coefficienti di regressione lineare
Moltiplicazione di matrici può sembrare un po' strana se non hai incontrato prima. Se si moltiplica un (n x m) dimensioni volte matrice un (m x p) dimensioni matrice, il risultato è un (n x p) dimensioni matrice. Ad esempio, un 3 x 4 * è una matrice 4 x 2 dimensioni 3 x 2. Una discussione dettagliata di moltiplicazione di matrici è fuori dall'ambito di questo articolo, ma dopo aver visto alcuni esempi, il processo è facile da capire e facile da implementare nel codice.
La terza operazione di matrice dovuta risolvere per i valori del coefficiente di regressione lineare è inversione di matrice, che, purtroppo, è difficile da afferrare e difficile da attuare. Ai fini di questo articolo, è sufficiente sapere che che l'inverso di una matrice è definito solo se la matrice ha lo stesso numero di righe e colonne (una matrice quadrata). Figura 4Mostra una matrice 3 x 3 e la sua inversa.
Esistono diversi algoritmi che possono essere utilizzati per trovare l'inversa di una matrice. Il programma demo utilizza una tecnica chiamata decomposizione di Doolittle.
Per riassumere, un problema di regressione lineare con variabili predittive n consiste nel trovare i valori per n + 1 coefficienti. Questo può essere fatto utilizzando matrici con la trasposizione di matrice, la moltiplicazione di matrici e inversione di matrice. Recepimento e moltiplicazione sono facili, ma trovare l'inversa di una matrice è difficile.
La struttura del programma Demo
Per creare il programma demo, ho lanciato Visual Studio e selezionato il modello di progetto applicazione console. Ho chiamato il progetto LinearRegression. Il programma non ha significative .NET Framework dipendenze quindi funzionerà con qualsiasi versione di Visual Studio .
Dopo il codice del modello caricati nell'editor, nella finestra Esplora soluzioni selezionata sul file Program.cs e la rinominò a LinearRegressionProgram.cs. Mi è permesso Visual Studio su autorinominare automaticamente classe Program. Nella parte superiore della finestra dell'Editor, ho cancellato tutto utilizzando istruzioni ad eccezione di quello che fa riferimento allo spazio dei nomi di primo livello di sistema.
La struttura complessiva del programma demo, con alcune modifiche minori per risparmiare spazio, è presentata Figura 5. Tutta la logica di controllo del programma è nel metodo Main. Il programma demo utilizza un approccio di metodo statico, piuttosto che un approccio OOP.
Figura 5 struttura di programma del Demo regressione lineare
using System;
namespace LinearRegression
{
class LinearRegressionProgram
{
static void Main(string[] args)
{
Console.WriteLine("Begin linear regression demo");
// Generate synthetic data
// Create design matrix
// Solve for LR coefficients
// Calculate R-squared value
// Do a prediction
Console.WriteLine("End linear regression demo");
Console.ReadLine();
}
static double Income(double x1, double x2,
double x3, double[] coef) { . . }
static double RSquared(double[][] data,
double[] coef) { . . }
static double[][] DummyData(int rows,
int seed) { . . }
static double[][] Design(double[][] data) { . . }
static double[] Solve(double[][] design) { . . }
static void ShowMatrix(double[][] m, int dec) { . . }
static void ShowVector(double[] v, int dec) { . . }
// ----------
static double[][] MatrixTranspose(double[][] matrix)
{ . . }
static double[][] MatrixProduct(double[][] matrixA,
double[][] matrixB) { . . }
static double[][] MatrixInverse(double[][] matrix)
{ . . }
// Other matrix routines here
}
} // ns
Reddito di metodo restituisce un reddito previsto dai parametri di input con valori per livello di istruzione, esperienza di lavoro e sesso, utilizzando una matrice di valori di coefficiente. Metodo RSquared restituisce il valore di R al quadrato del modello dai dati e i coefficienti. Metodo DummyData genera i dati sintetici utilizzati per la demo.
Progettazione metodo accetta una matrice di dati e restituisce una matrice di design aumentata con una colonna iniziale dei valori 1.0. Risolvere metodo accetta una matrice di progettazione e utilizza operazioni matriciali per trovare i coefficienti di regressione lineare.
La maggior parte del duro lavoro è fatto da un insieme di metodi static che eseguono operazioni di matrice. Il programma demo definisce una matrice nel modo più semplice possibile, come una matrice di matrici. Un'alternativa consiste nel creare una classe di matrice definita dal programma, ma a mio parere che l'approccio è inutilmente complicata. Le matrici a volte ordinarie sono meglio di oggetti definito dal programma.
Metodo MatrixTranspose restituisce la trasposizione di una matrice. Metodo MatrixProduct restituisce il risultato della moltiplicazione di due matrici. Metodo MatrixInverse restituisce l'inversa di una matrice. La demo ha molti metodi di supporto. In particolare, il metodo MatrixInverse chiama metodi di supporto MatrixDuplicate, MatrixDecompose e HelperSolve.
Il metodo Solve
Il cuore del programma demo regressione lineare è il metodo Solve. Definizione del metodo inizia con:
static double[] Solve(double[][] design)
{
int rows = design.Length;
int cols = data[0].Length;
double[][] X = MatrixCreate(rows, cols - 1);
double[][] Y = MatrixCreate(rows, 1);
...
Il singolo parametro di input è una matrice di design. Un approccio alternativo che si potrebbe voler prendere in considerazione è quello di passare la matrice di dati di origine e quindi hanno Solve chiamare metodo di supporto Design per ottenere la matrice di design. Metodo di supporto MatrixCreate alloca spazio per e lo restituisce una matrice con il numero specificato di righe e colonne. Il locale X matrice contiene i valori delle variabili indipendenti (con un valore di interlinea 1,0). La matrice Y locale ha una sola colonna e contiene i valori della variabile dipendente (reddito annuo nella demo).
Successivamente, le cellule in matrici X e Y vengono popolate utilizzando i valori nella matrice:
int j;
for (int i = 0; i < rows; ++i)
{
for (j = 0; j < cols - 1; ++j)
{
X[i][j] = design[i][j];
}
Y[i][0] = design[i][j]; // Last column
}
Si noti che j variabile di indice è dichiarato fuori il nidificati per i cicli in modo può essere utilizzato per popolare la matrice Y. Con le matrici di X e Y in mano, si possono trovare i coefficienti di regressione lineare secondo l'equazione mostrata Figura 3:
...
double[][] Xt = MatrixTranspose(X);
double[][] XtX = MatrixProduct(Xt, X);
double[][] inv = MatrixInverse(XtX);
double[][] invXt = MatrixProduct(inv, Xt);
double[][] mResult = MatrixProduct(invXt, Y);
double[] result = MatrixToVector(mResult);
return result;
} // Solve
Nella demo, matrice X ha dimensioni 10 x 4 quindi sua trasposta, Xt, ha dimensioni 4 x 10. Il prodotto di Xt e X ha dimensioni 4 x 4 e l'inverso, inv, ha anche dimensioni 4 x 4. In generale, per un problema di regressione lineare con le variabili del preannunciatore indipendente n, quando si utilizza la tecnica di inversione di matrice che è necessario trovare l'inversa di una matrice con dimensione (n + 1) x (n + 1). Ciò significa che la tecnica di inversione non è adatta per problemi di regressione lineare che hanno un enorme numero di variabili predittive.
Il prodotto della matrice inversa 4x4 e la matrice trasposta di 4 x 10, invXt nel codice, ha dimensioni 4 x 10. Il prodotto di invXt e la matrice Y 10 x 1, mResult ("risultato di matrice") nel codice, ha dimensioni 4 x 1. Questi valori sono i coefficienti che avete bisogno. Per comodità, i valori nella matrice singola colonna Y sono trasferiti alla matrice ordinaria utilizzando il metodo di supporto MatrixToVector.
Calcolo di R al quadrato
Come osservato in precedenza, la metrica di R al quadrato è una misura di quanto bene i punti di dati effettivi bene la retta di regressione calcolata. In termini matematici, R al quadrato è definito come R2 = 1 - (SSres / SStot). Il termine SSres viene solitamente chiamato "la somma residua dei quadrati". È la somma delle differenze al quadrato tra i valori effettivi di Y e i valori stimati di Y, come illustrato nel grafico in Figura 2. Il termine SStot è la "somma dei quadrati totale." È la somma del quadrato differisconoze tra ogni valore reale di Y e la media (media) di tutti i reali valori di Y.
La metrica di R al quadrato nella regressione lineare è anche chiamata il coefficiente di determinazione ed è relativo a, ma diverso da, un'altra statistica metrica denominata r-squared ("poco r al quadrato"). Interpretazione di R-squared è un po' difficile e dipende dal problema particolare dominio sotto inchiesta. Per le scienze naturali e sociali, dove i dati sono in genere disordinato e incompleto, un valore di R al quadrato di 0,6 o superiore è spesso considerato abbastanza buono.
C'è una misura alternativa della varianza spiegata dal modello di regressione chiamato il rettificato R al quadrato. Questa metrica prende in considerazione il numero di variabili predittive e il numero di elementi di dati. Maggior parte dei casi, utilizzando il valore di R al quadrato di piano è abbastanza buono per avere un'idea della qualità predittiva di un modello di regressione lineare.
Avvolgendo
Se si cerca il Internet per esempi di come eseguire la regressione lineare utilizzando un linguaggio di programmazione, non troverete molto molti riferimenti. Penso che ci sono due ragioni principali per questa relativa mancanza di informazioni. In primo luogo, risolvere per i coefficienti di regressione lineare utilizzando operazioni matriciali è abbastanza difficile, soprattutto a causa dell'operazione di inversione di matrice. In qualche modo, ritengo che il metodo MatrixInverse del programma demo di essere tra le routine di codice più complicate che abbia mai scritto. In secondo luogo, ci sono un sacco di esistenti strumenti stand-alone che possono eseguire la regressione lineare, in particolare, il programma di foglio di calcolo di Excel con il componente aggiuntivo di analisi dei dati. È relativamente raro necessario incorporare direttamente codice soluzione regressione lineare in un sistema software.
Regressione lineare è stato studiato per decenni e ci sono molti modi per estendere la tecnica. Ad esempio, è possibile introdurre i cosiddetti effetti di interazione che combinano due o più variabili predittive. Queste estensioni sono a volte chiamate modelli lineari generali per distinguerli dalla forma base della regressione lineare.
A mio parere, la regressione lineare è la tecnica di "Hello World" della statistica classica. Non non c'è nessun chiaro, universalmente concordato distinzione tra statistica classica e apprendimento automatico, ma io tendo a pensare di tecniche statistiche classiche come quelle che prima sono stati studiati dai matematici a partire all'inizio del Novecento. Nella mia mente, tecniche di machine learning, come classificazione di rete neurale, sono quelli che sono più recenti, per la prima volta negli anni cinquanta. Regressione lineare classica statistiche è strettamente correlata a una macchina tecnica chiamata regressione logistica, che è stato l'argomento di diverse colonne di esecuzione dei Test di apprendimento.
Dr. James McCaffrey lavora per Microsoft Research in Redmond, WA Ha lavorato su diversi prodotti Microsoft, inclusi Internet Explorer e Bing. Dr. McCaffrey può essere raggiunto a jammc@microsoft.com.
Grazie all'esperto tecnico Microsoft Research seguente per la revisione di questo articolo: Charles Parker