2017-01-08 58 views
0

我已經寫了一個梯度下降的功能,並堅持瞭解如何重複for循環「iters」時間。 X是一個二維數組,y是一個二維數組。 y是目標值,X是與目標值對應的數據。我想通過兩者同時遍歷for循環中的zip(),但我也希望能夠重複遍歷X和y,但使用更新後的係數。如何在保持前一個for循環的值的同時重複執行for循環?

我試着在while循環中封裝for循環,但是我得到一個錯誤,說明zip參數#2必須支持迭代。我假設發生的事情是,一旦for循環遍歷2ndarray,編譯器就不能「重置」並再次遍歷數組。我是否正確,我該如何解決這個問題?

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 

編輯:

沒關係,我想通了,這個問題是不是在重複,問題是在這兩個參數具有變量名是Y和在for循環。你可以關閉這個問題。

回答

1

[編輯後] 你說X和y是二維數組。 但你也說X包含你的x值,y包含你的y值。 他們爲什麼是2D?爲什麼不是1D,都有n個元素。 你確定這是正確的(我的意思是2D)? 我希望他們是向量而不是矩陣。 或者你的數組實際上是矩陣包含行還是列向量?

另請注意我用Y而不是y來防止混淆,因爲還有另一個y!另外,除了代碼問題之外,我不會立即在代碼中識別梯度下降,但這可能是我有限的知識。

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

我添加了一些上下文,希望這有助於。 X和Y都是ndarrays。 – user3002486