梯度下降一般用来求解优化问题,我们引入一个非常简单的函数来解释梯度下降。
f(x)=(x-1)^2+1
根据定义,梯度就是函数对自变量的偏导数所组成的向量,这个向量指向函数的最大增长方向,他的模长就是最快增速。(方向导数指函数在某个方向上的变化率,梯度指向最大变化率的方向,它的模长也就是最大的方向导数。在上述方程中只存在平面,所以方向导数是固定的斜率方向上的向量的模长,可以直接理解为导数)
我们随便选取某点,并通过梯度下降进行迭代,以找到极值点。
import random a=random.uniform(0.01,0.05) ## a denotes learning rate 学习率可以是固定的,也可以是随机的 g=2*x-2 # g denotes gradient x=x-a*g print(x)
这段代码清晰地展示了怎样实现一次迭代。我们重复这个过程可以完成迭代。
我们将这段代码进行上千次迭代,并将移动点进行绘图。
import matplotlib.pyplot as plt import numpy as np X=5.5 Y=(X-1)**2+1 all_X=[] all_Y=[] for each in range(10000): gradient=2*(X-1) r=random.uniform(0.01,0.05) X=X-gradient*0.01 Y=(X-1)**2+1 all_X.append(X) all_Y.append(Y) print(X) plotx = np.linspace(-5, 7, 100) ploty=(plotx-1)**2+1 plt.plot(plotx,ploty) ## 把整体的函数图像画出来 plt.axis([-10,11,0,50]) ## 关于坐标轴 plt.scatter(np.array(all_X), np.array(all_Y), color='red') plt.show() ## 绘制并展示我们的迭代点