from mpl_toolkits.mplot3d import Axes3D
# 定义原函数
def f(x1, x2):
return 0.2 * (x1 + x2) ** 2 - 0.3 * x1 * x2 + 0.4
# 定义梯度函数(导函数)
def gradient_x1(x1, x2):
return 0.4 * (x1 + x2) - 0.3 * x2
def gradient_x2(x1, x2):
return 0.4 * (x1 + x2) - 0.3 * x1
# 定义学习率
eta = 1.5
# 定义x1,x2与y的轨迹列表。
x1_list = []
x2_list = []
y_list = []
# 定义初始位置
x1, x2 = 4.5, 4.5
for i in range(50):
# 轨迹列表加入相应的轨迹
x1_list.append(x1)
x2_list.append(x2)
y_list.append(f(x1, x2))
x1 = x1 - eta * gradient_x1(x1, x2)
x2 = x2 - eta * gradient_x2(x1, x2)
# display(x1_list)
# display(x2_list)
# display(y_list)
X1 = np.arange(-5, 5, 0.1)
X2 = np.arange(-5, 5, 0.1)
# 网状结构。
# X1看做一个列向量,会沿着行进行扩展。扩展的行数与X2元素的个数相同。
# X2看做一个行向量,会沿着列进行扩展。扩展的列数与X1元素的个数相同。
# 返回扩展之后的X1与X2。(经过扩展之后,X1与X2的形状是相同的。)
# meshgrid扩展的目的:经过扩展之后,我们就可以获得任意X1与X2中元素的组合。(例如Ptyhon zip)
X1, X2 = np.meshgrid(X1, X2)
Y = f(X1, X2)
fig = plt.figure()
# 创建3D绘图对象,在参数(figure)上进行绘图。
ax = Axes3D(fig)
# 绘制曲面图。
ax.plot_surface(X1, X2, Y, rstride=5, cstride=5, cmap="rainbow")
ax.plot(x1_list, x2_list, y_list, "bo--")