2017-08-10 148 views
2
def computeCost(X, y, theta): 
    inner = np.power(((X * theta.T) - y), 2) 
    return np.sum(inner)/(2 * len(X)) 

def gradientDescent(X, y, theta, alpha, iters): 
    temp = np.matrix(np.zeros(theta.shape)) 
    params = int(theta.ravel().shape[1]) #flattens 
    cost = np.zeros(iters) 

    for i in range(iters): 
     err = (X * theta.T) - y 

     for j in range(params): 
      term = np.multiply(err, X[:,j]) 
      temp[0, j] = theta[0, j] - ((alpha/len(X)) * np.sum(term)) 

     theta = temp 
     cost[i] = computeCost(X, y, theta) 

    return theta, cost 

下面是在教程中找到的線性迴歸成本函數和漸變下降的代碼,但我不太清楚它是如何工作的。Python代碼中的線性迴歸梯度下降

首先,我得到了computeCost代碼是如何工作的,因爲它只是(1/2M),其中M是數據的數量。

對於gradientDescent代碼,我只是不明白它是如何工作的總稱。我知道更新的θ的公式是一樣的東西

theta = theta - (learningRate) * derivative of J(cost function)。但我不知道在哪裏alpha/len(X)) * np.sum(term)這來自線上更新temp[0,j]

請幫我理解!

回答

1

我會爲你解決這個問題。因此,在您的gradientdecent函數中,您正在獲取作爲訓練參數的預測變量(X),目標變量(y), 權重矩陣(theta)和另外兩個參數(alphaiters)。該函數的工作是確定預測變量(X)集中的每列應該在加法之前相乘多少以獲得目標變量(y)的預測值。 在函數的第一行中,您將啓動一個稱爲temp的權重矩陣爲零。這基本上是該函數最終將輸出的最終權重矩陣(theta)的起始點。變量params基本上是權重的數量或預測變量的數量。 在創建特徵抽象的神經網絡環境中,這條線更有意義。

在線性迴歸中,權重矩陣將主要是一維數組。在一個典型的前饋神經網絡中,我們可以使用5個特徵,通過使用權重矩陣等將其轉換爲4或6或n個特徵。在線性迴歸中,我們只需將所有輸入 特徵提煉成一個輸出特徵。所以theta將基本上相當於一個行向量(這是明顯的行temp[0,j]=...)和params將是功能的數量。我們cost數組只是在每次迭代中存儲數組 。現在進入兩個循環。在第一個for循環下的err = (X * theta.T) - y行中,我們計算每個訓練示例的預測誤差 。 err變量的形狀爲number of examples,1。在第二個循環中,我們正在訓練模型, 即我們正在逐步更新我們的term矩陣。我們運行第二個循環iters 次。在神經網絡的情況下,我們通常稱之爲時代。這基本上是你想要訓練模型的次數。

現在行term = np.multiply(err, X[:,j]):這裏我們計算應該對temp矩陣中的每個權重進行單獨調整。 我們將成本定義爲(y_predicted-y_actual)** 2/number_of_training_points,其中y_predicted = X_1 * w_1 + X_2 * w_2 + X_3 * w_3 + ...如果我們將此成本與 區分開來, )我們得到(y_predicted-y_actual)*(X_i)/ number_of_training_points其中X_i是W_i乘以的列。所以term =行 基本上計算該差異部分。我們可以將term變量乘以學習率並從W_i中減去。 但是,您可能會注意到term變量是一個數組。但是這在下一行中會被處理。 在下一行中,我們取term的平均值(將它們加起來然後除以len(X)) ,並從temp矩陣中的相應權重中減去它。一旦權重已被更新和存儲,並且temp矩陣, 我們用temp取代原來的theta。我們重複這個過程iters次數

+0

之前檢查過wiki感謝您的解釋。所以你說「這個詞=行基本上是計算這個差異化的部分」,但我仍然沒有看到這裏的差異化是如何工作的。該術語將X值與(X * theta.T)-y的誤差相乘,但這與差異有什麼關係? – Dukakus17

+0

當你區分與theta相關的錯誤時,你得到'X *(X * theta.T-y)' –

0

如果是你,而不是像((alpha/len(X)) * np.sum(term))寫它,寫它像(alpha * (np.sum(term)/len(X))),這你允許這樣做,因爲乘法和除法是comutative(如果我沒記錯的術語),那麼你只用平均誤差乘α,因爲無論如何,術語都是長度X.

這意味着你可以減去學習率(α)乘以平均誤差,這將是類似於X [j] * tetha(actual) - y(理想)的東西,它偶然也足夠接近(X * tetha - y)^ 2

+1

它不是可交換的嗎? – Y0da

+0

我知道我錯了。應該在我發佈 –