方向导数和梯度

方向导数和梯度

  • 1 导数的回忆
  • 2 偏导数及其向量形式
    • 偏导数的几何意义
    • 偏导数的向量形式
  • 3 方向导数
    • 向量形式
    • 几何意义
    • 方向导数和偏导的关系
  • 4 梯度
  • 5 梯度下降算法

1 导数的回忆

导数的几何意义如图所示:

导数图像
P 0 P_{0} P0点不断接近 P P P时,导数如下定义:
f ′ ( x 0 ) = lim ⁡ △ x → 0 △ y △ x = lim ⁡ △ x → 0 f ( x 0 + △ x ) − f ( x 0 ) △ x {f}'(x_{0})=\lim\limits_{△x→0}\frac{△y}{△x} =\lim\limits_{△x→0}\frac{f(x_{0}+△x)-f(x_{0})}{△x} f(x0)=x0limxy=x0limxf(x0+x)f(x0)

2 偏导数及其向量形式

偏导数的几何意义

x x x的偏导数定义如下:
∂ f ∂ x ( x 0 , y 0 ) = lim ⁡ △ x → 0 f ( x 0 + △ x , y 0 ) − f ( x 0 , y 0 ) △ x \frac{\partial f}{\partial x}(x_{0},y_{0})=\lim\limits_{△x→0} \frac{f(x_{0}+△x,y_{0})-f(x_{0},y_{0})}{△x} xf(x0,y0)=x0limxf(x0+x,y0)f(x0,y0)
如图所示, M 0 ( x 0 , y 0 , f ( x 0 , y 0 ) ) M_{0}(x_{0},y{0},f(x_{0},y_{0})) M0(x0,y0,f(x0,y0))是曲线 z = f ( x , y ) z=f(x,y) z=f(x,y)的一点,过 M 0 M_{0} M0作平面 y = y 0 y=y_{0} y=y0,截此曲面得一曲线,此曲线的方程为: z = f ( x , y 0 ) z=f(x,y_{0}) z=f(x,y0),则上述对 x x x的偏导数就是在点 M 0 M_{0} M0处的切线 M 0 T x M_{0}T_{x} M0Tx对x轴的斜率。对 y y y的偏导数的几何意义同理。
偏导数

偏导数的向量形式

为了等一下方便理解方向导数,将上述的偏导数表示成向量形式。
a ⃗ = [ x 0 y 0 ] \vec{a}=\begin{bmatrix}x_{0}\\ y_{0}\end{bmatrix} a =[x0y0],则对 x x x的偏导数为:
∂ f ∂ x ( a ⃗ ) = lim ⁡ h → 0 f ( a ⃗ + h i ^ ) − f ( a ⃗ ) h \frac{\partial f}{\partial x}(\vec{a})=\lim\limits_{h→0} \frac{f(\vec{a}+h\hat{i})-f(\vec{a})}{h} xf(a )=h0limhf(a +hi^)f(a )

  • 其中 i ^ = [ 1 0 ] \hat{i}=\begin{bmatrix}1\\ 0\end{bmatrix} i^=[10]

3 方向导数

向量形式

从偏导数的向量形式可知:当 i ^ \hat{i} i^方向改变时,就产生了方向导数。
方向导数的定义如下:
∇ v ⃗ f ( a ⃗ ) = ∂ f ∂ v ⃗ ( a ⃗ ) = lim ⁡ h → 0 f ( a ⃗ + h v ⃗ ) − f ( a ⃗ ) h \nabla_{\vec{v}}f(\vec{a})=\frac{\partial f}{\partial \vec{v}}(\vec{a})=\lim\limits_{h→0} \frac{f(\vec{a}+h\vec{v})-f(\vec{a})}{h} v f(a )=v f(a )=h0limhf(a +hv )f(a )

  • 这种定义有一种问题,假设 v ⃗ \vec{v} v 变为原来的两倍,但分母不变,则实际上方向导数也会变成2倍。

