2014-09-20 55 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