优化算法之梯度下降|Matlab实现梯度下降算法

news2024/11/25 7:57:09

题目要求:

使用Matab实现梯度下降法

对于函数:
min ⁡ f ( x ) = 2 x 1 2 + 4 x 2 2 − 6 x 1 − 2 x 1 x 2 \min f(x)=2 x_{1}^{2}+4 x_{2}^{2}-6 x_{1}-2 x_{1} x_{2} minf(x)=2x12+4x226x12x1x2
试采用 MATLAB实现最速下降法求解该问题, 给出具体的迭代过程、 最终优化结果、涉及的代码, 以及自己的心得体会。

摘要

文章主要通过实现grad()函数进行梯度运算。

主要实现的功能:

  1. 通过Matlab语言实现梯度下降算法
  2. 利用Matlab的plot3描绘出梯度下降循环迭代的过程,同时也描绘出极小值随迭代次数的图像。

梯度下降原理

梯度的概念

梯度:是一个向量,表示某一函数在该点处的方向导数沿着该方向取得最大值。

  • 有大小:变化率最大(为该梯度的模);

  • 有方向:函数在该点处沿着该方向(此梯度的方向)变化最快

定义:
z = f ( x , y ) z=f(x,y) z=f(x,y)在点 P 0 ( x 0 , y 0 ) P_{0}\left(x_{0}, y_{0}\right) P0(x0,y0)处存在偏导数 f x ′ ( x 0 , y 0 ) f_{x}^{\prime}\left(x_{0}, y_{0}\right) fx(x0,y0) f y ′ ( x 0 , y 0 ) f_{y}^{\prime}\left(x_{0}, y_{0}\right) fy(x0,y0),则称向量 { f x ′ ( x 0 , y 0 ) , f y ′ ( x 0 , y 0 ) } \left\{f_{x}^{\prime}\left(x_{0}, y_{0}\right), f_{y}^{\prime}\left(x_{0}, y_{0}\right)\right\} {fx(x0,y0),fy(x0,y0)} f ( x , y )  在  P 0 ( x 0 , y 0 ) f(x, y) \text { 在 } P_{0}\left(x_{0}, y_{0}\right) f(x,y)  P0(x0,y0)的梯度,记作:

∇ f ∣ P 0 , ∇ z ∣ P 0 , gradf ⁡ ∣ P 0 或 gradz ⁡ ∣ P 0 \left.\nabla f\right|_{P_{0}},\left.\nabla z\right|_{P_{0}},\left.\operatorname{gradf}\right|_{P_{0}} 或 \left.\operatorname{gradz}\right|_{P_{0}} fP0,zP0,gradfP0gradzP0
∴ ∇ f ∣ P 0 = gradf ⁡ ∣ P 0 = { f x ′ ( x 0 , y 0 ) , f y ′ ( x 0 , y 0 ) } \left.\therefore \nabla f\right|_{P_{0}}=\left.\operatorname{gradf}\right|_{P_{0}}=\left\{f_{x}^{\prime}\left(x_{0}, y_{0}\right), f_{y}^{\prime}\left(x_{0}, y_{0}\right)\right\} fP0=gradfP0={fx(x0,y0),fy(x0,y0)}
其中: ∇ \nabla (Nabla)算子:
∇ = ∂ ∂ x i + ∂ ∂ y j \nabla=\frac{\partial}{\partial x} i+\frac{\partial}{\partial y} j =xi+yj

梯度函数:

梯度的大小:

∣ ∇ f ∣ = [ f x ′ ( x , y ) ] 2 + [ f y ′ ( x , y ) ] 2 |\nabla f|=\sqrt{\left[f_{x}^{\prime}(x, y)\right]^{2}+\left[f_{y}^{\prime}(x, y)\right]^{2}} ∣∇f=[fx(x,y)]2+[fy(x,y)]2

梯度的方向:

设: v = { v 1 , v 2 } ( ∣ v ∣ = 1 ) v=\left\{v_{1}, v_{2}\right\}(|v|=1) v={v1,v2}(v=1)是任一给定方向,则对 ∇ f \nabla f f v v v的夹角 θ \theta θ有:

