matplotlib 动态显示梯度下降过程

news2024/11/26 14:26:37

文章目录

  • 简介
  • 曲线下降
  • 曲面下降

简介

梯度下降是一种优化算法,常用于寻找函数的最小值或最大值。它通过迭代更新参数的方式逐步减小(或增大)目标函数的值,直到达到某个停止条件为止。梯度下降的基本思想是沿着目标函数的负梯度方向进行搜索,以便找到函数的极值点。

梯度下降步骤:

  1. 初始化参数:选择初始参数值,通常为随机值或者根据问题的特点进行选择。

  2. 计算梯度:计算目标函数在当前参数值处的梯度。梯度是函数在给定点的导数,它表示函数在该点上升(或下降)最快的方向。

  3. 更新参数:根据梯度的方向和大小,更新当前参数值。更新规则通常是将当前参数值沿着负梯度方向移动一定步长,以减小目标函数的值。

  4. 重复步骤2和3:重复计算梯度并更新参数的过程,直到达到停止条件。停止条件可以是达到最大迭代次数、梯度足够小、或者函数值的变化足够小等。

梯度下降算法可以分为多种类型,包括批量梯度下降(Batch Gradient Descent)、随机梯度下降(Stochastic Gradient Descent)、小批量梯度下降(Mini-batch Gradient Descent)等。它们的区别主要在于每次迭代时使用的数据量不同。

  • 批量梯度下降(Batch Gradient Descent):在每次迭代时使用全部训练数据计算梯度。

  • 随机梯度下降(Stochastic Gradient Descent):在每次迭代时随机选择一个样本计算梯度。这种方法计算速度快,但可能会导致不稳定的更新。

  • 小批量梯度下降(Mini-batch Gradient Descent):每次迭代时使用一小部分训练数据计算梯度。这种方法结合了批量梯度下降和随机梯度下降的优点,通常是最常用的方法。

梯度下降算法的性能受到学习率、初始化参数、停止条件等超参数的影响。选择合适的超参数对于算法的收敛速度和最终结果至关重要。通常需要通过实验和调参来确定最佳的超参数值。

曲线下降

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation

# 定义目标函数和其梯度
def f(x):
    return x**2

def grad_f(x):
    return 2*x

# Adam优化器参数
alpha = 0.1  # 学习率
epsilon = 1e-6  # 停止条件:梯度接近零
max_iterations = 1000  # 最大迭代次数

# 初始化参数
x = 3.0  # 初始参数值

# 记录每次迭代的参数值和函数值
x_values = [x]  # 用于存储每次迭代后的参数值
y_values = [f(x)]  # 用于存储每次迭代后的函数值

# 梯度下降迭代
for i in range(max_iterations):
    grad = grad_f(x)  # 计算当前参数的梯度
    x = x - alpha * grad  # 更新参数
    x_values.append(x)  # 记录更新后的参数值
    y_values.append(f(x))  # 记录更新后的函数值
    if abs(grad) < epsilon:  # 如果梯度接近零,停止迭代
        break

# 设置绘图
fig, ax = plt.subplots()
x_range = np.linspace(-4, 4, 100)
ax.plot(x_range, f(x_range), label='Function')
point, = ax.plot([], [], 'ro')  # 初始化一个红色圆点,用于表示每次迭代后的参数位置
text = ax.text(0.02, 0.95, '', transform=ax.transAxes)  # 初始化一个文本标签,用于显示参数和函数值

def init():
    """初始化函数,设置动画开始时的绘图内容"""
    point.set_data([], [])  # 初始时红色圆点的位置为空
    text.set_text('')  # 初始时文本内容为空
    return point, text

def update(frame):
    """更新函数,逐帧更新动画内容"""
    x = x_values[frame]  # 获取当前帧对应的参数值
    y = y_values[frame]  # 获取当前帧对应的函数值
    point.set_data(x, f(x))  # 更新红色圆点的位置
    text.set_text(f'x = {x:.4f}\nf(x) = {y:.4f}')  # 更新文本内容,显示当前参数和函数值
    return point, text

# 创建动画
ani = FuncAnimation(fig, update, frames=range(len(x_values)),
                    init_func=init, blit=True, interval=50, repeat=False)

# 设置图例、标签和标题
ax.legend()
ax.set_xlabel('x')
ax.set_ylabel('f(x)')
ax.set_title('Gradient Descent Visualization on a Simple Function')

# 显示图形
plt.show()

print(f"Minimum point: x = {x_values[-1]}, f(x) = {y_values[-1]}")

在这里插入图片描述

曲面下降

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation

# 定义目标函数
def f(x, y):
    return x**2 + y**2

# 定义目标函数的梯度
def grad_f(x, y):
    return np.array([2*x, 2*y])

