常规函数的梯度下降python(非机器学习梯度下降)

说明

梯度下降在应用于回归方程(机器学习中的)和一般函数有一些方法上的区别。一般函数没有样本的干扰所以相对来说考虑的东西比较少,上代码

代码

#-*-coding:utf-8-*-
import sympy as sy
import numpy as np
def gradient_descent(symbol_expression,independent_vars_dict,alpha,epsilon=0.001):
    '''
    symbol_expression Symbol表达式,即数学公式
    independent_vars_dict symbol_expression中变量和初始值
    alpha 步长
    epsilon 停止条件
    '''

    delta=1e6
    result_rec = symbol_expression.subs(independent_vars_dict)
    #记录开始的点和值
    step_recs=[]
    val=independent_vars_dict.copy()
    val['value']=result_rec.evalf()
    step_recs.append(val)

    _vars=list(independent_vars_dict.keys())
    vars_dict={}
    for i in _vars:
        vars_dict[i]=symbol_expression.diff(i)
    while delta>epsilon:
        for j in _vars:
            independent_vars_dict[j]=independent_vars_dict[j]-alpha*vars_dict[j].subs(independent_vars_dict).evalf()
        result_last=result_rec
        result_rec = symbol_expression.subs(independent_vars_dict)
        #记录每次的值
        val = independent_vars_dict.copy()
        val['value'] = result_rec.evalf()
        step_recs.append(val)

        if np.abs(result_rec-result_last)<=epsilon:
            break
    return step_recs,result_rec

x=sy.Symbol('x')
y=sy.Symbol('y')
z=-(sy.exp(-(x**2+y**2)/2)/(2*sy.pi))
m={x:np.random.randint(-3,3),y:np.random.randint(-3,3)}
step=0.01
u=gradient_descent(z,m,step,0.00001)

#3维曲面图
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import axes3d #这不能删

Y=X=np.linspace(-3,3,100)
X,Y=np.meshgrid(X,Y)
Z=(-np.exp(-(X**2+Y**2)/2)/(2*np.pi))
fig=plt.figure()
ax =fig.gca(projection='3d')
ax.plot_surface(X, Y, Z,rstride=1,cstride=1,cmap=plt.get_cmap('bwr'))


#3维曲面增加记号,梯度过程
t=np.array([list(j.values()) for j in u[0]])
print(t)
ax.plot(t[...,0],t[...,1],t[...,2],marker='^',c='k')
plt.show()

结果图

在这里插入图片描述
二维的标准正态分布,取负方程求的梯度下降,见黑色那条线。gradient_descent可以用于多维,了解一下,可以弄懂的。ε≡٩(๑>₃<)۶ 一心向学

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值