梯度下降法
梯度下降法,又叫最速下降法,是一种最优化算法。它用负梯度方向为搜索方向的,最速下降法越接近目标值,步长越小,前进越慢。
梯度下降法的计算过程就是沿着梯度下降的方向求解极小值。(亦可以沿着梯度上升的方向求解极大值)。它的迭代公式为:
ak+1=ak+γks−(k)(式1−1)
其中, s−(k) 代表的是梯度的负方向, γk 表示梯度方向上的搜索步长。梯度方向可以通过求导得到,步长的设定则比较麻烦,太大的容易发散,找不到极小值的点,太小的话则收敛的速度比较慢。
- 示例
现有函数 f(x)=x4−3x3+2 ,则利用梯度下降方法解题的步骤如下:
1.求梯度,即对函数求导, f,(x)=4x3−9x2 ;
2.根据式1-1,向梯度相反的方向移动 x ;
3.循环迭代步骤2,直到x的值变化到使得f(x) 在两次迭代之间的差值足够小,比如0.00000001,也就是说,直到两次迭代计算出来的 f(x) 基本没有变化,则说明此时 f(x) 已经达到局部最小值了。
4.此时,输出 x ,此时求得的x 就是使得 f(x) 取得最小值的 x 的值。 - 代码
#python 代码
# encoding=utf-8
x_old = 0
x_new = 6
gamma = 0.01
precision = 0.00000001
# x = Symbol("x")
# f = (x ** 4) - (3 * (x ** 3)) + 2
#梯度下降算法
def df(x):
y = 4 * x**3 - 9 * x**2
return y
while abs(x_new - x_old) > precision:
x_old = x_new
x_new += -gamma * df(x_old)
print "The local minimum occurs at", x_new//The local minimum occurs at 2.24999996819
利用数学知识可以求得函数 f(x)=x4−3x3+2 的极小值在 94 取得,即2.25,代码求得的结果是2.24999996819,已经满足小于0.00000001的条件,可以发现代码是正确的。