如果要把方向导数表示成该方向的斜率,则应该用如下定义:
∇ v ⃗ f ( a ⃗ ) = ∂ f ∂ v ⃗ ( a ⃗ ) = lim ⁡ h → 0 f ( a ⃗ + h v ⃗ ) − f ( a ⃗ ) h ∣ v ⃗ ∣ \nabla_{\vec{v}}f(\vec{a})=\frac{\partial f}{\partial \vec{v}}(\vec{a})=\lim\limits_{h→0} \frac{f(\vec{a}+h\vec{v})-f(\vec{a})}{h|\vec{v}|} v f(a )=v f(a )=h0limhv f(a +hv )f(a )

  • 在该定义下,表示的是函数在某点沿着 a ⃗ \vec{a} a 方向上的导数,即斜率

几何意义

方向导数的非向量形式如下:
e l = ( c o s α , c o s β ) e_{l}=(cos\alpha,cosβ) el=(cosα,cosβ)是与 l l l同方向的单位向量,设射线 l l l P P P的坐标为 P = ( x 0 + t c o s α , y 0 + t c o s β ) P=(x_{0}+tcos\alpha,y_{0}+tcosβ) P=(x0+tcosα,y0+tcosβ),此时如下图所示:
图
此时函数增量与距离 ∣ P P 0 ∣ = t |PP_{0}|=t PP0=t的比值为:
f ( x 0 + t c o s α , y 0 + t c o s β ) − f ( x 0 , y 0 ) t \frac{f(x_{0}+tcos\alpha,y_{0}+tcosβ)-f(x_{0},y_{0})}{t} tf(x0+tcosα,y0+tcosβ)f(x0,y0)
P P P沿着 l l l趋于 P 0 P_{0} P0时,若极限存在,则称为函数 f ( x , y ) f(x,y) f(x,y)在点 P 0 P_{0} P0沿方向 l l l的的方向导数,即上面向量形式的第二种定义(只不过这里用了非向量形式),如下:
∂ f ∂ l ∣ ( x 0 , y 0 ) = lim ⁡ t → 0 + f ( x 0 + t c o s α , y 0 + t c o s β ) − f ( x 0 , y 0 ) t \frac{\partial f}{\partial l}\vert_{(x_{0},y_{0})}=\lim\limits_{t→0^{+}}\frac{f(x_{0}+tcos\alpha,y_{0}+tcosβ)-f(x_{0},y_{0})}{t} lf(x0,y0)=t0limtf(x0+tcosα,y0+tcosβ)f(x0,y0)
其几何意义如下图所示:如果要求A点在紫色向量方向上的斜率(红色线圈出来的),则可用方向导数
方向导数

方向导数和偏导的关系

定理: 如果函数 f ( x , y ) f(x,y) f(x,y)在点 P 0 ( x 0 , y 0 ) P_{0}(x_{0},y_{0}) P0(x0,y0)可微分,那么函数在该点沿任一方向 l l l的方向导数存在,且有
∂ f ∂ l ∣ ( x 0 , y 0 ) = f x ( x 0 , y 0 ) c o s α + f y c o s β \frac{\partial f}{\partial l}\vert_{(x_{0},y_{0})}=f_{x}(x_{0},y_{0})cos\alpha+f_{y}cosβ lf(x0,y0)=fx(x0,y0)cosα+fycosβ
其中 c o s α cos\alpha cosα c o s β cosβ cosβ是方向 l l l的方向余弦

