程序员的数学【最优化】(一)

简介: 本文其实值属于:程序员的数学【AIoT阶段二】 的一部分内容,本篇把这部分内容单独截取出来,方便大家的观看,本文介绍 最优化

前言

本文其实值属于:程序员的数学【AIoT阶段二】 的一部分内容,本篇把这部分内容单独截取出来,方便大家的观看,本文介绍 最优化,本文涵盖了一些计算的问题并使用代码进行了实现,安装代码运行环境见博客:最详细的Anaconda Installers 的安装【numpy,jupyter】(图+文),如果你只是想要简单的了解有关线代的内容,那么只需要学习一下博文:NumPy从入门到高级,如果你是跟着博主学习AIoT的小伙伴,建议先看博文:数据分析三剑客【AIoT阶段一(下)】(十万字博文 保姆级讲解),如果你没有Python基础,那么还需先修博文:Python的进阶之道【AIoT阶段一(上)】(十五万字博文 保姆级讲解)


一、最优化概念

1.1 最大值最小值

image.png

1.2 局部极小值

image.png

1.3 全局最小值

🚩其实初中我们就学求极值的问题了,比如二次函数抛物线的顶点就是极大值或者极小值,高中我们也会有求极值的题目,算一个非常复杂的函数的极值,借用初等数学一些的技巧来完成的。而真正的飞跃是发生在大学里面,微积分这门课为求解极值提供了一个统一的方法,就是找它导数等于 0  的点,如果是多元函数的话,我们说它的梯度等于 0 ,我们去解方程组就可以了,在机器学习里面我们遇到的几乎所有的函数都是可导的。光滑即可导f(x)=0


局部最小值, 通过大量实践发现在高维度的优化问题中,局部最小值和全局最小值通常没有太大的区别,甚至在有些情况下局部最小值有更好的归纳能力(泛化能力)。


二、求导与迭代求解

2.1 求导遇到的问题

🚩前面咱们说了求极值就是导数或梯度等于 0 ,找到疑似的极值,就是驻点:f(x)=0,f(x)=0

有了微积分里面这样的手段,只要函数可导,我们求解不就行了?

因为很多时候去求方程等于 0  或方程组等于0  的根并不是那么容易,比如:

image.png

分别对 x , y 求偏导:41.png

令上面的导数为 0依然无法求解。对于 5  次或以上的代数方程它都没有求根公式了,所以这个思路看上去很美,但是实际上是行不通的,我们得想其它的办法。

2.2 近似迭代求解

image.png

在最优化中,这种迭代思想又叫梯度下降

三、梯度下降

3.1 公式推导

🚩数值优化算法,是求近似解,而不是理论上面的精确解

image.png

image.png

image.png

这时要想下降的更快,就要让等式右边得到最小值,即当cosθ=−1,下降的幅度最大!

单位向量代表的是方向,长度为 1  的向量,即模为 1  的向量称为单位向量。

向量乘以标量不会改变它的方向,只会改变它的幅值。这就是缩放向量的方法。

所以一个向量可以表示为一个标量乘以一个单位向量。

image.png

实现细节问题:

  • 初始值的设定,随机或者设定满足约束条件
  • 步长的设定,一个比较小的,也可以动态的调整
  • 循环终止的判定,达到maxiteration(最大迭代次数);上一次减下一次的更新,差异基本不变时

3.2 代码演示

3.2.1 创建模拟数据

import numpy as np
import matplotlib.pyplot as plt
# 构建方程
f = lambda x : (x - 3.5) ** 2 - 4.5 * x + 10
# 导函数
g = lambda x : 2 * (x - 3.5) - 4.5
# 创建模拟数据并可视化
x = np.linspace(0, 11.5, 100)
y = f(x)
plt.plot(x, y)
_ = plt.scatter(5.75, f(5.75), color = 'red', s = 30)

image.png

3.2.2 迭代法求解(梯度下降)

eta = 0.3 # 学习率
# 随机(瞎蒙),初始值x0
x = np.random.randint(0, 12, size = 1)[0]
# 多次while 循环,每次梯度下降,更新,记录一下上一次的值
# 比较精确度
# 一开始故意设置差异,目的为了有区分,不能一上来就停止
last_x = x + 0.1
# 精确度,人为设定
precision = 0.0001
print('-----------------随机x是:', x)
# 每次梯度下降,求解出来的x值,一开始随机给的
x_ = [x] # Python中列表
count = 0
while True:
    if np.abs(x - last_x) < precision: # 更新时,变化甚微,满足精确度,终止
        break
    # 更新,梯度下降
    # x是当前数值,赋值给上一个值
    last_x = x
    count += 1
    x = x - eta * g(x) # 梯度下降公式
    x_.append(x)
    print('+++++++++++++++更新之后的x是:%0.5f' % (x))
print('+++++++++++++++梯度下降次数:', count)
# x1是NumPy数组
x1 = np.linspace(0, 11.5, 100)
y1 = f(x1)
plt.figure(figsize = (9, 6))
plt.plot(x1, y1)
# 散点图
x_ = np.array(x_)
_ = plt.scatter(x_, f(x_), color = 'red', s = 30)

42.png

3.2.3 迭代法求解(退出条件最大迭代次数)

