2016-06-08 4 views
0

Ich habe den Pseudo-Code, aber ich habe immer noch Schwierigkeiten, Ridge-Regression im Online-Modus zu implementieren. Ich benutze Dualform, also weiß ich nicht, wie man ein, neben anderen Schwierigkeiten aktualisiert. Der Pseudocode ist here.Regularisierungsparameter in On-line-Ridge-Regression

Bisher habe ich folgendes geschrieben:

Eingang ist: x (1), ..., x (m) m-Vektoren und y (1), ..., y (m) Ziele .

Ausgang ist: f (x 1), ..., f (x [m]) Modellvorhersagen

Ridge.Regression<-function(m,x){ 

b<- rep(0,m) 

A<- a * diag(nrow(x)) 

for (t in 1:m){ 

    pred[,t]<- b * (solve(A) %*% x[t,]) 

    A<- A + x[t,] %*% x[t,] 

    b<- y[t] * x[t,] 

    b<- b + (y[t] * x[t,]) 

    return(pred)}} 

Was ich oben nicht funktioniert getan. Etwas falsch mit der Initialisierung des Eingangsvektors b und der Matrix A?

Es ist nicht sinnvoll, einen konstanten Wert des Parameters a zu haben. Wir verwenden die Kreuzvalidierung beim Batch-Lernen. Was zum Online-Lernen zu verwenden?

+0

Was genau meinen Sie mit "funktioniert nicht"? Wie testen Sie diese Funktion? Wenn Sie Fragen zu statistischen Methoden haben, sollten Sie sich besser bei [stats.se] erkundigen. – MrFlick

+0

Ridge.Regression (m = 200, x = Daten) und a = 2, bekomme ich non-conformable Argumente in Lösung (A)% *% x [t,].x Ich habe 1 Spalte und 200 Zeilen und das gleiche für y verwendet. – Waqas

Antwort

0

In Ihrem Code sind einige Maßabweichungen vorhanden. Basierend auf meinem Verständnis haben Sie eine Stichprobengröße von n und m Prädiktoren oder Regressoren zur Auswahl.

Lets gehen Schritt für Schritt.

  1. Ich bezog Ihren Link und Gamma ist ein 1 X 1 Wert. Stattdessen haben Sie pred [, t] als n X 1. Sie kann sich auf pred[,t] als pred[t] Sie haben auch den Vektor b mit Abmessungen von 1 m anstelle von n um 1.
  2. auch feststellen, dass die anfängliche Wahl der Matrix A
    diagonal ist. Bitte verwenden Sie nicht solve, um eine diagonale Matrix zu invertieren. solve ist ideal zu verwenden, wenn Ihre Matrix keine spezielle Struktur hat. solve ist eine teure Operation für R durchzuführen.
  3. Wenn Sie A aktualisieren, müssen Sie erkennen, dass A eine Matrix von n nach n ist. Der anfängliche Matrixwert ist diagonal mit dem Tuning-Parameter. Wenn Ihre schreiben x[t,] %*% x[t,] Sie Matrix-Multiplikation von zwei n durch 1 Vektoren durchführen Die Aufträge nicht pendeln. Schreiben Sie stattdessen x[t,] %*% t(x[t, ]) Dies stellt sicher, dass Sie eine n-by-n-Matrix erstellen.
  4. b wird nicht richtig aktualisiert. Was Sie tun, ist ersetzt den ursprünglichen Vektor von Nullen und Aktualisieren von y[t] * x[t,] Sie aktualisieren dann b wieder. Die dritte Zeile in Ihrer für Schleife sieht für mich redundant aus.

Warum Sie dieses Stück Code nicht versuchen

set.seed(54) # a random seed 
n <- 100  # sample size 
m <-40  # number of predictors 

# create n X m design matrix 
x <- matrix(runif(n), nrow = n, ncol = m) 

# Initialize b with zero vector 
b <- rep(0, n) 

y <- rnorm(m) # m by 1 vector 

a <- 5  # choice of tuning parameter depends on user 
A <- diag(a, n) 
pred <- rep(0, n) #initialize output 
    Ridge.Regression<-function(m, x, b, a, n){ 
     #Arguments X must be a design matrix 
     # m is the number of predictors 
     # b is n X 1 vector 
     # n is the sample size 
     # a is the tuning parameter 
     # Function returns predicted values. 


    ainv <- (1/a) 
    Ainv <- diag(ainv, n) 
    for (t in 1:m){ 

    pred[t] <- t(b) %*% (Ainv %*% x[,t]) 

    A <- A + x[,t] %*% t(x[, t]) 
    Ainv <- solve(A) # using solve since A may not have special sturcture 

    b <- b + (y[t] * x[,t]) # update b 
    } 
    return(pred) 
    } 

Ich hoffe, das Ihnen eine gute Antwort.

+0

Ich kann immer noch nicht die Antwort bekommen. Ich bekomme Fehler Ainv% *% x [t,]: nicht konforme Argumente! – Waqas

+0

Ich habe es bearbeitet Es sollte die t-th-Spalte sein. –

+0

Hey! das funktioniert gut, danke! – Waqas