【python学习笔记】13:用梯度下降法求解最优值问题

来源:互联网 发布:盒饭网络销售怎么做 编辑:程序博客网 时间:2024/06/01 23:49


梯度是函数在某点沿每个坐标的偏导数构成的向量,它反映了函数沿着哪个方向增加得最快。因此要求解一个二元函数的极小值,只要沿着梯度的反方向走,直到函数值的变化满足精度即可。

这里打表存储了途径的每个点,最后在图上绘制出来以反映路径。

*梯度下降的具体实现

import matplotlib.pyplot as pltfrom mpl_toolkits.mplot3d import Axes3Dimport numpy as npdef Fun(x,y):#原函数    return x-y+2*x*x+2*x*y+y*ydef PxFun(x,y):#偏x导    return 1+4*x+2*ydef PyFun(x,y):#偏y导    return -1+2*x+2*y#初始化fig=plt.figure()#figure对象ax=Axes3D(fig)#Axes3D对象X,Y=np.mgrid[-2:2:40j,-2:2:40j]#取样并作满射联合Z=Fun(X,Y)#取样点Z坐标打表ax.plot_surface(X,Y,Z,rstride=1,cstride=1,cmap="rainbow")ax.set_xlabel('x')ax.set_ylabel('y')ax.set_zlabel('z')#梯度下降step=0.0008#下降系数x=0y=0#初始选取一个点tag_x=[x]tag_y=[y]tag_z=[Fun(x,y)]#三个坐标分别打入表中,该表用于绘制点new_x=xnew_y=yOver=Falsewhile 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))#新点三个坐标打入表中#绘制点/输出坐标ax.plot(tag_x,tag_y,tag_z,'r.')plt.title('(x,y)~('+str(x)+","+str(y)+')')plt.show()

运行结果:



换个角度看:



验证结果是否正确: