【凸优化】Gradient Descent and Newton Descent【梯度下降法和牛顿下降法】(含Python代码绘制等高线图)

news2024/11/19 8:37:32

文章目录

  • Gradient Descent and Newton Descent
    • 一、下降法【Descent】
    • 二、梯度下降法【Gradient Descent】
    • 三、牛顿下降法【Newton Descent】
    • 四、示例Example
    • 五、Reference

Gradient Descent and Newton Descent

一、下降法【Descent】

image-20221105200024079

首先介绍什么是下降法【Descent Methods】,下降法就是求解无约束优化问题的一种基本方法。无约束最小化问题是指:

image-20221105200024079

无约束最小化问题满足以下的条件:

  • 最小化函数 f ( x ) f(x) f(x)
  • f ( x ) f(x) f(x)是凸函数,二阶连续可导
  • 并且 f ( x ) f(x) f(x)的最优值是能够求解的

下降法通俗的理解就是从初始 x ( 0 ) \bold{x}(0) x(0)开始,然后指定迭代的方向 Δ x \Delta{x} Δx,指定每次迭代的步长 t t t,经过迭代(如果没有达到迭代终止条件,则迭代完指定次数),经过这样迭代的搜索最终寻找到最终值。
其中 x ( k + 1 ) = x ( k ) + t ( k ) Δ x ( k ) x^{(k+1)}=x^{(k)}+t^{(k)}\Delta{x^{(k)}} x(k+1)=x(k)+t(k)Δx(k)是每次的参数更新公式, x ( k + 1 ) x^{(k+1)} x(k+1)代表第 k + 1 k+1 k+1次的参数, t ( k ) t^{(k)} t(k)是第 k k k次的迭代步长, Δ x ( k ) \Delta{x^{(k)}} Δx(k)是第 k k k次的迭代方向。

二、梯度下降法【Gradient Descent】

接下来,介绍什么是梯度下降法【Gradient Descent】

image-20221105200024079

梯度下降法只是在下降法的基础上,将下降的方向 Δ x \Delta{x} Δx修改为 − ∇ f ( x ) -\nabla{f(x)} f(x),同时增加了终止条件 ∥ ∇ f ( x ) ∥ 2 ≤ ϵ \Vert\nabla{f(x)}\Vert_2\le\epsilon ∥∇f(x)2ϵ,其中 ϵ \epsilon ϵ是容忍限度,是一个极小值。

三、牛顿下降法【Newton Descent】

然后介绍什么是牛顿下降法【Newton Descent】

image-20221105200024079

牛顿下降法也是在下降法的基础上进行了更改,将下降的方向更改为 Δ x = Δ x n t \Delta{x}=\Delta{x_{nt}} Δx=Δxnt Δ x n t : = − ∇ 2 f ( x ) − 1 ∇ f ( x ) \Delta{x_{nt}}:=-\nabla^2f(x)^{-1}\nabla{f(x)} Δxnt:=2f(x)1f(x),且增加了终止条件 λ 2 : = ∇ f ( x ) T ∇ 2 f ( x ) − 1 ∇ f ( x ) ≤ ϵ \lambda^2:=\nabla{f(x)^T}\nabla^2f(x)^{-1}\nabla{f(x)}\le\epsilon λ2:=f(x)T2f(x)1f(x)ϵ,其中 ϵ \epsilon ϵ是容忍限度,是一个极小值。其中, ∇ 2 f ( x ) \nabla^2f(x) 2f(x)是Hessian矩阵,具体的求法如下

image-20221105200024079

四、示例Example

考虑以下的凸优化问题:
m i n x 1 , x 2 1 2 ( x 1 2 + 3 x 2 2 ) \underset{x_1,x_2}{min}\quad{\frac{1}{2}(x_1^2+3x_2^2)} x1,x2min21(x12+3x22)

分别利用梯度下降法和牛顿下降法进行求解

import numpy as np
import matplotlib.pyplot as plt

fig1 = plt.figure()
ax3 = plt.axes(projection='3d')

def func(x1,x2):
    return (np.power(x1,2) + 3*np.power(x2,2)) / 2
    
#------------------------------Gradient Descent------------------------------
# 用近似导数来代替导数,方便数值计算,且更具一般性
def df_x1(f, x1, x2, delta=1e-4):
    return (f(x1+delta,x2) - f(x1-delta,x2)) / (2*delta)
