2017-01-08 3 views
0

Ich habe eine Funktion für den Gradientenabstieg geschrieben und bin dabei, herauszufinden, wie man die "iter" -Zeiten der for-Schleife wiederholt. X ist ein 2d-Array und y ist ein 2d-Array. y ist der Zielwert und X sind die Daten, die dem Zielwert entsprechen. Ich möchte beide gleichzeitig durchlaufen, also die zip() in der for-Schleife, aber ich möchte auch in der Lage sein, durch X und y zu wiederholen, aber mit den aktualisierten Koeffizienten.Wie wiederhole ich eine for-Schleife, während ich Werte aus der vorherigen for-Schleife behalte?

Ich habe versucht, die for-Schleife in eine while-Schleife zu wickeln, aber ich bekomme eine Fehlermeldung, dass das Zip-Argument # 2 Iteration unterstützen muss. Ich gehe davon aus, dass, sobald die for-Schleife durch die zweiten Arrays iteriert, der Compiler nicht mehr "zurücksetzen" und die Arrays erneut durchlaufen kann. Habe ich Recht und wie repariere ich das?

def gradient_descent_lr(X,y,alpha,iters): 
    x_coef = 0 
    y_int = 0 
    coef_list = [] 

    for x, y in zip(X,y): 
     #evaluate func (0 first) 
     f_eval = (x_coef * x) + y_int 
     #find error 
     error = f_eval - y 
     #update coefficients 
     y_int = y_int - (alpha*error) #adjust bias coefficient by the error 
     x_coef = x_coef - (alpha*error*x) 
     coef_list.append((float(y_int),float(x_coef))) 

return coef_list 

EDIT:

Nevermind, ich herausgefunden, dass das Problem in Iterationen nicht war, war das Problem, die Variablennamen in mit wobei y in sowohl das Argumente und in der for-Schleife. Sie können diese Frage schließen.

Antwort

1

[Nach Ihrer Bearbeitung] Sie sagen X und Y sind 2D-Arrays. Aber Sie sagen auch X enthält Ihre x-Werte und y enthält Ihre y-Werte. Warum sind sie 2D? Warum nicht 1D, beide mit n Elementen. Sind Sie sicher, dass das korrekt ist (die 2D meine ich)? Ich würde erwarten, dass sie Vektoren und keine Matrizen sind. Oder enthalten Ihre Arrays tatsächlich Matrizen Zeilen- oder Spaltenvektoren?

Auch beachten Sie, dass ich Y statt y verwendet, um Verwirrung zu vermeiden, da gibt es ein anderes y!

Außerdem erkenne ich, abgesehen von Code-Problemen, nicht sofort Gradientenabfall in Ihrem Code, aber das mag mein begrenztes Wissen sein.

def gradient_descent_lr(X,Y,alpha,iters): 
    x_coef = 0 
    y_int = 0 
    coef_list = [] 

    for x, y in zip (X.tolist(), Y.tolist()): 
     #evaluate func (0 first) 
     f_eval = (x_coef * x) + y_int 
     #find error 
     error = f_eval - y 
     #update coefficients 
     y_int = y_int - (alpha*error) #adjust bias coefficient by the error 
     x_coef = x_coef - (alpha*error*x) 
     coef_list.append((float(y_int),float(x_coef))) 

    return coef_list 
+0

Ich habe etwas Kontext so hoffentlich hinzugefügt, dass hilft. X und Y sind beide ndarrays. – user3002486

Verwandte Themen