∂ f ∂ v ∣ P 0 = f x ′ ( x 0 , y 0 ) v 1 + f y ′ ( x 0 , y 0 ) v 2 = { f x ′ ( x 0 , y 0 ) , f y ′ ( x 0 , y 0 ) } ∙ { v 1 , v 2 } = ∇ f ∣ P 0 ∙ v = ∣ ∇ f ∣ P 0 ∣ ⋅ ∣ v ∣ cos ⁡ θ \begin{aligned} \left.\frac{\partial f}{\partial v}\right|_{P_{0}} &=f_{x}^{\prime}\left(x_{0}, y_{0}\right) v_{1}+f_{y}^{\prime}\left(x_{0}, y_{0}\right) v_{2} \\ &=\left\{f_{x}^{\prime}\left(x_{0}, y_{0}\right), f_{y}^{\prime}\left(x_{0}, y_{0}\right)\right\} \bullet\left\{v_{1}, v_{2}\right\} \\ &=\left.\nabla f\right|_{P_{0}} \bullet v=|\nabla f|_{P_{0}}|\cdot| v \mid \cos \theta \end{aligned} vf P0=fx(x0,y0)v1+fy(x0,y0)v2={fx(x0,y0),fy(x0,y0)}{v1,v2}=fP0v=∣∇fP0vcosθ

梯度下降法:

α ( k ) = argmin ⁡ f ( x k − α ⋅ ∇ f ( x ( k ) ) ) \alpha_{(k)}=\operatorname{argmin} f\left(x^{k}-\alpha \cdot \nabla f\left(x^{(k)}\right)\right) α(k)=argminf(xkαf(x(k)))

梯度下降法的优缺点分析

优点:

(1)程序简单,计算量小;
(2)对初始点没有特别的要求;
(3)最速下降法是整体收敛的,且为线性收敛

缺点:

(1)它只在局部范围内具有“最速”属性, 对整体求解过程,它的下降速度是缓慢的;
(2)靠近极小值时速度减慢;
(3)可能会’之字型’地下降

核心代码和结果

代码的迭代结果:

迭代过程:
在这里插入图片描述
极小值-迭代次数趋势图像:
在这里插入图片描述
迭代结果在圆锥曲面上的可视化:
在这里插入图片描述
所求函数:
min ⁡ f ( x ) = 2 x 1 2 + 4 x 2 2 − 6 x 1 − 2 x 1 x 2 \min f(x)=2 x_{1}^{2}+4 x_{2}^{2}-6 x_{1}-2 x_{1} x_{2} minf(x)=2x12+4x226x12x1x2
主函数:

clc,clear;
syms x1 x2 s; %声明符号变量
f1 =2*x1^2+4*x2^2-6*x1-2*x1*x2;%设定目标函数
[k,f1,f2,f3]=grad(f1,x1,x2,s,[0,1],10^(-5));  %设定起始点[x1 x2]=[-2.5,4.25]和精度10^(-2)
[result]=sprintf('在 %d 次迭代后求出极小值\n',k);%在迭代多少次之后求出极小值
disp(result);
figure(1);
plot(1:k,f3); % 作出函数图像
title('迭代过程');%输出结果
xlabel('迭代次数');
ylabel('极小值'); 
figure(2);
plot3(f1,f2,f3); % 画出方程图像
hold on;
syms x1 x2; % 声明符号变量
f=2*x1^2+4*x2^2-6*x1-2*x1*x2;
fmesh(f);

梯度下降核心函数实现:

function  [iterator,f1,f2,f3] = grad(f,x1,x2,s,start_point,thereshold) 
    iterator = 0;%迭代次数赋值初始化
    grad_f = [diff(f,x1) diff(f,x2)]; %计算f的梯度 
    delta = subs(grad_f,[x1,x2],[start_point(1),start_point(2)]);
    %计算起点的梯度   
    step=1; %设置初始步长为1
    current_point = start_point;%起点值赋给当前点
    %最速下降法的主循环,判断条件为:梯度的模与所给精度值进行比较
    while norm(delta) > thereshold          
        iterator = iterator + 1;%迭代次数+1     
        %一维探索 求最优步长(此时方向已知,步长s为变量)
        x_next = [current_point(1),current_point(2)] - s* delta/norm(delta);% 计算x(k+1)点,其中步长s为变量 
        f_val = subs(f,[x1,x2],[x_next(1),x_next(2)]);% 将x值带入目标函数中
        step = abs(double(solve(diff(f_val,s)))); % 对s求一阶导,并加绝对值符号,得到最优步长的绝对值
        step = step(1);%更新步长    
        %计算x(k+1)点
        current_point = double([current_point(1),current_point(2)] - step * delta/norm(delta));
        %计算x(k+1)点的梯度值
        delta = subs(grad_f,[x1,x2],[current_point(1),current_point(2)]);
        %计算函数值
        f_value = double(subs(f,[x1,x2],[current_point(1),current_point(2)]));
        %输出迭代计算过程
        result_string=sprintf('k=%d, x1=%.6f, x2=%.6f, step=%.6f f(x1,x2)=%.6f',iterator,current_point(1),current_point(2),step,f_value);
        f1(iterator)=current_point(1);
        f2(iterator)=current_point(2);
        f3(iterator)=f_value;
        disp(result_string);
    end