def df_x2(f, x1, x2, delta=1e-4):
    return (f(x1,x2+delta) - f(x1,x2-delta)) / (2*delta)

# 定义三维绘制点坐标
X1 = np.arange(-5,5,0.1)
X2 = np.arange(-5,5,0.1)
X1s, X2s = np.meshgrid(X1,X2)
Ys = func(X1s, X2s)
# 绘图渲染和显示
ax3.plot_surface(X1s,X2s,Ys, cmap='rainbow')
plt.title("3D function figure")
plt.show()

# 设置学习率和循环次数
alpha = 0.1
max_loop = 50
# 初始化x1=2,x2=2
X_init = np.matrix([2,2])

# 开辟存储空间
x1 = np.zeros([1,51])
x2 = np.zeros([1,51])
x1[0,0] = X_init[0,0]
x2[0,0] = X_init[0,1]
# Gradient descent迭代循环
Eps = 1e-4
for i in range(max_loop):
    # 迭代停止条件:梯度的二范数大于Eps
    df_l2 = np.sqrt(np.power(df_x1(func, x1[0,i], x2[0,i]),2) + np.power(df_x2(func, x1[0,i], x2[0,i]),2))
    if df_l2 <= Eps:
        print("第%d轮,迭代停止,df_l2=%.16f\n" %(i+1,df_l2))
        break
    x1[0,i+1] = x1[0,i] - alpha * df_x1(func, x1[0,i], x2[0,i])
    x2[0,i+1] = x2[0,i] - alpha * df_x2(func, x1[0,i], x2[0,i])
    print("当前是第%d轮,x1=%.16f,x2=%.16f,f(x1,x2)=%.16f\n,df_l2=%.16f\n" %(i+1,x1[0,i+1],x2[0,i+1],func(x1[0,i+1], x2[0,i+1]),df_l2))

# 绘制等高线图
fig2 = plt.figure()
plt.contour(X1s,X2s,Ys,colors='k')
# 绘制梯度下降曲线
plt.plot(x1[0],x2[0],'-ro')
plt.title("Gradient Descent Method")
plt.xlabel('x1')
plt.ylabel('x2')
plt.show()



#------------------------------Newton Descent------------------------------
def delta_f(f, x1, x2, d=1e-4):
    dx1 = (f(x1+d,x2) - f(x1-d,x2)) / (2*d)
    dx2 = (f(x1,x2+d) - f(x1,x2-d)) / (2*d)
    return np.matrix([[dx1],[dx2]])
def hessian_f(x1, x2):
    # 只争对f = 1/2(x1^2+3*x2^2)
    h11 = 1
    h12 = 0
    h13 = 0
    h14 = 3
    return np.matrix([[1,0], [0,3]])

def newton_step(f, x1, x2):
    delta = delta_f(f, x1, x2)
    H = hessian_f(x1, x2)
    return np.dot(H.I,delta)

def lambda2(f,x1,x2):
    delta = delta_f(f, x1, x2)
    H = hessian_f(x1, x2)
    return np.dot(np.dot(delta.T, H.I), delta)

a = newton_step(func, 1, 1)
b = lambda2(func,1,1)
print(a, a.shape)
print(b, b.shape)

# 开辟空间并初始化
x12 = np.zeros([51,2,1])
x12[0,0,0] = X_init[0,0]
x12[0,1,0] = X_init[0,1]
# print(x12, x12.shape)
# 设置学习率
beta = 0.6

for i in range(max_loop):
    lam2 = lambda2(func,x12[i,0,0],x12[i,1,0])
    if lam2 <= Eps:
        print("第%d轮,迭代停止,lam2=%.16f\n" %(i+1,lam2))
        break
    x12[i+1] = x12[i] - beta*newton_step(func,x12[i,0,0],x12[i,1,0])
    print("当前是第%d轮,x1=%.16f,x2=%.16f,f(x1,x2)=%.16f\n,lam2=%.16f\n" %(i+1, x12[i+1,0,0], x12[i+1,1,0], func(x12[i+1,0,0], x12[i+1,1,0]),lam2))

