Python实现梯度下降

具体数学原理我就不写了,这里只大讲一下数学公式
g r a d ∣ f ( x , y ) = ∂ f ∂ x i ⃗ + ∂ f ∂ y j ⃗ grad\mid{f(x,y)}=\frac{\partial f}{\partial x}\vec{i} +\frac{\partial f}{\partial y}\vec{j} gradf(x,y)=xfi +yfj (二维)


g r a d ∣ f ( x , y , z ) = ∂ f ∂ x i ⃗ + ∂ f ∂ y j ⃗ + ∂ f ∂ z k ⃗ grad\mid{f(x,y,z)}=\frac{\partial f}{\partial x}\vec{i} +\frac{\partial f}{\partial y}\vec{j} +\frac{\partial f}{\partial z}\vec{k} gradf(x,y,z)=xfi +yfj +zfk (三维)
最重要的是理解概念,因为以后出现更高维的就画不出来了。

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 1+4*x+2*y
def PyFun(x,y):
    return -1+2*x+2*y
fig=plt.figure(dpi=400)
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,cstride=1,cmap="rainbow")
ax.set_xlabel("x")
ax.set_ylabel("y")
ax.set_zlabel("z")

#梯度下降设置步长
step=0.0008
x=-2
y=-2
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)
    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,'k')
plt.title('(x,y)~('+str(x)+","+str(y)+')')
plt.show()

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值