证明:由函数 f ( x , y ) f(x,y) f(x,y)在点 P 0 ( x 0 , y 0 ) P_{0}(x_{0},y_{0}) P0(x0,y0)可微分可得:
f ( x 0 + △ x , y 0 + △ y ) − f ( x 0 , y 0 ) = f x ( x 0 , y 0 ) △ x + f y △ y + o ( △ x 2 + △ y 2 ) f(x_{0}+△x,y_{0}+△y)-f(x_{0},y_{0})=f_{x}(x_{0},y_{0})△x+f_{y}△y+o(\sqrt{△x^{2}+△y^{2} }) f(x0+x,y0+y)f(x0,y0)=fx(x0,y0)x+fyy+o(x2+y2 )
由上述可知: △ x = t c o s α , △ y = t c o s β △x=tcos\alpha,△y=tcosβ x=tcosα,y=tcosβ,则有: △ x 2 + △ y 2 = t \sqrt{△x^{2}+△y^{2} }=t x2+y2 =t
从而有:
lim ⁡ t → 0 + f ( x 0 + t c o s α , y 0 + t c o s β ) − f ( x 0 , y 0 ) t = lim ⁡ t → 0 + f x ( x 0 , y 0 ) t c o s α + f y t c o s β + o ( t ) t = f x ( x 0 , y 0 ) c o s α + f y c o s β \begin {aligned} {} \lim\limits_{t→0^{+}}\frac{f(x_{0}+tcos\alpha,y_{0}+tcosβ)-f(x_{0},y_{0})}{t}& =\lim\limits_{t→0^{+}}\frac{f_{x}(x_{0},y_{0})tcos\alpha+f_{y}tcosβ+o(t)}{t} \\&=f_{x}(x_{0},y_{0})cos\alpha+f_{y}cosβ \end {aligned} t0limtf(x0+tcosα,y0+tcosβ)f(x0,y0)=t0limtfx(x0,y0)tcosα+fytcosβ+o(t)=fx(x0,y0)cosα+fycosβ
相当于方向导数是偏导数的线性组合

4 梯度

在二元函数情况下,设函数 f ( x , y ) f(x,y) f(x,y)在平面区域 D D D内具有一阶连续偏导数,则对于每一点 P 0 ( x 0 , y 0 ) ∈ D P_{0}(x_{0},y_{0})∈D P0(x0,y0)D,都存在一个梯度,记作 grad f ( x 0 , y 0 ) \textbf{grad}f(x_{0},y_{0}) gradf(x0,y0) ▽ f ( x 0 , y 0 ) ▽f(x_{0},y_{0}) f(x0,y0)
grad f ( x 0 , y 0 ) = ▽ f ( x 0 , y 0 ) = [ ∂ f ∂ x ∂ f ∂ y ] \textbf{grad}f(x_{0},y_{0})=▽f(x_{0},y_{0})= \begin{bmatrix}\frac{\partial f}{\partial x} \\ \\ \frac{\partial f}{\partial y}\end{bmatrix} gradf(x0,y0)=f(x0,y0)= xfyf
因此,假设函数 f ( x , y ) f(x,y) f(x,y)在点 P 0 ( x 0 , y 0 ) P_{0}(x_{0},y_{0}) P0(x0,y0)可微分, e l = ( c o s α , c o s β ) e_{l}=(cos\alpha,cosβ) el=(cosα,cosβ)是与方向 l l l同向的方向向量,则方向导数和梯度的关系是:
∂ f ∂ l ∣ ( x 0 , y 0 ) = f x ( x 0 , y 0 ) c o s α + f y c o s β = ▽ f ( x 0 , y 0 ) ⋅ e l = ∣ ▽ f ( x 0 , y 0 ) ∣ ∣ e l ∣ c o s θ = ∣ ▽ f ( x 0 , y 0 ) ∣ c o s θ \begin {aligned} {} \frac{\partial f}{\partial l}\vert_{(x_{0},y_{0})}& = f_{x}(x_{0},y_{0})cos\alpha+f_{y}cosβ \\&=▽f(x_{0},y_{0}) \ \bm{\cdot} \ e_{l} \\&=|▽f(x_{0},y_{0})| \ |e_{l}| \ cos\theta \\&=|▽f(x_{0},y_{0})|\ cos\theta \end {aligned} lf(x0,y0)=fx(x0,y0)cosα+fycosβ=f(x0,y0)  el=∣▽f(x0,y0) el cosθ=∣▽f(x0,y0) cosθ
其中, θ \theta θ是向量 ▽ f ( x 0 , y 0 ) ▽f(x_{0},y_{0}) f(x0,y0)与向量 e l e_{l} el所成夹角,因此可以得出下述结论:

  • θ = 0 \theta=0 θ=0,向量 ▽ f ( x 0 , y 0 ) ▽f(x_{0},y_{0}) f(x0,y0)与向量 e l e_{l} el方向相同,此时方向导数最大,函数 f ( x , y ) f(x,y) f(x,y)增长最快
  • θ = π \theta=π θ=π,向量 ▽ f ( x 0 , y 0 ) ▽f(x_{0},y_{0}) f(x0,y0)与向量 e l e_{l} el方向相反,此时方向导数最小,函数 f ( x , y ) f(x,y) f(x,y)减少最快
  • θ = π 2 \theta=\frac{π}{2} θ=2π,向量 ▽ f ( x 0 , y 0 ) ▽f(x_{0},y_{0}) f(x0,y0)与向量 e l e_{l} el方向正交,函数 f ( x , y ) f(x,y) f(x,y)变化率为0
  • 综上,沿着梯度方向函数增长最快