fig3 = plt.figure()
plt.contour(X1s,X2s,Ys,colors='k')
# 绘制梯度下降曲线
plt.plot(x12[:,0,0],x12[:,1,0],'-ro')
plt.title("Newton Descent Method")
plt.xlabel('x1')
plt.ylabel('x2')
plt.show()

绘制的3D函数图像如下所示,

image-20221105200024079

梯度下降法【Gradient Descent】绘制的等高线图如下所示

image-20221105200024079

牛顿下降法【Newton Descent】绘制的等高线图如下所示

image-20221105200024079

五、Reference

1 、 1、 1Hessian矩阵的求法
2 、 2、 2介绍梯度和导数

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

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

相关文章

【Git】下载安装学习记录

【下载安装】 1.官网下载64位的安装包 2.双击安装&#xff0c;设置安装路径&#xff0c;一路next即可 使用学习指南&#xff1a;一、设置用户签名二、操作本地库的命令git initgit statusgit add 文件名git rm --cached 文件名git commit -m "注释" 文件名git refl…

在PyCharm中配置Anaconda环境

目录 1.创建项目 2.设置解释器 ​​​​​​ 3.常见问题 1.创建项目 2.设置解释器 3.常见问题 1.%matplotlib inline报错&#xff1a;Python关于%matplotlib inline 2.from d2l import torch as d2l报错&#xff1a; 报错原因&#xff0c;没有导入d2l这个包 如何导入呢&…

JDK8下载安装与配置环境变量(linux)

一、前言 基于Linux平台的MySQL安装文件有三个版本&#xff0c;分别是RPM软件、GenericBinaries软件包、源码包&#xff0c;具体介绍如下&#xff1a; ①RPM软件包是一种Linux平台下的安装文件&#xff0c;通过相关命令可以很方便地安装与卸载。该软件包分为两个&#xff1a;…

SVF Saber的实现

SVF Saber1.基本原理2.API类型定义3.Memory Leak Checker3.1.示例3.2.初始化3.3.程序切片3.4.路径约束求解3.5.报告错误4.总结5.参考文献Saber是一个静态漏洞检测器&#xff0c;最初集成到open64中&#xff0c;现已集成到SVF中&#xff0c;主要检测内存泄漏&#xff0c;DoubleF…

GAN的损失函数

1.GAN 在训练过程中&#xff0c;生成器和判别器的目标是相矛盾的&#xff0c;并且这种矛盾可以体现在判别器的判断准确性上。生成器的目标是生成尽量真实的数据&#xff0c;最好能够以假乱真、让判别器判断不出来&#xff0c;因此生成器的学习目标是让判别器上的判断准确性越来…

PCL点云处理之快速点特征直方图(FPFH)描述符(八十六)

