梯度计算(MATLAB和pytorch实例)

news/2025/2/24 10:11:20/
  • 梯度计算概述
  • 梯度计算的原理
  • 对于离散数据而言
    • 一维离散数据的梯度近似
      • 前向差分(Forward Difference)
      • 后向差分(Backward Difference)
      • 中心差分(Central Difference)
    • 二维离散数据的梯度近似
    • 多维扩展(以三维为例)
    • 误差分析与步长选择

梯度计算概述

梯度计算是数学和工程中的基础工具,梯度计算通常用于图像处理、数值分析和优化等领域。梯度可以帮助我们了解函数值的变化率。

梯度在科学与工程中广泛应用,例如:

  • 优化算法:梯度下降法(Gradient Descent)利用负梯度方向寻找函数最小值。
  • 物理场分析:电场、重力场的梯度表示场强的变化方向。
  • 图像处理:边缘检测通过梯度识别像素值的突变方向。

下面是个二维函数:

f ( x , y ) = x 2 + y 2 f(x,y)={{x}^{2}}+{{y}^{2}} f(x,y)=x2+y2

使用MATLAB输出结果矩阵和三维图形:

z_func_mesh

为了计算二维函数 f ( x , y ) = x 2 + y 2 f(x,y)={{x}^{2}}+{{y}^{2}} f(x,y)=x2+y2 在某一点的梯度,我们需要求出该函数在 x 和 y 方向上的偏导数,并将它们组合成一个向量。

将 y 视为常数,对 x 求导:

∂ f ∂ x = ∂ ∂ x ( x 2 + y 2 ) = 2 x \frac{\partial f}{\partial x}=\frac{\partial }{\partial x}({{x}^{2}}+{{y}^{2}})=2x xf=x(x2+y2)=2x

将 x 视为常数,对 y 求导:

∂ f ∂ y = ∂ ∂ y ( x 2 + y 2 ) = 2 y \frac{\partial f}{\partial y}=\frac{\partial }{\partial y}({{x}^{2}}+{{y}^{2}})=2y yf=y(x2+y2)=2y

组合偏导数形成梯度向量

梯度向量由上述两个偏导数组成

▽ f = ( ∂ f ∂ x , ∂ f ∂ x ) = ( 2 x , 2 y ) ▽f=(\frac{\partial f}{\partial x},\frac{\partial f}{\partial x})=(2x,2y) f=(xf,xf)=(2x,2y)

由此可得,二维函数 f ( x , y ) = x 2 + y 2 f(x,y)={{x}^{2}}+{{y}^{2}} f(x,y)=x2+y2 在任意一点 ( x , y ) (x,y) (x,y) d 梯度 ▽ f = ( 2 x , 2 y ) ▽f=(2x,2y) f=(2x,2y)

**总结:**对于函数 f ( x , y ) = x 2 + y 2 f(x,y)={{x}^{2}}+{{y}^{2}} f(x,y)=x2+y2 来说,它的梯度标量上的含义即是各自在x轴和y轴方向上的偏导数;两者组合成一个在二维平面上的向量;从而在三维空间上表示此函数所描绘的曲平面的斜率和斜率的方向。

梯度计算的原理

数学定义

梯度是多元函数的导数推广,表示函数在某一点处所有方向上的最大变化率。对于函数 f ( x 1 , x 1 , . . . , x 1 ) f({x}_{1},{x}_{1},...,{x}_{1}) f(x1,x1,...,x1) ,其梯度是一个向量:

∇ f = ( ∂ f ∂ x 1 , ∂ f ∂ x 2 , . . . ∂ f ∂ x n , ) ∇f=\left ({\frac{\partial f}{\partial {{x}_{1}}},\frac{\partial f}{\partial {{x}_{2}}},...\frac{\partial f}{\partial {{x}_{n}}},}\right ) f=(x1f,x2f,...xnf,)

方向指向函数值增长最快的方向,模长为该方向的变化率。

对于离散数据而言

一维离散数据的梯度近似

假设有一维离散数据点 f ( x i ) f({x}_{i}) f(xi),步长为 h = x i + 1 − x i h={x}_{i+1}-{x}_{i} h=xi+1xi ,梯度(导数)的近似方法有三种:

前向差分(Forward Difference)

