將梯度式寫為
此處,x0(i)== 1。
若將上式轉置,則可分解為
或者直接寫為下式:
由此,可對我們之前的**進行修改,如下:
def
dj(theta,x_b,y)
:# res = np.empty(len(theta)) # 對每個 theta 求導,所以開闢 len(theta) 個空間
# res[0] = np.sum(x_b.dot(theta) - y) #矩陣第 0 行
# for i in range(1,len(theta)):
# res[i] = (x_b.dot(theta) - y).dot(x_b[:,1]) #矩陣第 1-最後 行
# return res * 2 / len(x_b)
return x_b.t.dot(x_b.dot(theta)
- y)*2
./len(x_b)
新增和之前一樣的波士頓房價資料,對比正規方程式和梯度下降法的**準確度。
若使用正規方程式
from machine_learning.playml.linearregression1 import linearregression
lin_reg1 = linearregression(
)%time lin_reg1.fit_normal(x_train,y_train)
lin_reg1.score(x_test,y_test)
可得如下準確度:
0.8129794056212729
使用梯度下降法
lin_reg2 = linearregression(
)lin_reg2.fit_gd(x_train,y_train)
d:\python\lib\site-packages\numpy\core\fromnumeric.py:
90: runtimewarning: overflow encountered in
reduce
return ufunc.
reduce
(obj, axis, dtype, out,
**passkwargs)
e:\pycharm\word\machine_learning\playml\linearregression1.py:
32: runtimewarning: overflow encountered in square
return np.
sum(
(y - x_b.dot(theta))**
2)/len
(y)e:\pycharm\word\machine_learning\playml\linearregression1.py:
53: runtimewarning: invalid value encountered in double_scalars
if(abs
(j(theta, x_b, y)
- j(last_theta, x_b, y)
)< epsilon)
:linearregression(
)
可看到,傳入 x_train,y_train 兩個引數,程式會報錯,這時候需要修改其他預設引數。
通過修改 eta 的值
lin_reg2.fit_gd(x_train,y_train,eta=
0.000001
)26linearregression(
)27lin_reg2.score(x_test,y_test)
0.27586818724477224
得到只有 0.2……的準確度,我們再試著增大 n_iters 的值
lin_reg2.fit_gd(x_train,y_train,eta=
0.000001
,n_iters=
1e6)
得到了 0.75 的準確度。
lin_reg2.score(x_test,y_test)
0.7542932581943915
準確度比改變引數之前提高了,但是還是比使用正規方程式低。
我們可以通過在梯度下降法前進行資料歸一化來讓準確度提高到使用正規方程式的準確度,步驟如下:
from sklearn.preprocessing import standardscaler
standardscaler = standardscaler(
)standardscaler.fit(x_train)
x_train_standard = standardscaler.transform(x_train)
lin_reg3 = linearregression(
)%time lin_reg3.fit_gd(x_train_standard,y_train)
x_test_standard = standardscaler.transform(x_test)
lin_reg3.score(x_test_standard,y_test)
即可得到如下結果:
0.8129873310487505
總結:使用梯度下降法比正規方程式速度快,資料量越大,速度優勢越明顯。 梯度下降過程向量化
關於 更新過程的vectorization,andrew ng的課程中只是一帶而過,沒有具體的講解。機器學習實戰 連cost函式及求梯度等都沒有說明,所以更不可能說明vectorization了。但是,其中給出的實現 確是實現了vectorization的,圖4所示 的32行中weights 也就是...
梯度下降法的向量化及隨機梯度下降法
此結果是乙個一行n 1列的行向量,我們再將這個結果整體進行一下轉置 當資料樣本比較大時,採用隨機梯度下降法既簡單又高效。將梯度的式子設想一下每一次都隨機取出乙個樣本i,在隨機梯度下降法中,樣本的學習率是乙個非常重要的乙個引數,如果學習率一直取乙個固定值,很有可能隨機梯度下降法已經來到最小值中心左右的...
資料的標準化和標準化方法
資料的標準化 normalization 是將資料按比例縮放,使之落入乙個小的特定區間。在某些比較和評價的指標處理中經常會用到,去除資料的單位限制,將其轉化為無量綱的純數值,便於不同單位或量綱的指標能夠進行比較和加權。其中最典型的就是資料的歸一化處理,即將資料統一對映到 0,1 區間上,常見的資料歸...