5 梯度下降算法

梯度下降法(Gradient Descent)是一种用于寻找函数极小值的一阶迭代优化算法,又称为最速下降(Steepest Descent)。以下是梯度下降的基本公式:
θ ← θ − η ∂ L ( θ ) ∂ θ \theta \leftarrow \theta -η\frac{\partial L(\theta)}{\partial \theta } θθηθL(θ)
可以看出:

  • L ( θ ) L(\theta) L(θ)是关于 θ \theta θ的损失函数
  • η η η是学习率,称为梯度下降的步长,
  • 梯度下降法是让方向导数最小时做迭代

举一个例子:设 L ( θ ) = θ 2 L(\theta)=\theta^{2} L(θ)=θ2,则梯度 ▽ L ( θ ) = ∂ L ( θ ) ∂ θ = 2 θ ▽L(\theta)=\frac{\partial L(\theta)}{\partial \theta }=2\theta L(θ)=θL(θ)=2θ;设学习率为 η = 0.2 η=0.2 η=0.2;设初始值为 ( θ 0 , L ( θ 0 ) ) = ( 10 , 100 ) (\theta_{0},L(\theta_{0}))=(10,100) (θ0,L(θ0))=(10,100),此时梯度为: ▽ L ( θ 0 ) = 2 θ 0 = 20 ▽L(\theta_{0})=2\theta_{0}=20 L(θ0)=2θ0=20

  • 更新 θ \theta θ θ 1 ← θ 0 − η ∂ L ( θ 0 ) ∂ θ 0 = 10 − 0.2 × 20 = 6 \theta_{1} \leftarrow \theta_{0} -η\frac{\partial L(\theta_{0})}{\partial \theta_{0} } = 10-0.2×20=6 θ1θ0ηθ0L(θ0)=100.2×20=6
  • 重复上述步骤,直至 θ \theta θ收敛

代码如下:

import numpy as np
import matplotlib.pyplot as plt# 定义损失函数 y = x^2
def f(x):return x**2# 梯度下降函数
def gradient_descent(x, eta):# 计算斜率slope = 2 * x# 更新 x 的值x_out = x - eta * slopereturn x_out, slope# 主程序
def main():# 初始化参数x_data = np.linspace(-10, 10, 1000)  # x 范围LRate = 0.2  # 学习率slope_thresh = 0.0001  # 斜率阈值# 绘制损失函数图像plt.plot(x_data, f(x_data), 'c', linewidth=2)plt.title('y = x^2 (learning rate = 0.2)')plt.xlabel('x')plt.ylabel('y = x^2')plt.grid(True)# 初始点设置为 (10, f(10))x = 10y = f(10)plt.plot(x, y, 'r*')# 开始梯度下降迭代slope = float('inf')  # 初始斜率设置为无穷大while abs(slope) > slope_thresh:x_new, slope = gradient_descent(x, LRate)y_new = f(x_new)# 绘制当前点到更新后点的连线plt.plot([x, x_new], [y, y_new], 'k--', linewidth=1)# 绘制点plt.plot(x_new, y_new, 'r*')plt.legend(['y = x^2', 'Gradient descent path'])plt.draw()plt.pause(0.2)  # 暂停一小段时间,使得动态图像可见x = x_newy = y_newplt.show()# 当这个 .py 文件被直接运行时(作为主程序),执行 main() 函数;
# 当这个 .py 文件被导入到其他模块中时,不执行 main() 函数,因为 __name__ 的值不是 '__main__'。
if __name__ == '__main__':main()

