理論基礎
現在比如有兩個參數的損失函數此時比如我們站在此點上,想要快速到達谷底(也就是使J函數達到極小值)。此時我們放眼望去,環望四周,很自然的向此時坡最陡的方向的下方邁上一步,接著在繼續重復我們的過程,直到四周都比當下高 (此時)為止,就是走到谷底(J函數達到極小值),完成目標。
這時會不會有人問為什么會是極小值。
這時我們重新找一個點
跟上面的過程一樣,我們再走一遍
你瞅瞅,是不是到達另一個谷底。所以說,這種方法找的是局部的最小值,也就是全局的極小值。這種方法就是梯度下降算法。 此時介紹梯度下降算法,簡單起見,我們從一個變量開始,比如此時我們的損失函數J是
此時的導數值為正數,我們要向它的相反方向走一步,到達如圖所示點
不斷的重復上面公式的過程,直到
我們再考慮隨機點在左邊的情況。比如取點如圖所示:
此時的J在theta_1點的導數
此時我們應該向右走,則此時的表達式為
更新后
跟上面的過程一樣,直到更新到導數為0或特別小為止。 由此可見,無論導數正負,表達式一樣。所以我們規定梯度下降算法的更新過程就是
此時我們具體談談alpha:
而alpha取值過大,則還會有這種情況:
永遠找不到極小值。
alpha先大后小。(根據實驗情況而定)
現在我們再回歸到我們的
我們對它進行優化的表達式為:
這里有個誤區,正確的更新過程是這樣的:
等更新完再賦值。
更新完的theta_0在temp1的更新過程中被調用,此時已經不是之前的theta_0了。切記。
代碼實踐
這是個擬合直線的代碼實現。
我們要將數據統一收縮到 [-1 - 1] 之間。
X = ( X - average(X) ) / X.max
Y = ( Y - average(Y) ) / Y.max
為什么要這么做呢?
因為如果不做縮小處理,在矩陣運算時,非常有可能出現無窮大或者無窮小,導致無法計算。
縮小處理可以很容易畫出模擬線條。
縮小處理在計算機中處理速度更快。
我們看看圖:
這里我設置a = 0.01是為了下面的模擬直線除數不為0設置的。一般情況下,初始化 a = b = 0。(這里a, b就是上面的theta_0,theta_1)
下面進行矩陣化:
上面圖片的y1 - y4是預測值
下面代碼的Y是真實值
預測值函數
擬合線段形成過程
更新過程
最終的線段是
注:代碼實現以上圖片來自2014stanford機器學習視頻
我的公眾號,喜歡的可以關注我呀。
公眾號二維碼.png