当前位置: 首页 > news >正文

高级优化算法之 fminunc函数 实践

说明

    在本专栏机器学习_墨@#≯的博客-CSDN博客前面几篇文章中,大多采用梯度下降法来求解。其实还有很多的高级优化算法可以用来求解回归和分类问题,本文就是在吴恩达机器学习视频课程[1]的启示下,想要简单尝试一下Matlab自带的无约束多变量函数最小值优化工具:fminunc。

    本文的内容很简单,说白了就是一个函数的介绍和使用。(本来并不想形成一篇博文的,不过csdn一天连发两篇似乎有流量券,于是凑了一下本文)。不过,本文也算是对高级优化算法起了个头,后续如果接触和使用到更具体的算法我再在本文基础上补充。

Blog

2024.10.24  博文第一次撰写

目录

说明

目录

一、有关机器学习问题中的高级优化算法

二、Matlab自带的Fminunc函数介绍与实践

2.1 fminunc函数介绍

2.2 fminunc函数实践1 --- 曲面最小值

2.3 fminunc函数实践2 --- 直线拟合

三、总结

四、参考资料

五、数据与代码链接


一、有关机器学习问题中的高级优化算法

    在本专栏机器学习_墨@#≯的博客-CSDN博客前面几篇文章中,对于机器学习的典型问题如:回归、分类的解决,我们采用的方法是梯度下降法(特别是批量梯度下降法,当然也对其变体,如小批量梯度下降法以及随机梯度下降法做了介绍)。梯度下降法有其缺点:特别是要预设合适的超参数:学习率,此外,梯度下降法的收敛速度一般(当然,也与学习率有关)。  那么,有没有更加优越的方法?(不需要设置学习率,收敛速度还能更快?)。自然是有的!计算机以及数学发展这么多年,科研工作者们发明了很多的高级优化算法:比如共轭梯度算法(Conjugate Gradient)、牛顿法及其变体(如BFGS、L-BFGS)、AdaGrad算法、Adam算法等等。这些算法可以不需要人为地设置学习率,且收敛速度比梯度下降法更快(当然,这些都是以增加计算复杂度为代价的)。

    不过前述更高级的优化算法的原理理解需要比梯度下降法更复杂繁琐的数学推导,本文不做尝试。本文只是在吴恩达机器学习视频课程[1]的启示下,想要简单尝试一下Matlab自带的无约束多变量函数最小值优化工具fminunc。Fminunc使用的应该是拟牛顿法来进行优化求解。

二、Matlab自带的Fminunc函数介绍与实践

2.1 fminunc函数介绍

    fminunc函数是一个非线性规划求解器,可用于求解无约束多变量函数的最小值。其典型的调用方式如下:

输入包括:

costfunc是一个需要定义的函数,我们要在该函数体中给出需要优化的函数。

InitilaTheta 是解的初始值(这里的解就是前述损失函数costfunc的解)。

options 是优化选项,是一个结构体,可以在其中配置包括:所使用的优化算法(支持quasi-newton和trust-region)、允许的最大迭代次数等。

输出包括:

optTheta是优化完成后的参数值(损失函数的解)。

functionval是损失函数在该优化好的参数值下的损失值。

exitFlag是给出是否已经收敛的标签,为1表示已经收敛。

    使用fminunc函数的关键在于设计损失函数costfunc,在前述介绍的基础上,我们就可以基于该函数解决一些问题。

2.2 fminunc函数实践1 --- 曲面最小值

    视频课[1]中介绍该函数时,使用的例子是:

                    (2-1)

    在实数范围内求使得该损失函数取得最小值的theta值。其实有些数学基础的就直接可以看出当theta = [5 5]时,上式取得最小值0。 其函数图像如下图所示:

图2.1 costfunc图像

    对该损失函数的优化,代码如下:

图2.2 调用fminunc函数解决式(2-1)问题的代码

    得到的结果如下:

图2.3  优化结果

    其优化得到的theta值为5和5,损失值为0,并且收敛。 结果符合预期。

