梯度下降算法用于:求函数的极小值。
我们要从山坡上下来,首先要决定好自变量的方向,然后迈出步伐。重复多次,就能到达山谷的底部(极小值)。
1.首先,我们在函数定义域里面随机选取的值。
2.然后,我们需要定义误差和学习率
的值。
:到达某个位置时,山坡已经足够平滑(坡度小于
),我们可以认为到达了谷底,即收敛到了极小值。
:决定好方向后,迈出的步长。常用的做法是,依次尝试如下取值:
3.确定好了现在的位置(设定初始值),我们开始迈出第一步:
当前函数下降最快的方向,也就是函数梯度的反方向,是最快抵达山谷的方向。
求当前位置的导数值:,新位置:
(1)
这样,我们就离山谷进了一步。
4.重复第三步,也就是迭代式(1),直到坡度足够平滑时(当前坡度小于可以接受的误差
),
即为梯度下降算法收敛至函数极小值时,自变量的值。
代码实现:
import numpy as np
import matplotlib.pyplot as plt
def f(x):
return pow(x - 2.5, 2) + 3
def df(x):
return 2 * x - 5
n = 0.01 #学习率
e = 0.001 #误差
x0 = -7.5 #初值
x = x0 #自变量
xs = [] #x的迭代过程记录
while 1:
dy = df(x)
if abs(dy) < e: break
x = x - n * dy
xs.append(x)
print(f"极小值点x={x}, 极小值为f(x)={f(x)}")
xs1 = np.arange(-7.5, 12.5)
xs2 = np.array(xs)
plt.plot(xs1, f(xs1)) #曲线图
plt.scatter(xs2, f(xs2), color="red", marker=".") #散点图
plt.show()
运行结果: