【python学习笔记】13:用梯度下降法求解最优值问题
2017-05-21 02:25
465 查看
梯度是函数在某点沿每个坐标的偏导数构成的向量,它反映了函数沿着哪个方向增加得最快。因此要求解一个二元函数的极小值,只要沿着梯度的反方向走,直到函数值的变化满足精度即可。
这里打表存储了途径的每个点,最后在图上绘制出来以反映路径。
*梯度下降的具体实现
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):#偏x导 return 1+4*x+2*y def 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=0 y=0#初始选取一个点 tag_x=[x] tag_y=[y] tag_z=[Fun(x,y)]#三个坐标分别打入表中,该表用于绘制点 new_x=x new_y=y Over=False while Over==False: new_x-=step*PxFun(x,y) new_y-=step*PyFun(x,y)#分别作梯度下降 4000 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()
运行结果:
换个角度看:
验证结果是否正确:
相关文章推荐
- 操作系统学习笔记(13) 互斥与同步的经典问题 -哲学家进餐问题
- python学习笔记——多线程同步问题
- python学习笔记13--类和对象
- python 学习笔记13-----多线程编程
- python学习笔记13(模块、包)
- python学习手册笔记--第12~13,15章
- Python学习笔记13:标准库之子进程(subprocess包)
- python 学习笔记-----编码问题
- python3.4学习笔记(五) IDLE显示行号问题,插件安装和其他开发工具介绍
- Python学习笔记(二)--解决中文的问题
- c++学习笔记(13.专题三经典问题解析)
- 算法设计和数据结构学习_3(《数据结构和问题求解》part2笔记)
- [Python]Python学习笔记(八)——问题
- Python 学习笔记 - 13.异常(Exception)
- python学习笔记13-类的设计
- python学习笔记——5_解决问题编写脚本
- Python学习笔记之疑问13:什么是Range
- [Python]python学习笔记(二)——常见问题
- 烙饼排序问题最优次数求解 暑期学习笔记(九)
- python 学习笔记 13 -- 常用的时间模块之time