应尽可能选择适中的学习率,过大会震荡,过小迭代次数会过多,如下所示,学习率为0.2更好。
当学习率 η = 0.2 η=0.2 η=0.2时,图像如下:学习率0.2
当学习率 η = 0.9 η=0.9 η=0.9时,图像如下:
学习率0.9
当学习率 η = 0.01 η=0.01 η=0.01时,图像如下:
学习率0.01

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Springboot学习之用EasyExcel4导入导出数据(基于MyBatisPlus)

一、POM依赖 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><m…

Feign-未完成

Feign Java中如何实现接口调用&#xff1f;即如何发起http请求 前三种方式比较麻烦&#xff0c;在发起请求前&#xff0c;需要将Java对象进行序列化转为json格式的数据&#xff0c;才能发送&#xff0c;然后进行响应时&#xff0c;还需要把json数据进行反序列化成java对象。 …

短信验证码实现

一、设置AccessKey 创建用户并配置使用权限&#xff0c;使我们拥有调用 aliyunAPI 的权限&#xff0c;之后会生成 AccessKeyID 和 AccessKey密码&#xff0c;后面我们会使用到。需要注意的是 AccessKeyID 和 AccessKey密码生成后我们需要将他保存起来&#xff0c;否则后期无法查…

multisim中关于74ls192n和DSWPK开关仿真图分析(减法计数器)

&#x1f3c6;本文收录于「Bug调优」专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收藏&&…

如何监控和分析 PostgreSQL 中的查询执行计划?

文章目录 一、为什么监控和分析查询执行计划很重要二、PostgreSQL 中用于获取查询执行计划的方法三、理解查询执行计划的关键元素四、通过示例分析查询执行计划五、优化查询执行计划的常见策略六、使用工具辅助分析七、结合实际案例的详细分析八、总结 在 PostgreSQL 数据库中&…

nginx的匹配及重定向

一、nginx的匹配&#xff1a; nginx中location的优先级和匹配方式&#xff1a; 1.精确匹配&#xff1a;location / 对字符串进行完全匹配&#xff0c;必须完全符合 2.正则匹配&#xff1a;location ^~ ^~ 前缀匹配&#xff0c;以什么为开头 ~区分大小写的匹配 ~* 不区分…

第十四届蓝桥杯省赛C++B组G题【子串简写】题解(AC)

题目大意 给定字符串 s s s&#xff0c;字符 a , b a, b a,b&#xff0c;问字符串 s s s 中有多少个 a a a 开头 b b b 结尾的子串。 解题思路 20pts 使用二重循环枚举左端点和右端点&#xff0c;判断是否为 a a a 开头 b b b 结尾的字符串&#xff0c;是则答案加一…

【74CH160组成60进制0-59】2021-11-22

缘由60进制计数 到达60后显示ff-嵌入式-CSDN问答 缘由《数电》用两片74160接成29进制计数器应该怎么接呢&#xff1f;-嵌入式-CSDN问答

Gitlab Fork Workflow(协作工作流)

Gitlab Fork WorkFlow&#xff08;协作工作流&#xff09; Fork WorkFlow用于团队间的协作开发。在开发过程中&#xff0c;我们都需要将最新修改的代码合并到代码库上&#xff0c;在代码合并之前&#xff0c;为了保证代码符合上传要求&#xff08;符合需求、代码规范等&#xf…

【MySQL基础篇】多表查询

1、多表关系 概述&#xff1a;项目开发中&#xff0c;在进行数据库表结构操作设计时&#xff0c;会根据业务需求及业务模板之间的关系&#xff0c;分析并设计表结构&#xff0c;由于业务之间相互关联&#xff0c;所以各个表结构之间也存在着各种联系&#xff0c;基本上分为三种…