# 定义梯度下降算法
def gradient_descent(starting_point, learning_rate, iterations):
    x = starting_point
    trajectory = [x]
    for _ in range(iterations):
        x = x - learning_rate * grad_f(*x)
        trajectory.append(x)
    return np.array(trajectory)

# 设置参数
starting_point = np.array([3.0, 4.0])  # 初始参数值
learning_rate = 0.1  # 学习率
iterations = 50  # 迭代次数

# 运行梯度下降算法
trajectory = gradient_descent(starting_point, learning_rate, iterations)

# 设置绘图
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_zlabel('f(x, y)')
ax.set_title('Gradient Descent Visualization')

# 绘制曲面
x = np.linspace(-5, 5, 100)
y = np.linspace(-5, 5, 100)
X, Y = np.meshgrid(x, y)
Z = f(X, Y)
ax.plot_surface(X, Y, Z, cmap='viridis', alpha=0.8)

# 初始化动画
line, = ax.plot([], [], [], 'r-')
point, = ax.plot([], [], [], 'ro')
def init():
    line.set_data([], [])
    line.set_3d_properties([])
    point.set_data([], [])
    point.set_3d_properties([])
    return line, point

# 更新动画
def update(frame):
    current_point = trajectory[frame]
    line.set_data(trajectory[:frame, 0], trajectory[:frame, 1])
    line.set_3d_properties(f(*trajectory[:frame].T))
    point.set_data(current_point[0], current_point[1])
    point.set_3d_properties(f(*current_point))
    return line, point

# 创建动画
ani = FuncAnimation(fig, update, frames=iterations, init_func=init, blit=True)

# 显示动画
plt.show()

在这里插入图片描述

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

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

相关文章

BeagleBone Black入门总结

文章目录 参考连接重要路径系统镜像下载访问 BeagleBone 参考连接 镜像下载启动系统制作&#xff1a;SD卡烧录工具入门书籍推荐&#xff1a;BeagleBone cookbookBeagleBone概况&#xff1f; 重要路径 官方例程及脚本路径&#xff1a;/var/lib/cloud9 系统镜像下载 疑问&am…

电子设计教学新篇章:SmartEDA引领学校教学升级风潮

在数字化时代的浪潮中&#xff0c;电子设计教学领域正迎来一场革命性的变革。SmartEDA&#xff0c;作为电子设计课程的新宠&#xff0c;以其高效、智能的特性&#xff0c;正成为学校教学升级的重要推手。它不仅极大地提升了电子设计的效率&#xff0c;还为学生们带来了更为深入…

TOGAF数字化转型的关键(文尾附在线TOGAF免费测试)

业务架构驱动数据架构和应用架构的设计&#xff0c;而应用架构又依赖于数据架构和技术架构的支持。技术架构则为整个架构提供了稳定的基础设施。 在数字化转型中&#xff0c;协调和整合这四种架构是至关重要的。通过确保它们之间的一致性和协同工作&#xff0c;可以实现企业业务…

使用OpenPCDet训练与测试Transformer模型:如何加载自己的数据集

引言 Transformer架构因其强大的序列处理能力和长距离依赖捕捉能力&#xff0c;在自然语言处理领域取得了巨大成功。近年来&#xff0c;这一架构也被引入3D物体检测领域&#xff0c;如Voxel Transformer等&#xff0c;显著提升了模型在复杂场景下的检测性能。OpenPCDet整合了多…

K8s速览

k8s的核心能力 ● 服务发现与负载均衡 ● 服务恢复 ● 服务伸缩 ● 自动发布与回滚 ● 批量执行 架构 server-client两层架构&#xff0c;Master作为中央管控节点&#xff0c;会和每一个Node进行一个连接&#xff1b; 所有UI层&#xff0c;client的操作&#xff0c;只会和Mat…

英伟达Docker 安装与GPu镜像拉取

获取nvidia_docker压缩包nvidia_docker.tgz将压缩包上传至服务器指定目录解压nvidia_docker.tgz压缩包 tar -zxvf 压缩包执行rpm安装命令&#xff1a; #查看指定rpm包安装情况 rpm -qa | grep libstdc #查看指定rpm包下的依赖包的版本情况 strings /lib64/libstdc |grep GLI…

酒店旅游API服务汇总

各大旅游平台常用API服务汇总&#xff1a; 实时房源服务【Airbnb】飞猪旅行开放服务途牛旅行开放平台API华为云数字差旅【差旅管理】动态信息接口【美团酒店】旅行商城商家管理API【马蜂窝】交易流程接口【美团酒店】电子导游【携程旅行】

STM32编程:实现LED灯闪烁(基于手写SDK的方式)

项目结构 stm32f10x.h 文件 //寄存器的值常常是芯片外设自动更改的&#xff0c;即使CPU没有执行程序&#xff0c;也有可能发生变化 //编译器有可能会对没有执行程序的变量进行优化//volatile表示易变的变量&#xff0c;防止编译器优化&#xff0c; #define __IO volati…

