2014-09-20 78 views
0

我是機器學習新手,我試圖通過梯度下降對f(x)= kx進行線性迴歸。爲什麼梯度下降這種簡單的線性迴歸工作?

d(f(x)-y)^2/dk 

=2(f(x)-y) * d(kx-y)/dk 

=2x(f(x)-y) 

=2x(kx-y) 

因此,通過k = k - rate * 2x(kx-y)更新K,通過梯度下降。

而這正是它是怎麼說的教科書上,所以我想這將工作:-(

from random import uniform 
k,k0=uniform(-100,100),uniform(-100,100) 
for _ in range(10): 
    x=uniform(-100,100) 
    k=k-0.01*x*(k*x-k0*x) 
    print k,k0 

可悲的是,輸出:在鐓粗速度

-2639.75970458 -72.294275335 
56444.9277867 -72.294275335 
-350533.559366 -72.294275335 
-315222.824967 -72.294275335 
26481249.7869 -72.294275335 
25795070.4808 -72.294275335 
-329558179.012 -72.294275335 
22212688252.9 -72.294275335 
-2.2317104093e+11 -72.294275335 
1.61788553661e+12 -72.294275335 

k偏離k0 :-(

我已經閱讀了wiki,谷歌和這個頁面右側推薦的問題,但不知道:-(Tnanks很多

+0

我看到unutbu已經很好地回答了你的問題,但我只想補充一點,這是對'種子()'隨機數生成器非常有用。當數字不斷變化時,試圖調試使用隨機數的程序可能會很煩人。 :)你可以提供'random.seed()'作爲種子,例如數字或字符串;如果你省略了種子或者提供'None',那麼它會以系統時間(這是默認種子)播種。 – 2014-09-20 11:26:41

回答

2

讓你的「學習率」(例如0.01),更小和迭代次數,N,較大:

from random import uniform 
learning_rate = 0.0001 
N = 100 
k, k0 = uniform(-100, 100), uniform(-100, 100) 
for _ in range(N): 
    x = uniform(-100, 100) 
    k = k - learning_rate * x * (k * x - k0 * x) 
    print k, k0