Windows如何查看端口是否占用,并结束端口进程

需求与问题&#xff1a;前后端配置了跨域操作&#xff0c;但是仍然报错&#xff0c;可以考虑端口被两个程序占用&#xff0c;找不到正确端口或者后端接口书写是否规范&#xff0c;特别是利用Python Flask书写时要保证缩进是否正确&#xff01; Windows操作系统中&#xff0c;查…

实验五 图像增强—空域滤波

一、实验目的 了解图像平滑滤波器&#xff08;均值滤波和中值滤波&#xff09;和图像锐化算子&#xff08;Sobel算子、Prewitt算子、Laplacian算子&#xff09;在工程领域中的应用&#xff1b;理解图像平滑滤波器和图像锐化算子的工程应用范围&#xff1b;掌握图像平滑滤波器和…

Winform中使用HttpClient实现调用http的post接口并设置传参content-type为application/json示例

场景 Winform中怎样使用HttpClient调用http的get和post接口并将接口返回json数据解析为实体类&#xff1a; Winform中怎样使用HttpClient调用http的get和post接口并将接口返回json数据解析为实体类_winform解析json-CSDN博客 上面使用HttpClient调用post接口时使用的HttpCon…

SQL-DCL(三)

一.DCL介绍 DCL英文全称是Data Control Language(数据库控制语言),用来管理数据库 用户,控制数据库的访问权限。 二.两个方面 1.数据库可以由那些用户访问 2.可以访问那些内容 三.DCL-管理用户 1.查询用户 USE mysql SELECT * FROM user 2.创建用户 CREATE USER…

k8s 部署 springboot 项目内存持续增长问题分析解决

写在前面 工作中遇到&#xff0c;请教公司前辈解决&#xff0c;简单整理记忆博文内容涉及一次 GC 问题的分析以及解决理解不足小伙伴帮忙指正 &#x1f603;,生活加油 99%的焦虑都来自于虚度时间和没有好好做事&#xff0c;所以唯一的解决办法就是行动起来&#xff0c;认真做完…

Appium adb 获取appActivity

方法一&#xff08;最简单有效的方法&#xff09; 通过cmd命令&#xff0c;前提是先打开手机中你要获取包名的APP adb devices -l 获取连接设备详细信息 adb shell dumpsys activity | grep mFocusedActivity 有时获取到的不是真实的Activity 方法二 adb shell monkey -p …

从0-1实现一个前端脚手架

https://gitee.com/childe-jia/kfc-cli.git gitee完整地址 介绍 为什么需要脚手架&#xff1f; 脚手架本质就是一个工具&#xff0c;作用是能够让使用者专注于写代码&#xff0c;它可以让我们只用一个命令就生成一个已经配置好的项目&#xff0c;而不用我们再花时间去配置和安…

【排序算法】—— 快速排序

快速排序的原理是交换排序&#xff0c;其中qsort函数用的排序原理就是快速排序&#xff0c;它是一种效率较高的不稳定函数&#xff0c;时间复杂度为O(N*longN)&#xff0c;接下来就来学习一下快速排序。 一、快速排序思路 1.整体思路 以升序排序为例&#xff1a; (1)、首先随…

CC工具箱使用指南:【相交占比分析】

一、简介 需求场景如下&#xff0c;有【待分析地块】和【面积占比参考】2个图层。2个图层之间存在空间上的重叠。工具的目的是为了分析出【待分析地块】的每1个图斑中&#xff0c;和【面积占比参考】相交的面积&#xff0c;以及和总面积的占比。 举一个应用场景为例&#xff0…

Idea新增Module报错:sdk ‘1.8‘ type ‘JavaSDK‘ is not registered in ProjectJdkTable

文章目录 一&#xff0c;创建Module报错二&#xff0c;原因分析三&#xff0c;解决方案1&#xff0c;点击上图的加号&#xff0c;把JDK8添加进来即可2&#xff0c;点击左侧[Project]&#xff0c;直接设置SDK为JDK8 四&#xff0c;配置检查与验证 一&#xff0c;创建Module报错 …