f ′ ( x i ) ≈ f ( x i + 1 ) − f ( x i ) h {{f}^{'}}({{x}_{i}})≈\frac{f({{x}_{i+1}})-f({{x}_{i}})}{h} f(xi)hf(xi+1)f(xi)

特点:仅用右侧相邻点,计算简单,但精度较低(一阶误差 O ( h ) O(h) O(h))。

后向差分(Backward Difference)

f ′ ( x i ) ≈ f ( x i ) − f ( x i − 1 ) h {{f}^{'}}({{x}_{i}})≈\frac{f({{x}_{i}})-f({{x}_{i-1}})}{h} f(xi)hf(xi)f(xi1)

特点:仅用左侧相邻点,计算简单,但精度较低(一阶误差 O ( h ) O(h) O(h))。

中心差分(Central Difference)

f ′ ( x i ) ≈ f ( x i + 1 ) − f ( x i − 1 ) 2 h {{f}^{'}}({{x}_{i}})≈\frac{f({{x}_{i+1}})-f({{x}_{i-1}})}{2h} f(xi)2hf(xi+1)f(xi1)

特点:利用左右两侧点,精度更高(二阶误差 O ( h 2 ) O({h}^{2}) O(h2)),但需要更多数据。

二维离散数据的梯度近似

对二维网格数据 f ( x i ) f({x}_{i}) f(xi),需分别计算 x 和 y 方向的偏导数,再组合成梯度向量

∇ f = ( ∂ f ∂ x , ∂ f ∂ y ) ∇f=\left ({\frac{\partial f}{\partial {{x}}},\frac{\partial f}{\partial {{y}}}}\right ) f=(xf,yf)

计算 x 方向的偏导数

中心差分公式(假设网格均匀,步长 h x {h}_{x} hx

∂ f ∂ x ( x i , y i ) ≈ f ( x i + 1 , y i ) − f ( x i − 1 , y i ) 2 h x \frac{\partial f}{\partial x}({{x}_{i}},{{y}_{i}})≈\frac{f({{x}_{i+1}},{{y}_{i}})-f({{x}_{i-1}},{{y}_{i}})}{2{{h}_{x}}} xf(xi,yi)2hxf(xi+1,yi)f(xi1,yi)

计算 y 方向的偏导数

中心差分公式(假设网格均匀,步长 h y {h}_{y} hy

∂ f ∂ y ( x i , y i ) ≈ f ( x i , y i + 1 ) − f ( x i , y i − 1 ) 2 h x \frac{\partial f}{\partial y}({{x}_{i}},{{y}_{i}})≈\frac{f({{x}_{i}},{{y}_{i+1}})-f({{{x}_{i}},{y}_{i-1}})}{2{{h}_{x}}} yf(xi,yi)2hxf(xi,yi+1)f(xi,yi1)

边界点的处理

边缘点(如 x 0 {x}_{0} x0 y 0 {y}_{0} y0 )无法使用中心差分,需改用前向或后向差分:

∂ f ∂ y ( x 0 , y i ) ≈ f ( x 1 , y i ) − f ( x 0 , y i ) h x \frac{\partial f}{\partial y}({{x}_{0}},{{y}_{i}})≈\frac{f({{x}_{1}},{{y}_{i}})-f({{{x}_{0}},{y}_{i}})}{{{h}_{x}}} yf(x0,yi)hxf(x1,yi)f(x0,yi)

假设均匀网格数据 f ( x , y ) = x 2 + y 2 f(x,y)={{x}^{2}}+{{y}^{2}} f(x,y)=x2+y2 网格步长 h x = h y = 1 {h}_{x}={h}_{y}=1 hx=hy=1 ,计算点(2,3)的梯度:

计算
∂ f ∂ x \frac{\partial f}{\partial x} xf

f ( 1 , 3 ) = 10 f(1,3)=10 f(1,3)=10 f ( 3 , 3 ) = 18 f(3,3)=18 f(3,3)=18 ( 18 − 10 ) / 2 = 4 (18-10)/2=4 (1810)/2=4;

计算
∂ f ∂ y \frac{\partial f}{\partial y} yf

f ( 2 , 2 ) = 8 f(2,2)=8 f(2,2)=8 f ( 2 , 4 ) = 20 f(2,4)=20 f(2,4)=20 ( 20 − 8 ) / 2 = 6 (20-8)/2=6 (208)/2=6;

所以点(2,3)的梯度: ▽ f = ( 4 , 6 ) ▽f=(4,6) f=(4,6) ,与理论值一致。

使用pytorch进行验证

import torch# 定义变量并启用梯度跟踪
x = torch.tensor(2.0, requires_grad=True)
y = torch.tensor(3.0, requires_grad=True)# 计算函数值
f = x**2 + y**2# 反向传播,计算梯度
f.backward()# 输出梯度
print("▽f=(", x.grad.item(), y.grad.item(),")")

多维扩展(以三维为例)

对三维数据 f ( x i , y i , z k ) f({x}_{i},{y}_{i},{z}_{k}) f(xi,yi,zk) ,梯度为:

∇ f = ( ∂ f ∂ x , ∂ f ∂ y , ∂ f ∂ z , ) ∇f=\left ({\frac{\partial f}{\partial {{x}}},\frac{\partial f}{\partial {{y}}},\frac{\partial f}{\partial {{z}}},}\right ) f=(xf,yf,zf,)

每个方向的偏导数均用中心差分近似,例如:

∂ f ∂ z ( x i , y i , z k ) ≈ f ( x i , y i , z k + 1 ) − f ( x i , y i , z k − 1 ) 2 h x \frac{\partial f}{\partial z}({{x}_{i}},{y}_{i},{{z}_{k}})≈\frac{f({{x}_{i}},{y}_{i},{{z}_{k+1}})-f({{{x}_{i}},{y}_{i},{z}_{k-1}})}{2{{h}_{x}}} zf(xi,yi,zk)2hxf(xi,yi,zk+1)f(xi,yi,zk1)

误差分析与步长选择

  • 截断误差:由泰勒展开的高阶项忽略导致,中心差分误差更小。
  • 舍入误差:步长 h 过小时,计算机浮点运算可能放大噪声。
  • 平衡策略:选择适中的 h,通常取数据采样间隔或通过试验确定。

数值差分法通过局部线性近似将连续的导数转化为离散差值运算,是处理实验数据、图像或仿真结果的实用工具。其核心在于:

  1. 选择差分公式(前向、后向、中心)平衡精度与数据可用性。
  2. 合理处理边界条件。
  3. 优化步长以平衡截断误差与舍入误差。

这一方法在工程、物理、计算机视觉和机器学习中广泛应用,例如图像边缘检测、流体动力学模拟和优化算法中的梯度估计。


http://www.ppmy.cn/news/1574607.html

相关文章

Java 使用websocket

添加依赖 <!-- WebSocket 支持 --> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId> </dependency>添加配置类 Configuration public class WebSocketConfig {B…

HAProxy介绍与编译安装

目录 1、HAProxy介绍 2、HAProxy编译安装 Centos 基础环境 Ubuntu 基础环境 编译安装HAProxy 验证HAProxy版本 HAProxy启动脚本 配置文件 启动haproxy 验证haproxy状态 查看haproxy的状态页面 1、HAProxy介绍 HAProxy是法国开发者 威利塔罗(Willy Tarreau) 在2000年…

2024华为OD机试真题-单词接龙(C++)-E卷B卷-100分

2024华为OD机试最新题库-(C卷+D卷+E卷)-(JAVA、Python、C++) 目录 题目描述: 输入描述: 输出描述: 示例1 示例2 题目解析 考点 代码 c++ 题目描述: 单词接龙的规则是:可用于接龙的单词首字母必须要前一个单词的尾字母相同; 当存在多个首字母相同的单词时,取…

不同activity的mViewModel是复用同一个的还是每个activity都是创建新的ViewModel

不同activity的mViewModel是复用同一个的还是每个activity都是创建新的ViewModel&#xff1f; DeepSeek R1 思考 16 秒 思考过程 用户的问题是关于在Android开发中&#xff0c;不同的Activity是否应该复用同一个ViewModel还是每个Activity都创建新的。首先&#xff0c;我需要…

【HarmonyOS Next】拒绝权限二次申请授权处理

【HarmonyOS Next】拒绝权限二次申请授权处理 一、问题背景&#xff1a; 在鸿蒙系统中&#xff0c;对于用户权限的申请&#xff0c;会有三种用户选择方式&#xff1a; 1.单次使用允许 2.使用应用期间&#xff08;长时&#xff09;允许 3.不允许 当用户选择不允许后&#xff0…

【C++八股】内存对⻬

内存对齐是指编译器按照特定规则安排数据在内存中的存储位置&#xff0c;以提高程序的执行效率和可移植性。 内存对齐的原因&#xff1a; 1. 性能优化&#xff1a; 现代处理器通常要求数据在内存中按照特定的边界对齐&#xff0c;以提高内存访问效率。 如果数据未对齐&#x…

Caffeine:高性能的Java本地缓存库

文章目录 引言什么是Caffeine&#xff1f;Caffeine的主要特点Caffeine的使用方法Caffeine与Google Guava Cache的对比Caffeine与Ehcache的对比总结 引言 在现代软件开发中&#xff0c;缓存是提高应用性能的重要手段之一。通过缓存&#xff0c;可以减少对数据库或其他外部系统的…

2000-2019年各省森林覆盖率数据

2000-2019年各省森林覆盖率数据 1、时间&#xff1a;2000-2019年 2、来源&#xff1a;国家统计局、统计年鉴 3、指标&#xff1a;行政区划代码、地区、年份、森林覆盖率(%) 4、范围&#xff1a;31省 5、指标解释&#xff1a;森林覆盖率是指森林面积占土地总面积的比率&…