梯度下降法
所谓的梯度实际上就是多元函数的 导数,对于 $n$ 元函数 $f(x_1,x_2, \cdots, x_n)$ 的梯度是一个长度为 $n$ 的向量,其中向量中第 $k$ 个元素为函数 $f$ 对 $x_k$ 的偏导数。
$$ \nabla f(x_1, x_2, \cdots, x_n) = \left( \frac{\partial f}{\partial x_1}, \frac{\partial f}{\partial x_2}, \cdots, \frac{\partial f}{\partial x_n} \right) $$
从几何意义上来说,这个向量的指向是函数变化最快的方向。
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
def Rosenbrock(x, y):
return (1 - x) ** 2 + 100 * (y - x ** 2) ** 2
step = 0.05
X, Y = np.meshgrid(np.arange(-2, 2 + step, step), np.arange(-2, 3 + step, step))
Z = Rosenbrock(X, Y)
fig = plt.figure()
ax = fig.gca(projection='3d')
surf = ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap=plt.get_cmap('hsv'))
fig.colorbar(surf, shrink=0.3, aspect=10)
ax.contour(X, Y, Z, zdir='z', offset=-2, cmap=plt.get_cmap('hsv'))
plt.show()