此結果是乙個一行n+1列的行向量,我們再將這個結果整體進行一下轉置
當資料樣本比較大時,採用隨機梯度下降法既簡單又高效。將梯度的式子設想一下每一次都隨機取出乙個樣本i,在隨機梯度下降法中,樣本的學習率是乙個非常重要的乙個引數,如果學習率一直取乙個固定值,很有可能隨機梯度下降法已經來到最小值中心左右的位置,但是由於隨機的過程不夠好,eta又是乙個固定值,慢慢的又跳出了最小值所在的位置,所以隨機梯度下降法中學習率是逐漸遞減的,所以要設計乙個函式,讓學習率隨著梯度下降法迴圈次數的增加,相應的eta值越來越小。如下圖所示:
上式是搜尋的方向,並不是梯度的方向。
def fit_sgd(self, x_train, y_train, n_iters=50, t0=5, t1=50):
"""根據訓練資料集x_train, y_train, 使用梯度下降法訓練linear regression模型"""
assert x_train.shape[0] == y_train.shape[0], \
"the size of x_train must be equal to the size of y_train"
assert n_iters >= 1
def dj_sgd(theta, x_b_i, y_i):
return x_b_i.t * (x_b_i.dot(theta) - y_i) * 2.
def sgd(x_b, y, initial_theta, n_iters=5, t0=5, t1=50):
def learning_rate(t):
return t0 / (t + t1)
theta = initial_theta
m = len(x_b)
for i_iter in range(n_iters):
indexes = np.random.permutation(m)
x_b_new = x_b[indexes,:]
y_new = y[indexes]
for i in range(m):
gradient = dj_sgd(theta, x_b_new[i], y_new[i])
theta = theta - learning_rate(i_iter * m + i) * gradient
return theta
x_b = np.hstack([np.ones((len(x_train), 1)), x_train])
initial_theta = np.random.randn(x_b.shape[1])
self._theta = sgd(x_b, y_train, initial_theta, n_iters, t0, t1)
self.intercept_ = self._theta[0]
self.coef_ = self._theta[1:]
return self
梯度下降過程向量化
關於 更新過程的vectorization,andrew ng的課程中只是一帶而過,沒有具體的講解。機器學習實戰 連cost函式及求梯度等都沒有說明,所以更不可能說明vectorization了。但是,其中給出的實現 確是實現了vectorization的,圖4所示 的32行中weights 也就是...
梯度下降法和隨機梯度下降法
批量梯度下降法 batch gradient descent 在更新引數時使用所有的樣本來進行更新 隨機梯度下降法 stochastic gradient descent 求梯度時沒有用所有的m個樣本的資料,而是僅僅選取乙個樣本j來求梯度。小批量梯度下降法 mini batch gradient d...
隨機梯度下降法
剛剛看完史丹福大學機器學習第四講 牛頓法 也對學習過程做一次總結吧。一 誤差準則函式與隨機梯度下降 數學一點將就是,對於給定的乙個點集 x,y 找到一條曲線或者曲面,對其進行擬合之。同時稱x中的變數為特徵 feature y值為 值。如圖 乙個典型的機器學習的過程,首先給出一組輸入資料x,我們的演算...