2.3 fminunc函数实践2 --- 直线拟合

    在博文[2]中,我们使用梯度下降法求解了单变量(特征)下的曲线拟合问题、多变量(特征)下的房屋价格拟合问题。 这些问题也可以用高级优化算法求解,具体到fminunc函数,关键在于求解损失函数costfunc。

    为类比博文[2],我尝试过用fminunc来求一元四次函数的拟合,但是costfunc的求解太繁琐了,最终放弃了。 本章以最基本的直线拟合来实践一下该fminunc函数。

    【数据集】:待拟合的直线设置为: y = 1 + x,数据集我直接通过给该直线上的点噪声获得。

图2.4  数据集生成

    通过给y值加一个SNR =10的高斯白噪声得到如右图所示的数据集。进一步地,将数据的顺序随机打乱,并选取2/3的数据作为训练集,其余为测试集。如下图所示:

图2.5  训练集和测试集

【模型与损失函数】:我们用线性模型来做回归:

                                                        (2-2)

    其损失函数设计为均方误差和:

                                          (2-3)

    式中,m为训练集的样本数。关于这里有不了解的,可以参考博文[2]。

【调用fminunc函数】:使用该fminunc函数的关键在于计算得到costfunc,式(2-3)就是costfunc,对(2-3)式拆解(公式插入有误,我这里直接贴图片):

    我们需要把全部的训练数据集代入式(2-4)!并最终求得各θ值对应的系数。 (试想如果是一元四次函数,上面的式子要复杂几倍不止,暂时没想到更简单的解法,所以我放弃了)。求得前述θ值后,按照图2.2所示类似的方法,代入对应的数据,得到结果如下:

图2.6  fminunc函数输出结果

    截距和系数几乎都为1,与我们预设的直线很接近,结果符合预期。将拟合得到的曲线与数据集画在一起,得到:

图2.7 回归结果(与全部数据集的对比)

    图中红色为拟合得到的直线。 结果符合预期。

三、总结

    本文对适用于机器学习里的回归、分类问题的高级优化算法做了简单的介绍,随后介绍了Matlab自带的非线性规划求解器:fminunc函数,并基于该函数对曲面最小值问题、直线回归问题进行了求解尝试。

    本文的内容很基础,后续如果接触和使用到更具体的算法我再在本文基础上补充。

四、参考资料

[1] [中英字幕]吴恩达机器学习系列课程_哔哩哔哩_bilibili

[2] 回归问题探讨与实践-CSDN博客

五、数据与代码链接

本文相关的代码请参考如下链接获取:

高级优化算法之fminunc函数实践博文对应的代码资源-CSDN文库

  

 

 

相关文章:

高级优化算法之 fminunc函数 实践

说明 在本专栏机器学习_墨#≯的博客-CSDN博客前面几篇文章中,大多采用梯度下降法来求解。其实还有很多的高级优化算法可以用来求解回归和分类问题,本文就是在吴恩达机器学习视频课程[1]的启示下,想要简单尝试一下Matlab自带的无约束多变量函数…...

1.5 ROS架构

到目前为止,我们已经安装了ROS,运行了ROS中内置的小乌龟案例,并且也编写了ROS小程序,对ROS也有了一个大概的认知,当然这个认知可能还是比较模糊并不清晰的,接下来,我们要从宏观上来介绍一下ROS的…...

Redis Search系列 - 第四讲 支持中文

目录 一、支持中文二、自定义中文词典2.1 Redis Search设置FRISOINI参数2.2 friso.ini文件相关配置1)自定义friso UTF-8字典2)修改friso.ini配置文件 三、实测中文分词效果 一、支持中文 Redis Stack 从版本 0.99.0 开始支持中文文档的添加和分词。中文…...

架构师备考-架构图设计案列

本文中所涉及的架构图主要参考软考-架构设计师历年Web 架构设计案例真题,在其基础上进行补充说明。 历年软考架构师案例题-Web架构设计考点 2014 MVC 架构2015、2016 J2EE 架构2017 经典网络架构2018 SOA 架构2019 分布式架构2020 SSM 架构2021 云平台架构2022 物…...

专业级Facebook直播工具推荐:提升你的直播体验

随着社交媒体的迅速发展,直播已成为现代内容传播的重要方式。Facebook作为全球最大的社交平台之一,为用户和企业提供了丰富的直播功能,吸引了众多观众和参与者。在这个竞争激烈的环境中,如何打造高质量的直播内容显得尤为重要。本…...

【NodeJS】NodeJS+mongoDB在线版开发简单RestfulAPI (三):Cors的设置及.env文件的设置

