梯度下降法-python实现(个人学习+记录,望大佬指正)

使用Python的sympy库,通过梯度下降法寻找三元函数f(x,y,z)=x^2+y^2+z^2+2x+4y-6z的极值点。初始点设为(20,20,20),学习率为0.03,最终找到的极小值点为(-0.9882, -1.9877, 3.0095),极小值为-13.9997。实际计算表明该点为函数的极小值点,Hessian矩阵正定。
摘要由CSDN通过智能技术生成

梯度下降法:以三元函数f(x,y,z) = x^2 + y^2 + z^2 + 2x + 4y - 6z 为例,求其极值及极值点
python代码实现:

from sympy import *
import time
def gradient_descent():
    x = symbols('x')
    y = symbols('y')
    z = symbols('z')
    w = x**2 + y**2 + z**2 + 2*x + 4*y - 6*z
    x1 = 20
    y1 = 20
    z1 = 20
    alpha = 0.03
    dx = diff(w, x).subs({x: x1, y: y1, z: z1})
    dy = diff(w, y).subs({x: x1, y: y1, z: z1})
    dz = diff(w, z).subs({x: x1, y: y1, z: z1})
    last_result = (w.subs({x: x1, y: y1, z: z1}))                    # 先上升一步以进行后面的收敛判断
    x1 -= alpha * dx
    y1 -= alpha * dy
    z1 -= alpha * dz
    this_result = (w.subs({x: x1, y: y1, z: z1}))
    time_start = time.time()
    while abs(this_result - last_result) > 0.0001:   # 收敛条件:|f(x^k)-f(x^k+1)|<& (&取参数,代表下降已经不明显即收敛)
         last_result = (w.subs({x: x1, y: y1, z: z1}))
         dx = diff(w, x).subs({x: x1, y: y1, z: z1})
         dy = diff(w, y).subs({x: x1, y: y1, z: z1})
         dz = diff(w, z).subs({x: x1, y: y1, z: z1})
         x1 -= alpha * dx
         y1 -= alpha * dy
         z1 -= alpha * dz
         this_result = (w.subs({x: x1, y: y1, z: z1}))
    time_end = time.time()

    print("优化结果:x="+str(x1))
    print("\t\ty= " + str(y1))
    print("\t\tz= " + str(z1))
    print("\t\tmin f(x,y) = " + str(this_result))
    print('总时间:', time_end - time_start)
gradient_descent()

最后的输出:

优化结果:x=-0.988232354405425
		y= -1.98767199032949
		z= 3.00952618929085
		min f(x,y) = -13.9996631667427
总时间: 0.7430148124694824

实际根据多元函数极值求法求得的极值点:
在这里插入图片描述
注:A为三元函数的Hessian矩阵,A矩阵正定说明(-1,-2,3)为极小值点

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值