Ich analysiere einige Daten, bei denen ich eine normale lineare Regression durchführen möchte. Dies ist jedoch nicht möglich, da ich es mit einer Online-Einstellung mit einem kontinuierlichen Strom von Eingabedaten zu tun habe (die schnell zu groß für Speicher werden) und benötigt um Parameterschätzungen zu aktualisieren, während diese verbraucht werden. Das heißt, ich kann nicht einfach alles in den Speicher laden und eine lineare Regression für den gesamten Datensatz durchführen.
Ich gehe von einem einfachen linearen multivariaten Regressionsmodell aus
Welcher Algorithmus eignet sich am besten, um eine kontinuierlich aktualisierte Schätzung der linearen Regressionsparameter und zu erstellen ?b
Im Idealfall:
- Ich hätte gerne einen Algorithmus, der die meiste Raum- und Zeitkomplexität pro Aktualisierung aufweist, wobei die Dimensionalität der unabhängigen Variablen ( ) und die Dimensionalität der abhängigen Variablen ( ).N x M y
- Ich möchte in der Lage sein, einige Parameter anzugeben, um zu bestimmen, wie stark die Parameter von jeder neuen Stichprobe aktualisiert werden, z. B. würde 0,000001 bedeuten, dass die nächste Stichprobe ein Millionstel der Parameterschätzung liefern würde. Dies würde eine Art exponentiellen Zerfalls für die Wirkung von Proben in der fernen Vergangenheit ergeben.
Antworten:
Maindonald beschreibt eine sequentielle Methode, die auf Givens Rotationen basiert . (A Givens - Rotation ist eine orthogonale Transformation der zwei Vektoren , die in einer der Vektoren einen gegebenen Eintritts Nullen.) Bei dem vorherigen Schritt die zerlegt haben Designmatrix in eine Dreiecksmatrix über eine orthogonale Transformation so dass . (Es ist schnell und einfach, die Regressionsergebnisse aus einer Dreiecksmatrix zu erhalten.) Wenn Sie an eine neue Zeile unterhalb von angrenzen , erweitern Sie effektiv um eine Zeile ungleich Null Sagen Sie auchT Q Q X = ( T , 0 ) ' v X ( T , 0 ) ' t T T t T QX T Q. QX=(T,0)′ v X (T,0)′ t . Die Aufgabe besteht darin, diese Zeile auf Null zu setzen, während die Einträge in der Position von diagonal bleiben. Eine Folge von Givens-Rotationen führt dies aus: Die Rotation mit der ersten Zeile von das erste Element von auf ; dann setzt die Drehung mit der zweiten Zeile von das zweite Element auf Null und so weiter. Der Effekt ist, dass durch eine Reihe von Rotationen vormultipliziert wird , was seine Orthogonalität nicht ändert.T T t T Q
Wenn die Entwurfsmatrix Spalten enthält (was bei der Regression von Variablen plus einer Konstanten der Fall ist ), überschreitet die Anzahl der erforderlichen Umdrehungen nicht und jede Umdrehung ändert zwei -Vektoren. Der für benötigte Speicher ist . Somit hat dieser Algorithmus sowohl zeitlich als auch räumlich einen Rechenaufwand von .p p + 1 p + 1 T O ( ( p + 1 ) 2 ) O ( ( p + 1 ) 2 )p+1 p p+1 p+1 T O((p+1)2) O((p+1)2)
Mit einem ähnlichen Ansatz können Sie die Auswirkung des Löschens einer Zeile auf die Regression bestimmen. Maindonald gibt Formeln; so tun Belsley, Kuh & Welsh . Wenn Sie also nach einem sich bewegenden Fenster für die Regression suchen, können Sie die Daten für das Fenster in einem Ringpuffer speichern, der an das neue Datum angrenzt, und bei jeder Aktualisierung das alte löschen. Dies verdoppelt die Aktualisierungszeit und erfordert zusätzlichen Speicher für ein Fenster mit der Breite . Es scheint, dass das Analogon des Einflussparameters wäre.k 1 / kO(k(p+1)) k 1/k
Für den exponentiellen Zerfall denke ich (spekulativ), dass Sie diesen Ansatz an gewichtete kleinste Quadrate anpassen könnten, indem Sie jedem neuen Wert eine Gewichtung größer als 1 zuweisen. Es sollte nicht erforderlich sein, einen Puffer mit vorherigen Werten zu pflegen oder alte Daten zu löschen.
Verweise
JH Maindonald, Statistische Berechnung. J. Wiley & Sons, 1984. Kapitel 4.
DA Belsley, E. Kuh, RE Welsch, Regressionsdiagnostik: Identifizierung von Einflussdaten und Quellen der Kollinearität. J. Wiley & amp; Söhne, 1980.
quelle
Ich denke, wenn Sie Ihr lineares Regressionsmodell in ein Zustandsmodell umwandeln , erhalten Sie das, wonach Sie suchen. Wenn Sie R verwenden, können Sie das Paket dlm verwenden und sich das Begleitbuch von Petris et al.
quelle
Sie können die Summe der Quadrate, die für die Parameter Ihres Modells kosten, immer nur mit einem Gefälle absteigen . Nehmen Sie einfach den Gradienten, aber entscheiden Sie sich nicht für die geschlossene Form, sondern nur für die Suchrichtung.WE W
Lassen sind die Kosten der i - ten Trainingsprobe gegeben die Parameter . Ihr Update für den j-ten Parameter lautet dannWE(i;W) W
Wobei eine Schrittrate ist, die Sie über eine Kreuzvalidierung oder ein gutes Maß auswählen sollten.α
Dies ist sehr effizient und die Art und Weise, wie neuronale Netze typischerweise trainiert werden. Sie können sogar viele Samples (z. B. 100) effizient parallel verarbeiten.
Natürlich können auch komplexere Optimierungsalgorithmen (Impuls, konjugierter Gradient, ...) angewendet werden.
quelle
Überrascht hat dies bisher noch niemand angerührt. Die lineare Regression hat eine quadratische Zielfunktion. Ein Newton-Raphson-Schritt von jedem Ausgangspunkt aus führt Sie direkt zum Optima. Angenommen, Sie haben bereits eine lineare Regression durchgeführt. Die Zielfunktion ist:
Jetzt haben Sie einige vergangene Daten erhalten und eine lineare Regression durchgeführt. Sie sitzen mit Ihren Parametern ( ). Der Gradient an diesem Punkt ist per Definition Null. Der Hessische ist wie oben angegeben. Ein neuer Datenpunkt ( ) kommt an. Sie berechnen die Steigung für den neuen Punkt einfach über:β xnew,ynew
Fügen Sie dies dem oben angegebenen alten Hessischen hinzu. Dann machen Sie einfach einen Schritt nach Newton Raphson.
Und du bist fertig.
quelle
Die standardmäßige Anpassung der kleinsten Quadrate ergibt Regressionskoeffizienten
Wenn beispielsweise M = 1 ist, ist der eine Koeffizient
Jedes Mal, wenn Sie einen neuen Datenpunkt erhalten, aktualisieren Sie beide Summen, berechnen das Verhältnis und erhalten den aktualisierten Koeffizienten.
quelle
Das Problem lässt sich leichter lösen, wenn Sie die Dinge ein wenig umschreiben:
Y = y
X = [x, 1]
dann
Y = A * X
Eine einmalige Lösung wird durch Berechnung gefunden
V = X '* X
und
C = X '* Y
Beachten Sie, dass das V die Größe N-by-N und C die Größe N-by-M haben sollte. Die Parameter, die Sie suchen, sind dann gegeben durch:
A = inv (V) * C
Da sowohl V als auch C durch Summieren Ihrer Daten berechnet werden, können Sie A bei jeder neuen Stichprobe berechnen. Dies hat jedoch eine zeitliche Komplexität von O (N ^ 3).
Da V quadratisch und semi-definit positiv ist, existiert eine LU-Zerlegung, die die Invertierung von V numerisch stabiler macht. Es gibt Algorithmen zur Durchführung von Rang-1-Aktualisierungen der Inverse einer Matrix. Finden Sie diese und Sie haben die effiziente Implementierung, die Sie suchen.
Die Update-Algorithmen für Rang 1 finden Sie in "Matrix-Berechnungen" von Golub und van Loan. Es ist ein hartes Material, aber es bietet einen umfassenden Überblick über solche Algorithmen.
Hinweis: Die obige Methode liefert bei jedem Schritt eine Schätzung der kleinsten Quadrate. Sie können den Aktualisierungen von X und Y ganz einfach Gewichte hinzufügen. Wenn die Werte von X und Y zu groß werden, können sie mit einem einzelnen Skalar skaliert werden, ohne das Ergebnis zu beeinflussen.
quelle