当前位置: 首页 > 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…...

大数据学习栈记——Neo4j的安装与使用

本文介绍图数据库Neofj的安装与使用&#xff0c;操作系统&#xff1a;Ubuntu24.04&#xff0c;Neofj版本&#xff1a;2025.04.0。 Apt安装 Neofj可以进行官网安装&#xff1a;Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...

在rocky linux 9.5上在线安装 docker

前面是指南&#xff0c;后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...

DAY 47

三、通道注意力 3.1 通道注意力的定义 # 新增&#xff1a;通道注意力模块&#xff08;SE模块&#xff09; class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...

高等数学(下)题型笔记(八)空间解析几何与向量代数

目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...

k8s业务程序联调工具-KtConnect

概述 原理 工具作用是建立了一个从本地到集群的单向VPN&#xff0c;根据VPN原理&#xff0c;打通两个内网必然需要借助一个公共中继节点&#xff0c;ktconnect工具巧妙的利用k8s原生的portforward能力&#xff0c;简化了建立连接的过程&#xff0c;apiserver间接起到了中继节…...

Linux离线(zip方式)安装docker

目录 基础信息操作系统信息docker信息 安装实例安装步骤示例 遇到的问题问题1&#xff1a;修改默认工作路径启动失败问题2 找不到对应组 基础信息 操作系统信息 OS版本&#xff1a;CentOS 7 64位 内核版本&#xff1a;3.10.0 相关命令&#xff1a; uname -rcat /etc/os-rele…...

现有的 Redis 分布式锁库(如 Redisson)提供了哪些便利?

现有的 Redis 分布式锁库&#xff08;如 Redisson&#xff09;相比于开发者自己基于 Redis 命令&#xff08;如 SETNX, EXPIRE, DEL&#xff09;手动实现分布式锁&#xff0c;提供了巨大的便利性和健壮性。主要体现在以下几个方面&#xff1a; 原子性保证 (Atomicity)&#xff…...

Webpack性能优化:构建速度与体积优化策略

一、构建速度优化 1、​​升级Webpack和Node.js​​ ​​优化效果​​&#xff1a;Webpack 4比Webpack 3构建时间降低60%-98%。​​原因​​&#xff1a; V8引擎优化&#xff08;for of替代forEach、Map/Set替代Object&#xff09;。默认使用更快的md4哈希算法。AST直接从Loa…...

使用SSE解决获取状态不一致问题

使用SSE解决获取状态不一致问题 1. 问题描述2. SSE介绍2.1 SSE 的工作原理2.2 SSE 的事件格式规范2.3 SSE与其他技术对比2.4 SSE 的优缺点 3. 实战代码 1. 问题描述 目前做的一个功能是上传多个文件&#xff0c;这个上传文件是整体功能的一部分&#xff0c;文件在上传的过程中…...

Mysql故障排插与环境优化

前置知识点 最上层是一些客户端和连接服务&#xff0c;包含本 sock 通信和大多数jiyukehuduan/服务端工具实现的TCP/IP通信。主要完成一些简介处理、授权认证、及相关的安全方案等。在该层上引入了线程池的概念&#xff0c;为通过安全认证接入的客户端提供线程。同样在该层上可…...