本项目旨在学习如何快速使用 nodejs 开发后端api,并为以后开展其他项目的开启提供简易的后端模版。(非后端工程师) 由于文档是代码写完之后,为了记录项目中需要注意的技术点,因此文档的叙述方式并非开发顺序&#xff0…...

[python flask 数据库ORM操作]

一、链接数据库 我们选择的框架是flask-sqlAlchemy 这个框架是对pymysql的封装。 连接数据库 #导入包 from flask_sqlalchemy import SQLAlchemy #创建flask app对象 app Flask(__name__) #设置配置信息 HOSTNAME "localhost" PORT 3306; USERNAME "root&…...

【JavaScript】如何优雅的编码if判断中的一个变量多个或条件

前言 你是否写过这样代码: ...if (status 1 || status 4 || status 6)...代码场景是这样的,记录有多个状态,当状态等于1,4,6时要做相同的逻辑。今天我们就分享一下如何简化写法,让代码更好看,更优雅。 使用 switch 语句 ...…...

SaaS云诊所系统源码,基于云计算技术的SAAS模式诊所管理系统,适用于诊所、门诊、卫生服务站、卫生站

SaaS云诊所管理系统源码,门诊管理系统源码,诊所药店云平台源码 云诊所管理系统是基于云计算的SAAS模式诊所管理系统,全面适用于诊所、门诊、卫生服务站、卫生站、卫生所、中医馆、药店、私人个体诊所、中小型门诊、乡村卫生室、医务室以及社…...

字节,AI产品经理面试,拿下offer!

如果大家最近打算找ai产品经理这方面的工作,可以对照着脑图准备起来啦。 这篇文章给大家讲解两道高频问题: 1)AI产品经理和传统产品经理有什么区别 2)AI 产品经理的工作职责和能力要求是什么? 这两个问题看似简单&a…...

Postgresql pgsql 插件之postgis 安装配置

相关链接: pgsql编译安装 一、说明 postgis是pgsql最强大的几个插件之一,可以用于地理信息系统(gis)的搭建 二、插件安装启动 由于我的pgsql是编译安装的,所以插件也是编译安装,更加灵活。 1.进入到源…...

单片机STC8H8K64U开发板_RA6809开发板 驱动彩屏显示

单片机STC8H8K64U开发板,型号RT8H8K001 预留Type C接口,可供电SWD下载: RA6809开发板,型号RT6809CNN01 预留Type C接口供电,预留MCU接口、电容触摸屏接口、液晶屏接口: 双臂合一,驱动和控…...

Redis底层和缓存雪崩,击穿,穿透

一、Redis的数据结构 1.动态字符串 我们知道Redis中保存的Key是字符串,value往往hi字符串或者字符串的集合。可见字符串是Redis中最常用的一种数据结构。不过,Redis 没有直接使用c语言的字符串,因为c语言字符串存在许多问题: …...

[Java基础] 集合框架

往期回顾 [Java基础] 基本数据类型 [Java基础] 运算符 [Java基础] 流程控制 [Java基础] 面向对象编程 [Java基础] 集合框架 [Java基础] 输入输出流 [Java基础] 异常处理机制 [Java基础] Lambda 表达式 目录 List 接口 数据结构 最佳实践 实战代码 Set 接口 数据…...

机器学习基础:算法如何让 AI 自我学习

大家好,我是Shelly,一个专注于输出AI工具和科技前沿内容的AI应用教练,体验过300款以上的AI应用工具。关注科技及大模型领域对社会的影响10年。关注我一起驾驭AI工具,拥抱AI时代的到来。 AI工具集1:大厂AI工具【共23款…...

25届字节跳动 抖音NLP算法工程师 面经

目录 一面/技术面 2024/08/30二面/技术面 2024/09/13 一面/技术面 2024/08/30 深挖实习(最近的一段实习)深挖论文(让我共享屏幕,然后对着自己的论文讲)论文做了多久完成的?主要都做了哪些工作?…...

转行网络工程师以后的就业前景如何?

就业前景如何本质上取决于你在这行业的发展状况,而发展状况又主要由你的技术水平和与人交流的能力所决定。 如果你的技术能力仅限于"安服仔"、"脚本小子"等入门级水平,那你的职业发展可能会像浮萍一样漂泊不定。但如果你能轻松编写…...

