问题引入
可以应用于机器学习(Python)的梯度下降寻找最小值
计算:
minf(x) = x1 - x2 + 2x1^2 + 2x1x2 + x2^2
给定初始值 X^(0) = (0,0)^T
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import numpy as np
def Fun(x,y):
return x - y + 2 * x * x + 2 * x * y + y * y
def pxFun(x,y):
return + 4 * x + 2 * y
def pyFun(x,y):
return -1 + 2 * x + 2 * y
fig = plt.figure()
ax = Axes3D(fig)
X,Y = np.mgrid[-2:2:40j, -2:2:40j] #取样并作满射联合
Z = Fun(X,Y) #取样点Z坐标打表
ax.plot_surface(X,Y,Z, rstride = 1, cmap = "rainbow")
ax.set_xlabel('x')
ax.set_ylable('y')
ax.set_zlable('z')
#梯度下降
strp = 0.008 # 取步长
x = 0
y = 0
tag_x = [x]
tag_y = [y]
tag_z = [Fun(x,y)] #绘制点
new_x = x
new_y = y
Over = Flase
while Over == False :
new_x -= step * PxFun(x,y)
new_y -= step * PyFun(x,y)
if Fun(x,y) - Fun(new_x, new_y) < 7e-9:
Over = True
x = new_x
y = new_y
tag_x.append(x)
tag_y.append(y)
tag_z.append(Fun(x,y)) # 新点的3个坐标打入表中
ax.plot(tag_x,tag_y,tag_z,'r')
plt.title('(x,y)~('+str(x)+"," + str(y) +')')
plt.show()