高级优化算法之 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,并为以后开展其他项目的开启提供简易的后端模版。(非后端工程师) 由于文档是代码写完之后,为了记录项目中需要注意的技术点,因此文档的叙述方式并非开发顺序࿰…...
[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࿰…...
算法-二叉树的最大路径和
为了找到二叉树的最大路径和,我们需要考虑所有可能的路径,包括不经过根节点的路径,所以其实如果你从整体上来一条路径一条路径的遍历,太复杂,我们可以换个思路,从每个节点出发,就把那个节点当成…...
解决url含%导致404错误
String imageUrl;// 使用WebClient下载图片WebClient webClient WebClientUtil.getWebClient();Mono<ByteArrayOutputStream> byteArrayOutputStreamMono webClient.get().uri(imageUrl).retrieve().bodyToFlux(DataBuffer.class) // 获取图片内容的DataBuffer流.reduc…...
Spring Boot 实现流式响应(兼容 2.7.x)
在实际开发中,我们可能会遇到一些流式数据处理的场景,比如接收来自上游接口的 Server-Sent Events(SSE) 或 流式 JSON 内容,并将其原样中转给前端页面或客户端。这种情况下,传统的 RestTemplate 缓存机制会…...
【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)
升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点,但无自动故障转移能力,Master宕机后需人工切换,期间消息可能无法读取。Slave仅存储数据,无法主动升级为Master响应请求ÿ…...
聊一聊接口测试的意义有哪些?
目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开,首…...
MySQL用户和授权
开放MySQL白名单 可以通过iptables-save命令确认对应客户端ip是否可以访问MySQL服务: test: # iptables-save | grep 3306 -A mp_srv_whitelist -s 172.16.14.102/32 -p tcp -m tcp --dport 3306 -j ACCEPT -A mp_srv_whitelist -s 172.16.4.16/32 -p tcp -m tcp -…...
Yolov8 目标检测蒸馏学习记录
yolov8系列模型蒸馏基本流程,代码下载:这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中,**知识蒸馏(Knowledge Distillation)**被广泛应用,作为提升模型…...
Go 语言并发编程基础:无缓冲与有缓冲通道
在上一章节中,我们了解了 Channel 的基本用法。本章将重点分析 Go 中通道的两种类型 —— 无缓冲通道与有缓冲通道,它们在并发编程中各具特点和应用场景。 一、通道的基本分类 类型定义形式特点无缓冲通道make(chan T)发送和接收都必须准备好࿰…...
面向无人机海岸带生态系统监测的语义分割基准数据集
描述:海岸带生态系统的监测是维护生态平衡和可持续发展的重要任务。语义分割技术在遥感影像中的应用为海岸带生态系统的精准监测提供了有效手段。然而,目前该领域仍面临一个挑战,即缺乏公开的专门面向海岸带生态系统的语义分割基准数据集。受…...
DeepSeek源码深度解析 × 华为仓颉语言编程精粹——从MoE架构到全场景开发生态
前言 在人工智能技术飞速发展的今天,深度学习与大模型技术已成为推动行业变革的核心驱动力,而高效、灵活的开发工具与编程语言则为技术创新提供了重要支撑。本书以两大前沿技术领域为核心,系统性地呈现了两部深度技术著作的精华:…...
DAY 45 超大力王爱学Python
来自超大力王的友情提示:在用tensordoard的时候一定一定要用绝对位置,例如:tensorboard --logdir"D:\代码\archive (1)\runs\cifar10_mlp_experiment_2" 不然读取不了数据 知识点回顾: tensorboard的发展历史和原理tens…...
从零手写Java版本的LSM Tree (一):LSM Tree 概述
🔥 推荐一个高质量的Java LSM Tree开源项目! https://github.com/brianxiadong/java-lsm-tree java-lsm-tree 是一个从零实现的Log-Structured Merge Tree,专为高并发写入场景设计。 核心亮点: ⚡ 极致性能:写入速度超…...
