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

用梯度下降法求解最优值问题

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

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

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)#分别作梯度下降
    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()

运行结果:

换个角度看:

验证结果是否正确:

梯度下降法(Gradient Descent)是一种常用的优化算法,用于求解最优问题。在MATLAB中封装梯度下降法可以使用以下步骤: 1. 定义优化目标函数: 首先要在MATLAB中定义需要优化的目标函数,可以使用匿名函数或者自定义函数来表示。例如,假设要最小化的目标函数是f(x),其中x是一个变量。 2. 计算梯度函数: 确定目标函数f(x)的梯度函数∇f(x),即目标函数在每个变量上的偏导数。可以通过符号计算(Symbolic Math Toolbox)或数近似(Numerical Differentiation)来计算梯度函数。 3. 初始化变量和参数: 定义初始解x0和学习率α。学习率α控制更新变量的步长,可以根据经验进行调整。 4. 迭代更新变量: 使用梯度下降法进行迭代更新变量,直到达到停止准则(例如目标函数足够小或迭代次数达到限制)。每次迭代的更新公式为:x_{t+1} = x_t - α * ∇f(x_t),其中x_{t+1}是下一次迭代的解,x_t是当前解。 5. 返回最优解: 当达到停止准则后,返回最优解x。 下面是一个简单的MATLAB函数示例,封装了梯度下降法求解最优问题: ```matlab function [x_opt, f_opt] = gradient_descent(obj_func, grad_func, x_init, learning_rate, max_iter, tol) % 参数说明: % obj_func: 优化目标函数 % grad_func: 目标函数的梯度函数 % x_init: 初始解 % learning_rate: 学习率 % max_iter: 最大迭代次数 % tol: 停止准则 % 初始化变量 x = x_init; iter = 0; f_opt = obj_func(x); % 迭代更新解 while iter < max_iter % 计算梯度 grad = grad_func(x); % 更新解 x = x - learning_rate * grad; % 计算更新后的目标函数 f = obj_func(x); % 判断停止准则 if abs(f - f_opt) < tol break; end % 更新最优解和目标函数 f_opt = f; iter = iter + 1; end % 返回最优解 x_opt = x; end ``` 使用该函数,可以传入相应的目标函数和梯度函数进行求解。要求目标函数和梯度函数均为符合MATLAB语法的函数。例如,使用该函数求解f(x) = x^2的最小: ```matlab % 目标函数 obj_func = @(x) x^2; % 梯度函数 grad_func = @(x) 2*x; % 初始解 x_init = 4; % 学习率 learning_rate = 0.1; % 最大迭代次数 max_iter = 1000; % 停止准则 tol = 1e-6; % 调用梯度下降法求解最优问题 [x_opt, f_opt] = gradient_descent(obj_func, grad_func, x_init, learning_rate, max_iter, tol); % 输出最优解和最小目标函数 disp(['最优解:', num2str(x_opt)]); disp(['最小目标函数:', num2str(f_opt)]); ``` 通过上述步骤,可以封装梯度下降法求解最优问题的MATLAB函数,并通过传入相应的目标函数和梯度函数实现求解
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值