docker 和 containerd 关系

containerd 是一个开源的容器运行时,它是用来管理容器生命周期的守护进程。containerd 支持 Docker 和其他容器格式,并且是许多现代容器编排系统(如 Kubernetes)的基础组件之一。 containerd 提供了一个命令行工具 ctr&#xff0…...

算法-二叉树的最大路径和

为了找到二叉树的最大路径和,我们需要考虑所有可能的路径,包括不经过根节点的路径,所以其实如果你从整体上来一条路径一条路径的遍历,太复杂,我们可以换个思路,从每个节点出发,就把那个节点当成…...

解决url含%导致404错误

String imageUrl;// 使用WebClient下载图片WebClient webClient WebClientUtil.getWebClient();Mono<ByteArrayOutputStream> byteArrayOutputStreamMono webClient.get().uri(imageUrl).retrieve().bodyToFlux(DataBuffer.class) // 获取图片内容的DataBuffer流.reduc…...

Debian系统简介

目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版&#xff…...

vscode(仍待补充)

写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh&#xff1f; debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...

江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命

在华东塑料包装行业面临限塑令深度调整的背景下&#xff0c;江苏艾立泰以一场跨国资源接力的创新实践&#xff0c;重新定义了绿色供应链的边界。 跨国回收网络&#xff1a;废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点&#xff0c;将海外废弃包装箱通过标准…...

TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案

一、TRS收益互换的本质与业务逻辑 &#xff08;一&#xff09;概念解析 TRS&#xff08;Total Return Swap&#xff09;收益互换是一种金融衍生工具&#xff0c;指交易双方约定在未来一定期限内&#xff0c;基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...

OPENCV形态学基础之二腐蚀

一.腐蚀的原理 (图1) 数学表达式&#xff1a;dst(x,y) erode(src(x,y)) min(x,y)src(xx,yy) 腐蚀也是图像形态学的基本功能之一&#xff0c;腐蚀跟膨胀属于反向操作&#xff0c;膨胀是把图像图像变大&#xff0c;而腐蚀就是把图像变小。腐蚀后的图像变小变暗淡。 腐蚀…...

打手机检测算法AI智能分析网关V4守护公共/工业/医疗等多场景安全应用

一、方案背景​ 在现代生产与生活场景中&#xff0c;如工厂高危作业区、医院手术室、公共场景等&#xff0c;人员违规打手机的行为潜藏着巨大风险。传统依靠人工巡查的监管方式&#xff0c;存在效率低、覆盖面不足、判断主观性强等问题&#xff0c;难以满足对人员打手机行为精…...

深度学习之模型压缩三驾马车:模型剪枝、模型量化、知识蒸馏

一、引言 在深度学习中&#xff0c;我们训练出的神经网络往往非常庞大&#xff08;比如像 ResNet、YOLOv8、Vision Transformer&#xff09;&#xff0c;虽然精度很高&#xff0c;但“太重”了&#xff0c;运行起来很慢&#xff0c;占用内存大&#xff0c;不适合部署到手机、摄…...

Python网页自动化Selenium中文文档

1. 安装 1.1. 安装 Selenium Python bindings 提供了一个简单的API&#xff0c;让你使用Selenium WebDriver来编写功能/校验测试。 通过Selenium Python的API&#xff0c;你可以非常直观的使用Selenium WebDriver的所有功能。 Selenium Python bindings 使用非常简洁方便的A…...

ThreadLocal 源码

ThreadLocal 源码 此类提供线程局部变量。这些变量不同于它们的普通对应物&#xff0c;因为每个访问一个线程局部变量的线程&#xff08;通过其 get 或 set 方法&#xff09;都有自己独立初始化的变量副本。ThreadLocal 实例通常是类中的私有静态字段&#xff0c;这些类希望将…...

高端性能封装正在突破性能壁垒,其芯片集成技术助力人工智能革命。

2024 年&#xff0c;高端封装市场规模为 80 亿美元&#xff0c;预计到 2030 年将超过 280 亿美元&#xff0c;2024-2030 年复合年增长率为 23%。 细分到各个终端市场&#xff0c;最大的高端性能封装市场是“电信和基础设施”&#xff0c;2024 年该市场创造了超过 67% 的收入。…...