公式:
公式解释:用w减去其目标函数对w求得的偏导数乘以一个常数,之后所得到的新值再次赋值给w
上面的这个凸函数是一个二次函数,在点w处求得其梯度,也就是该点的导数值,该点的导数值表示该点下降的快,还是慢,它形容的是一个程度,是一个比重,不是一个具体的大小长短,类似于一个百分比,5%或者150%。那么如何让它变得有大小长短呢,那就给他一个单位距离,也就是步长也就是公式中乘上的。如果导数值很大,其就要往“前”走的大胆一点,走的长一点,那么单位步长乘以一个大的导数值是不是会将距离变得很大,这样可以更加快速的逼近极值点,当w点接近极值点的时候,
可以发现w点处的导数值是变得离0更近了,那么乘以一步长就相当于把步长缩小了,那么就向“前”走了一点点,此时走一点点,是因为已经要接近极值点了,所以它要一点一点的逼近极值点。所以,偏导数是一个程度的度量不是一个具体的大小,只有乘上了一个有长度有大小的量,其才能发挥真正的作用。
# f(x)=x^2 - 6x + 9
def f_grad(x):
return 2*x - 6
def gradientDescent():
x = 0
next_x = 1
alpha = 0.1
eps = 0.00001
while abs(x - next_x) > eps:
x = next_x
next_x = x - alpha*f_grad(x)
print next_x
return next_x
x_mid = gradientDescent()
print (x_mid)
可以从上面的这个例子看到,开始的时候下降的特别快,但是当进入到最后的时候,下降的长度变得很小了,越来越逼近极值点x=3。