Regressione lineare online efficiente


53

Sto analizzando alcuni dati in cui vorrei eseguire la regressione lineare ordinaria, tuttavia ciò non è possibile in quanto ho a che fare con un'impostazione online con un flusso continuo di dati di input (che diventerà rapidamente troppo grande per la memoria) e di cui ho bisogno per aggiornare le stime dei parametri mentre questo viene consumato. cioè non posso semplicemente caricare tutto in memoria ed eseguire la regressione lineare sull'intero set di dati.

Sto assumendo un semplice modello di regressione multivariata lineare, vale a dire

y=UNX+B+e

Qual è l'algoritmo migliore per creare una stima in continuo aggiornamento dei parametri di regressione lineare e b ?UNB

Idealmente:

  • Vorrei un algoritmo che è la maggior parte dello spazio e la complessità del tempo per aggiornamento, dove N è la dimensionalità della variabile indipendente ( x ) e M è la dimensionalità della variabile dipendente ( y ).O(NM)NXMy
  • Vorrei poter specificare alcuni parametri per determinare quanto i parametri vengono aggiornati da ogni nuovo campione, ad esempio 0,000001 significherebbe che il prossimo campione fornirebbe un milionesimo della stima dei parametri. Ciò darebbe una sorta di decadimento esponenziale per l'effetto dei campioni in un lontano passato.

2
Cerca (1) regressione lineare flessibile, (2) filtri Kalman.
Jase,

Risposte:


31

Maindonald descrive un metodo sequenziale basato sulle rotazioni di Givens . (Una rotazione di Givens è una trasformazione ortogonale di due vettori che azzera una data voce in uno dei vettori.) Nel passaggio precedente hai decomposto la matrice di disegno in una matrice triangolare T tramite una trasformazione ortogonale Q in modo che Q X = ( T , 0 ) . (È facile e veloce ottenere i risultati della regressione da una matrice triangolare.) Adiacente ad una nuova riga v sotto X , si estende effettivamente ( T , 0 )XTQQX=(T,0)'vX per una riga diversa da zero, dire t . Il compito è di azzerare questa riga mantenendo le voci nella posizione di T diagonale. Una sequenza di rotazioni di Givens fa questo: la rotazione con la prima fila dizeri T è il primo elemento di t ; quindi la rotazione con la seconda riga di T zeri il secondo elemento e così via. L'effetto è la premoltiplicazione di Q per una serie di rotazioni, che non cambia la sua ortogonalità.(T,0)'tTTtTQ

Quando la matrice di progettazione ha colonne (come nel caso della regressione su variabili p più una costante), il numero di rotazioni necessarie non supera p + 1 e ogni rotazione cambia due v + 1 p. La memoria necessaria per T è O ( ( p + 1 ) 2 ) . Quindi questo algoritmo ha un costo computazionale di O ( ( p + 1 ) 2 ) sia nel tempo che nello spazio.p+1pp+1p+1TO((p+1)2)O((p+1)2)

Un approccio simile consente di determinare l'effetto sulla regressione dell'eliminazione di una riga. Maindonald dà delle formule; così fanno Belsley, Kuh e Welsh . Pertanto, se stai cercando una finestra mobile per la regressione, puoi conservare i dati per la finestra all'interno di un buffer circolare, contiguo al nuovo dato e rilasciando quello vecchio con ogni aggiornamento. Questo raddoppia il tempo di aggiornamento e richiede ulteriore memoria per una finestra di larghezza k . Sembra che 1 / k sarebbe l'analogo del parametro influenza.O(K(p+1))K1/K

Per il decadimento esponenziale, penso (speculativamente) che potresti adattare questo approccio ai minimi quadrati ponderati, dando a ogni nuovo valore un peso maggiore di 1. Non dovrebbe esserci alcuna necessità di mantenere un buffer di valori precedenti o eliminare qualsiasi vecchio dato.

Riferimenti

JH Maindonald, calcolo statistico. J. Wiley & Sons, 1984. Capitolo 4.

DA Belsley, E. Kuh, RE Welsch, Diagnostica della regressione: identificazione di dati influenti e fonti di collinearità. J. Wiley & Sons, 1980.


1
Il metodo descritto da Maindonald è correlato o uguale all'algoritmo di Gentleman? jstor.org/stable/2347147
onestop il

6
In tal caso, vedi anche le estensioni di Alan Miller jstor.org/stable/2347583 . Un archivio del suo sito software Fortran è ora su jblevins.org/mirror/amiller
onestop

5
Un algoritmo esplicito appare nella parte inferiore di p. 4 di saba.kntu.ac.ir/eecd/people/aliyari/NN%20%20files/rls.pdf . Questo può essere trovato da Google "minimi quadrati ricorsivi". Non sembra un miglioramento dell'approccio Gentleman / Maindonald, ma almeno è chiaramente ed esplicitamente descritto.
whuber

2
L'ultimo link sembra il metodo che stavo per suggerire. L'identità matrice che usano è conosciuta in altri luoghi come identità Sherman - Morrison - Woodbury. È anche abbastanza numericamente efficiente da implementare, ma potrebbe non essere stabile come una rotazione di Givens.
cardinale