end

梯度算法的局限性及其优化

神经网络中,梯度的搜索是使用最为广泛的参数寻优方法,在此类方法美些视策解出发,代寻找最优参数值、每次送代中,我们先计算设置函数当前点的梯度,并根据梯度确定搜索方向。

在搜索过程中,我们可能会遇到陷入局部最小的问题,如果误差函数具有多个局部极小,则不能保证找到的解是全局最小,对后一种情形,我们称参数寻优陷入了局部极小,这显然不是我们所希望的。

在现实任务中,人们常采用以下策略来试图“跳出”局部极小 从而进-步接近全局最小:

  • 以多组不同参数值初始化多个神经网络,按标准方法训练后,取其中误差最小的解作为最终参数.这相当于从多个不同的初始点开始搜索,这样就可能陷入不同的局部极小,从中进行选择有可能获得更接近全局最小的结果.
    但是也会造成“跳出”全局最小
  • 使用“模拟退火”技术,模拟退火在每一步都以一定的概率接受比当前解更差的结果,从而有助于“跳出”局部极小.在每步迭代过程中、接受“你优解》的概率要随着时间的摊移而逐渐降低。从而保证算法稳定
  • 使用随机梯度下降.与标准梯度下降法精确计算梯度不同,随机梯度下降法在计算梯度时加入了随机因素。于是,即便陷入局部极小点,它计算出的梯度仍可能不为零,这样就有机会跳出局部极小继续搜索。
    在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/765138.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

深度学习路线

深度学习路线 机器学习视频 吴恩达 http://open.163.com/special/opencourse/machinelearning.html 神经网络深度学习在线教程 共六章 http://neuralnetworksanddeeplearning.com 《神经网络设计》 国外经典教程 第十一章 反向传播 CNN:《Notes On Convolutional Neutral Netw…

h5live 2.0.1 合入测试

直接超过1个G 有消息进来,就是不显示

SpringBoot 整合 RabbitMQ demo

Rabbit Windows安装教程 本文只做Demo案例的分享,具体只是需自行百度 一、生产者 1.application.properties 配置Rabbit的基本信息 #rabbit 主机IP spring.rabbitmq.host127.0.0.1 #rabbit 端口 spring.rabbitmq.port5672 #rabbit 账号 可自行创建 这里是默认的 …

秀offer:大学老师15w、工商银商20w、字节40w,去哪个?

一个粉丝小伙伴给我发消息: 孟哥,想问下三个offer如何选择,我和家里人的意见不一样。我是双非的小硕。比较喜欢大学的氛围,才应聘了下。是一个三本的民办的,二本的完全够不上。工商在南京,待遇还算不错。字…

安卓进程间通信浅谈

