梯度下降法(Gradient descent)或最速下降法(steepest descent)是求解无约束最优化问题的一种常用的、实现简单的方法。
梯度下降算法就是用迭代的方法尽可能快地找出一个函数中的最优值,有一个比较恰当的比喻就是你在爬山的时候,突然女朋友打电话叫你回家吃饭,这个时候你就要找最短的路径和最准确的方向到底山的最底点处,这里的山就是待优化的表达式,最低点就是要找的最优值,每走一段距离,你都要停下来再次确认一下方向,这段距离就是学习率,而引领你寻找方向的信息就是样本数据,我们要做的就是找到最佳的学习率,既不偏离方向,又能耗时最少。
第k+1次的迭代值:
image.png
import numpy as np
import matplotlib.pyplot as plt
import matplotlib
def f(x):
return x*x
def h(x):
return 2*x
X=[]
Y=[]
x=2
step=0.8
f_change=f(x)
f_current=f(x)
X.append(x)
Y.append(f_current)
while f_change>np.e**-10:
x=x-step*h(x)
tmp=f(x)
f_change=np.abs(f(x)-f_current)
f_current=tmp
X.append(x)
Y.append(f_current)
print(X)
print(Y)
print(x,f_current)
fig=plt.figure()
a=np.arange(-2.15,2.15,0.05)
b=a**2
plt.plot(a,b)
plt.plot(X,Y,"ro--") #这里的r代表绿色,o代表圆点,--代表短划线
plt.show()
step=0.8时的运行结果:
image.png
step=1时的运行结果:
image.png
当然,学习率不同的时候,得出的结果是不一样的,如果学习率过大,每次迭代更新的时候变化比较大,可能会偏离下山的方向,从而找到的最低点可能会偏移最优值;如果学习率过小,每走一小步,都要确认一下,迭代的次数就会增加;因此,要根据具体的情况,选择多次不同初始值运行算法,最终返回最小情况下的结果值,找到比较合适的学习率。
网友评论