2
@suncoolsu Hmm ... Il libro di Maindonald è stato appena pubblicato quando ho iniziato a usarlo :-).
whuber

8

Penso che riformulare il tuo modello di regressione lineare in un modello di spazio-stato ti darà quello che stai cercando. Se usi R, potresti voler usare il pacchetto dlm e dare un'occhiata al libro di accompagnamento di Petris et al.


forse sono confuso ma questo sembra riferirsi a un modello di serie storiche? il mio modello è in realtà più semplice in quanto i campioni non sono una serie temporale (in realtà sono campioni indipendenti (x-> y), sono semplicemente accumulati in grandi volumi nel tempo)
Mikera,

1
Sì, nel caso generale questo è usato per serie temporali con osservazioni non indipendenti; ma puoi sempre assumere l'incorrelazione tra osservazioni successive, il che ti dà il caso speciale di interesse.
F. Tusell,

7

È sempre possibile solo eseguire discesa del gradiente sulla somma dei quadrati costato WRT i parametri del modello W . Basta prenderne il gradiente ma non optare per la soluzione a modulo chiuso ma solo per la direzione di ricerca.EW

Let sia il costo della formazione esimo campione indicata parametri W . L'aggiornamento per il parametro j'th è quindiE(io;W)W

WjWj+αE(io;W)Wj

dove è un indice progressivo, che dovresti scegliere tramite validazione incrociata o buona misura.α

Questo è molto efficiente e il modo in cui le reti neurali sono in genere addestrate. È possibile elaborare anche molti campioni in parallelo (diciamo circa 100) in modo efficiente.

Naturalmente possono essere applicati algoritmi di ottimizzazione più sofisticati (quantità di moto, gradiente coniugato, ...).


Sembra molto simile a questo documento eprints.pascal-network.org/archive/00002147/01/… . È stato implementato in un progetto open source chiamato jubatus.
saccarina

3

Sorpreso, nessun altro l'ha toccato finora. La regressione lineare ha una funzione obiettivo quadratica. Quindi, un passo di Newton Raphson da qualsiasi punto di partenza ti porta direttamente all'optima. Ora, supponiamo che tu abbia già fatto la tua regressione lineare. La funzione obiettivo è:

L(β)=(y-Xβ)t(y-Xβ)
Il gradiente diventa
L(β)=-2Xt(y-Xβ)
E l'assia:
2L(β)=XtX

Ora, hai ottenuto alcuni dati passati e fatto una regressione lineare e stai seduto con i tuoi parametri ( β ). Il gradiente a questo punto è zero per definizione. L'assia è come indicato sopra. Arriva un nuovo punto dati ( Xnew,ynew ). Basta calcolare il gradiente per il nuovo punto tramite:

Lnew(β)=-2Xnew(ynew-XnewTβ)
e questo diventerà il gradiente generale (poiché il gradiente dai dati esistenti era zero). L'assia per il nuovo punto dati è:

2Lnew=XnewXnewT
.

Aggiungi questo al vecchio Assia sopra indicato. Quindi, fai un passo da Newton Raphson.

βnew=βold+(2L)-1Lnew

E hai finito.


1
Lnewp,O(p3)

O(p3)p(io-UN)-1=io+UN+UN2+...

2

La misura standard del minimo quadrato fornisce coefficienti di regressione

β=(XTX)-1XTY

β

XTXXTYM2+Mβ

Ad esempio, se M = 1, quindi un coefficiente è

β=Σio=1NXioyioΣio=1NXio2

quindi ogni volta che ottieni un nuovo punto dati aggiorni entrambe le somme e calcoli il rapporto e ottieni il coefficiente aggiornato.

XTXXTY(1-λ)λ


2
β

XTXXTY . Ogni elemento di quelle matrici è una somma come nell'esempio M = 1. O mi sta sfuggendo qualcosa?
Mark Higgins,

6
X'X

1
C-1XCXzt+1=zt+X-CztzC-1Xt

1

Il problema si risolve più facilmente quando si riscrivono un po 'le cose:

Y = y

X = [x, 1]

poi

Y = A * X

Una soluzione una tantum si trova calcolando

V = X '* X

e

C = X '* Y

notare che la V dovrebbe avere dimensioni N-per-N e C una dimensione di N-per-M. I parametri che stai cercando sono quindi dati da:

A = inv (V) * C

Poiché sia ​​V che C vengono calcolati sommando i dati, è possibile calcolare A ad ogni nuovo campione. Questo ha una complessità temporale di O (N ^ 3), tuttavia.

Poiché V è quadrato e semi-definito positivo, esiste una decomposizione LU che rende l'inversione di V numericamente più stabile. Esistono algoritmi per eseguire aggiornamenti di grado 1 all'inverso di una matrice. Trova quelli e avrai l'implementazione efficiente che stai cercando.

Gli algoritmi di aggiornamento di rango 1 si trovano nei "calcoli Matrix" di Golub e van Loan. È un materiale duro, ma ha una panoramica completa di tali algoritmi.

Nota: il metodo sopra fornisce una stima del minimo quadrato ad ogni passaggio. È possibile aggiungere facilmente pesi agli aggiornamenti di X e Y. Quando i valori di X e Y diventano troppo grandi, possono essere ridimensionati da un singolo scalare, senza influire sul risultato.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.