Case: /Users/lucas/AndroidStudioProjects/aidldemo-master 一:操作系统 从操作系统原理去看,进程通信主要有三个方法:共享存储、消息传递、管道通信。 二:安卓中的IPC 进程间通信的几种方式:Intent(Bu…

使用Visual Studio打造强大的程序,从添加第三方库开始

使用Visual Studio打造强大的程序,从添加第三方库开始 博主简介一、引言二、理解第三方库三、下载和安装第三方库四、示例代码和演示五、总结 博主简介 💡一个热爱分享高性能服务器后台开发知识的博主,目标是通过理论与代码实践的结合&#x…

Vscode自定义注释模板

首先安装插件Doxygen Documentation Generator,安装完成之后点击Doxygen插件的设置,按照下面的步骤打开settings.json进行编辑: 在settings.json中追加如下代码: "doxdocgen.file.copyrightTag": ["Copyright (C),…

如何在Arch Linux上安装最新的GNOME Alpha/Beta版本

导读这是为那些想在 Arch Linux 上安装下一个主要版本的 GNOME 桌面环境的 alpha 或 beta 开发版的用户提供的快速而又肮脏的教程,仅供测试之用。 每次有新的 GNOME alpha 版本发布,人们都会问我如何在各种 GNU/Linux 发行版上安装。我总是告诉他们&…

SUM(整除分块)

题目描述 给定 x ,y , 求 的值 . 其中 , 代表向下取整 输入描述 第一行一个正整数 T(1≤T≤100), 表示测试用例的数目。每个测试用例占一行。 接下来的 T 行,每行两个正整数 x, y 。 输出描述 输出共 T 行,…

Laravel文档阅读笔记-How to enable CORS on Laravel

使用中间件为http响应头添加Access-Control-Allow-Origin 1.创建Cors中间件&#xff1a; $ php artisan make:middleware Cors 2.编辑中间件&#xff1a; <?phpnamespace App\Http\Middleware;use Closure;class Cors {/*** Handle an incoming request.** param \Ill…

wordpress后台的路径都是空白,进不了后台怎么办?

主题或插件冲突&#xff1a;某些主题或插件可能与其他已安装的主题或插件不兼容&#xff0c;导致登录页面显示为空白。您可以通过禁用所有插件和将主题更改为默认主题来查看是否解决了问题。如果解决了问题&#xff0c;则可以逐个重新启用插件以找出是哪个插件造成冲突。 PHP错…

Express 框架介绍

目录 1、简介 1.1 Web 应用 1.2 API 1.3 性能 1.4 框架 2、如何开始 Express 编程之旅 3、测试实例 4、其他问题 4.1 如何定义模型&#xff1f; 4.2 Express 支持哪些模板引擎&#xff1f; 4.3 如何处理 404 响应&#xff1f; 4.4 如何设置错误处理程序&#xff1f…

Python3模拟π的求值过程

假设我们已经知道了圆的面积计算公式是&#xff1a;πr&#xff0c;正方形的面积是r&#xff0c;但是不知道π的具体值。模拟结果如图所示&#xff1a;我们将1/4圆的面积s1比上正方形的面积s2就能得出1/4π&#xff0c;所以π就等于4倍的s1/s2。 图中横纵坐标轴最大值均为1&am…

无人驾驶中如何识别颜色并跟踪的具体应用

摄像头对于颜色的识别&#xff0c;我们在上一篇文章中有具体的介绍&#xff0c;并介绍了OpenCV中的一些常见知识点&#xff0c;这里我们来对颜色识别在无人驾驶中&#xff0c;做一个具体应用。 有兴趣的可以先看下本人拍摄的一个视频&#xff1a;无人车识别颜色并跟踪 通过…

PICO4开发实战一:节奏光剑(VR)(需求文档)

PICO4开发实战一&#xff1a;节奏光剑&#xff08;VR&#xff09;&#xff08;需求文档&#xff09; 文章目录 PICO4开发实战一&#xff1a;节奏光剑&#xff08;VR&#xff09;&#xff08;需求文档&#xff09;一、V1 基础功能开发1、V1版本完成页面2、V1基本功能需求介绍&am…

81. 正则表达式

一、概述二、匹配单个字符三、匹配一组字符四、使用元字符五、重复匹配六、位置匹配七、使用子表达式八、回溯引用九、前后查找十、嵌入条件参考资料 一、概述 正则表达式用于文本内容的查找和替换。 正则表达式内置于其它语言或者软件产品中&#xff0c;它本身不是一种语言或…

学习react,复制一个civitai(C站)-更新3

更新内容 优化了一下加载速度 图片列表 初步更新了199张图片&#xff0c;大部分都有stable diffusion 的prompts。 可以直接复制到AI绘画里面使用。 先来看看效果图吧&#xff1a; 我还是挺喜欢这种砌砖流布局 技术点 同样使用了砌墙瀑布流布局:masonry js 安装方法 npm …

配置Propos检验

配置Propos检验 ​ 和vue不同react并未为我们直接配置props校验&#xff0c;(类型必填默认值),需要我们就手动进行配置

SqlServer数据库【基础-更删改查】

一、创建语句 &#xff08;1&#xff09;创建数据库 1.检查系统中是否存在这个数据库&#xff0c;存在则删除 格式&#xff1a; if exists(select * from sysdatabases where name数据库名) drop database 数据库名 go例子&#xff1a; if exists(select * from sysdataba…

Redis事务(4)

⭐ 作者简介&#xff1a;码上言 ⭐ 代表教程&#xff1a;Spring Boot vue-element 开发个人博客项目实战教程 ⭐专栏内容&#xff1a;个人博客系统 ⭐我的文档网站&#xff1a;http://xyhwh-nav.cn/ 文章目录 Redis事务1、Redis事务概念2、应用1、MULTI开启事务2、事务失败…