eta = 0.2 # 学习率
# 随机(瞎蒙),初始值
x = np.random.randint(0, 12, size = 1)[0]
# 多次while 循环,每次梯度下降,更新,记录一下上一次的值
# 一开始故意设置差异,目的为了有区分,不能一上来就停止
last_x = x + 0.1
# 最大迭代次数,人为设定
count = 30
print('-----------------随机x是:', x)
# 每次梯度下降,求解出来的x值,一开始随机给的
x_ = [x] # Python中列表
for i in range(count):
    # 更新,梯度下降
    # x是当前数值,赋值给上一个值
    last_x = x
    x = x - eta * g(x) # 梯度下降公式
    x_.append(x)
    print('+++++++++++++++更新之后的x是:%0.5f' % (x))
# x1是NumPy数组
x1 = np.linspace(0, 11.5, 100)
y1 = f(x1)
plt.figure(figsize = (9, 6))
plt.plot(x1, y1)
# 散点图
x_ = np.array(x_)
plt.scatter(x_, f(x_), color = 'red', s = 30)

43.png









目录
相关文章
|
缓存 负载均衡 网络安全
什么是proxy?优点是什么?
什么是proxy?优点是什么?
580 0
|
12月前
|
JSON Ubuntu 开发者
ubuntu 22安装lua环境&&编译lua cjson模块
通过上述步骤,可以在 Ubuntu 22.04 系统上成功安装 Lua 环境,并使用 LuaRocks 或手动编译的方式安装 lua-cjson 模块。本文详细介绍了每一步的命令和操作,确保每一步都能顺利完成,适合需要在 Ubuntu 系统上配置 Lua 开发环境的开发者参考和使用。
1457 13
|
12月前
|
JSON 前端开发 Java
【SpringMVC】基础入门实战(3)
SpringMVC获取Header,返回静态页面,返回数据(Controller),返回数据@ResponseBody,返回HTML代码片段,返回JSON,设置状态码,设置Header
|
机器学习/深度学习 自然语言处理 语音技术
迁移学习(Transfer Learning)
迁移学习是一种机器学习技术,通过将一个任务中学到的知识应用于另一个相关任务,有效解决了数据稀缺和计算资源有限的问题。它涉及预训练模型、特征提取、微调、领域适应等多种技术,广泛应用于计算机视觉、自然语言处理等领域,显著提升了模型的泛化能力和新任务的性能。
|
编解码 人工智能 文件存储
轻量级网络论文精度笔记(二):《YOLOv7: Trainable bag-of-freebies sets new state-of-the-art for real-time object ..》
YOLOv7是一种新的实时目标检测器,通过引入可训练的免费技术包和优化的网络架构,显著提高了检测精度,同时减少了参数和计算量。该研究还提出了新的模型重参数化和标签分配策略,有效提升了模型性能。实验结果显示,YOLOv7在速度和准确性上超越了其他目标检测器。
373 0
轻量级网络论文精度笔记(二):《YOLOv7: Trainable bag-of-freebies sets new state-of-the-art for real-time object ..》
|
新能源
【2023年第十三届APMCM亚太地区大学生数学建模竞赛】C题 中国新能源电动汽车的发展趋势 完整论文
2023年第十三届APMCM亚太地区大学生数学建模竞赛C题"中国新能源电动汽车的发展趋势"的完整论文
327 1
【2023年第十三届APMCM亚太地区大学生数学建模竞赛】C题 中国新能源电动汽车的发展趋势 完整论文
|
自然语言处理 程序员 Windows
[UE虚幻引擎] DTSpeechVoice 文字转语音播放 插件说明
这个插件用于在虚幻引擎(UE)中通过蓝图将文本转化为语音播放,利用Windows内置的语音引擎,支持Win10和Win11。确保电脑已安装语音系统,可能需要额外下载语言包以支持多语言播放。蓝图操作包括添加Speech Voice Component到Actor,使用Speak节点播放文本,Set Volume调整音量,Set Rate改变播放速度,Pause和Resume控制播放状态,Stop则停止播放且无法恢复。此外,Get Tokens和Set Token用于管理语音类型。更多详情可访问[80后程序员](https://dt.cq.cn/archives/1008?from=aliyun)
480 5
|
SQL 前端开发 Java
又是大佬开源的一款自动预约i茅台APP的系统
这是一篇关于自动预约i茅台APP系统的介绍。该项目是一个开源系统,支持每日自动预约茅台,并且可以使用Docker一键部署。系统特性包括注册账号、添加用户、自动预约、选择预约门店、模拟位置等。提供了GitHub和B站上的视频教程,以及IDEA和Docker的启动指南。用户可以通过链接访问项目代码和文档,了解详细信息。
|
数据采集 机器人 数据处理
阿里云RPA携手百胜软件助力大型制药企业降本增效
RPA全称机器人流程自动化(Robotic Process Automation),是一种新兴的“数字劳动力”,可以替代或辅助人完成规则明确的重复性劳动,大幅提升业务流程销量,实现企业业务流程的自动化和智能化,从而降本增效。目前,RPA解决方案的应用场景几乎涵盖了所有行业,包括银行、保险、制造、零售、医疗、物流、电子商务甚至政府和公共机构。
阿里云RPA携手百胜软件助力大型制药企业降本增效
|
存储 弹性计算 运维
Tair 的实操流程及常见问题 | 学习笔记
快速学习 Tair 的实操流程及常见问题
Tair 的实操流程及常见问题 | 学习笔记