CSAPP Lab02——Bomb Lab完成思路详解

看见的看不见的 瞬间的永恒的 青草长啊大雪飘扬 ——月亮之上 完整代码见&#xff1a;CSAPP/bomb at main SnowLegend-star/CSAPP (github.com) 01 字符串比较 简单的把输入的字符串和地址“0x402400”内早已存储的字符串相比较。如果两个字符串相等则函数返回&#xff0c;否…

SpringBoot+Vue甘肃非物质文化网站(前后端分离)

技术栈 JavaSpringBootMavenMySQLMyBatisVueShiroElement-UI 系统角色对应功能 用户管理员 系统功能截图

SpringBoot Elasticsearch07-以黑马商场为例-黑马程序员学习笔记

06篇已经导入了大量数据到elasticsearch中&#xff0c;实现了商品数据的存储。不过查询商品数据时依然采用的是根据id查询&#xff0c;而非模糊搜索。 接下来研究下elasticsearch的数据搜索功能。Elasticsearch提供了基于JSON的DSL&#xff08;Domain Specific Language&#…

2024年06月数据库流行度最新排名

点击查看最新数据库流行度最新排名&#xff08;每月更新&#xff09; 2024年06月数据库流行度最新排名 TOP DB顶级数据库索引是通过分析在谷歌上搜索数据库名称的频率来创建的 一个数据库被搜索的次数越多&#xff0c;这个数据库就被认为越受欢迎。这是一个领先指标。原始数…

09-数组的含义以及零长数组变长数组与多维数组

09-数组的含义以及零长数组变长数组与多维数组 文章目录 09-数组的含义以及零长数组变长数组与多维数组一、数组名的含义1.1 表示整个数组的首地址1.2 表示整个数组首元素的首地址 二、数组下标字符串常量 三、零长数组3.1 示例 四、变长数组4.1 示例 五、多维数组5.1 定义与初…

UML实现图-部署图

概述 部署图(Deployent Diagram)描述了运行软件的系统中硬件和软件的物理结构。部署图中通常包含两种元素:节点和关联关系&#xff0c;部署图中每个配置必须存在于某些节点上。部署图也可以包含包或子系统。 节点是在运行时代表计算机资源的物理元素。节点名称有两种:简单名和…

APP开发技术的变迁史

随着移动互联网的迅猛发展&#xff0c;APP&#xff08;应用程序&#xff09;已经成为人们日常生活中不可或缺的一部分。从最初的简单工具到如今的智能平台&#xff0c;APP开发技术在这十年间经历了翻天覆地的变化。本文将从多个维度探讨近十年来APP开发技术的变迁史&#xff0c…

NVeloDocx一个基于NVelocity的word模版引擎

NVeloDocx是一个基于NVelocity的Word模版引擎&#xff0c;目前主要是用于E6低代码开发平台供用户轻松制作各种Word报告模版。 有以下优点&#xff1a; 1、完全的NVelocity语法&#xff1b; 2、直接在Word中写NVelocity脚本&#xff0c;使用非常非常方便&#xff1b; 3、完全兼…

阅读笔记:Life of a Pixel

PPT地址&#xff1a;​​​​​​​​​​​​​​https://docs.google.com/presentation/d/1boPxbgNrTU0ddsc144rcXayGA_WF53k96imRH8Mp34Y/edit?uspsharing 这份PPT讲述了Chromium浏览器内核中html文档渲染成像素的主要过程。网上有很多介绍和转载&#xff0c;内容非常硬核。…

数据结构及研究

**数据结构是计算机存储、组织数据的方式&#xff0c;它是相互之间存在一种或多种特定关系的数据元素的集合**Θic-1ΘΘic-2ΘΘic-3ΘΘic-4ΘΘic-5Θ。 数据结构这一概念在计算机科学领域扮演着至关重要的角色&#xff0c;它不仅决定了数据在计算机内部的存储方式&#xf…

lubuntu / ubuntu 配置静态ip

一、查看原始网络配置信息 1、获取网卡名称 ifconfig 2、查询网关IP route -n 二、编辑配置文件 去/etc/netplan目录找到配置文件&#xff0c;配置文件名一般为01-network-manager-all.yaml sudo vim /etc/netplan/01-network-manager-all.yaml文件打开后内容如下 # This …

玄机平台应急响应—apache日志分析

1、前言 apache的日志一共有两个&#xff0c;一个是access.log&#xff0c;这个日志记录了所有对Web服务器的访问&#xff0c;被入侵时重点排查这个。另一个是error.log&#xff0c;错误日志记录了服务器运行期间遇到的各种错误&#xff0c;以及一些普通的诊断信息&#xff0c…