PCL点云处理之快速点特征直方图(FPFH)描述符(八十六) 前言一、快速点特征直方图理论二、FPFH和PFH的区别二、实验过程1.代码2输入法线的NAN值检查用 OpenMP 加速 FPFH前言 对于具有 n 个点的给定点云 P,点特征直方图(见点特征直方图(PFH)描述符)的理论计算复杂度为 O (nk…

VueRouter路由的使用(上)

文章目录VueRouter路由的使用p21路由的原理_hash改变historyP22 认识vue-router路由的基本使用流程默认路径router-link路由懒加载路由的其他属性动态路由的基本匹配NotFound路由嵌套编程式导航VueRouter路由的使用 p21 路由的原理_hash改变 <!DOCTYPE html> <html …

JavaScript 运算符

文章目录JavaScript 运算符JavaScript 算术运算符JavaScript 赋值运算符用于字符串的 运算符对字符串和数字进行加法运算JavaScript 运算符 运算符 用于赋值。 运算符 用于加值。 运算符 用于给 JavaScript 变量赋值。 算术运算符 用于把值加起来。 实例 指定变量值&am…

Java基础学习笔记(十)—— 异常

异常1 异常概述2 异常处理方式2.1 JVM默认处理异常的方式2.2 throws方式处理异常2.3 throw抛出异常2.4 try-catch方式处理异常2.5 Throwable成员方法2.6 异常的练习3 自定义异常1 异常概述 异常&#xff1a;就是程序出现了不正常的情况。程序在执行的过程中&#xff0c;出现的…

Vivado综合设置之-gated_clock_conversion

本文验证-gated_clock_conversion设置为on或off时&#xff0c;给Schematic带来的差异。 -gated_clock_conversion设置为on时&#xff0c;用于移除门控时钟&#xff0c;门控时钟是由门电路而非专用时钟模块&#xff08;例如MMCM或PLL&#xff09;生成的时钟。 门控时钟会对设计…

Java-集合(3)

Vector集合类 1.Vector底层保存数据的也是一个对象数组&#xff1a;protected Object[] elementDate; 2.Vector是线程同步的&#xff0c;也就是线程安全Vactor的操作方法都带有synchronized修饰。以此可以进行安全线程保障&#xff0c;所以在开发中如果确认只有一个线程操作集…

dubbo学习笔记3(小d课堂)

dubbo高级特性 启动依赖检查 我们现在直接来启动我们的消费者&#xff1a; 它会报错。 我们 再去直接运行我们的消费者就不会报错。 我们也可以不在代码中去配置&#xff1a; 实际工作中比较建议使用这种方式。 dubbo.reference.check是配置所有的reference里的service都是f…

C语言:大小端

大小端 对于整型来说&#xff0c;内存中存放的是补码&#xff0c;补码是按大小端模式进行存储&#xff1a; 大端存储数据低位存在内存高地址&#xff0c;高位存在内存低地址小端存储数据低位存在内存低地址&#xff0c;高位存在内存高地址 记忆方法 小小小&#xff1a;数据 小…

前端组件库自定义主题切换探索-01

探索原因背景 首先自然是项目有需求&#xff0c;这是必须去做的原因 其次&#xff0c;是我们项目没有直接使用市面上现成的基于element-ui或者ant-design的第三方UI框架&#xff0c;比如avue&#xff0c;而是有着自己的UI组件库 第三&#xff0c;我们的组件库基于ant-design-v…

Win10下干净卸载VMware15.5

一、说明 虚拟机属于服务软件&#xff0c;在Windows10下卸载实属不易。下面请看我所总结的卸载文档。 二、如何彻底卸载VMware虚拟机 需要删除的部分很多&#xff0c;包括&#xff1a; 三、删除步骤一&#xff1a;需要禁用VM虚拟机服务 首先&#xff0c;因为VM的软件属于底层…

【自学Python】Python转义字符

文章来源嗨客网&#xff08;www.haicoder.net&#xff09; Python转义字符 Python转义字符教程 在编程中有一些字符是打不出来的&#xff0c;比如换行&#xff0c;提示音&#xff0c;下一个制表位等等&#xff0c;于是程序语言的开发者就设计了转义序列&#xff08;escape se…

4 机器学习之决策树

学习笔记自&#xff0c;慕课网 《Python3 入门人工智能》 https://https://coding.imooc.com/lesson/418.html#mid32776 决策树、异常检测、主成分分析 常用的分类方法&#xff1a; 逻辑回归的思路&#xff1a; 决策树的思路&#xff1a; 1. 决策树 1.1 ID3决策树&#x…

Java 防御XSS攻击实战与示例代码

XSS, 跨站脚本攻击, 简单来说, 就是非本站点的脚本被执行了。 关于XSS 的详细介绍和防御参考: XSS(跨站脚本)攻击与预防 和 跨站脚本攻击(XSS)及防范措施。 本篇介绍在Java 项目中如何快速修复XSS 漏洞。本篇使用的是黑名单的方式, 对于非法字符进行转义。 黑名单的方式…

Win10的IE以及其他浏览器无法使用的解决方法

前言 最近&#xff0c;突然无法使用Win10的IE&#xff0c;网络连接正常&#xff0c;重置过IE&#xff0c;恢复过高级选项设置&#xff0c;检查过无代理设置&#xff0c;清理过缓存删除IE个人设置&#xff0c;以及清理过DNS解析缓存&#xff0c;IE都会显示无法访问此页面的网络…

Django3还可以这样学之Django的创建

Django (Flask说&#xff1a;“其实我是你的双胞胎哥哥啊”) 一、前言 传统的web框架为MVC设计模式&#xff0c;即M是指业务模型&#xff0c;V是指用户界面&#xff0c;C则是控制器。虽然这种设计模式耦合性低、可重用性高、部署快等特点&#xff0c; 但是完全理解该设计模式…