最优化方法-最速下降法

article/2025/9/14 4:02:36
最速下降法基本介绍
在解决无约束问题时,经常用到的一类算法是最速下降法,在求解机器学习
算法的模型参数,即无约束优化问题时,梯度下降是最常采用的方法之一,在求
解损失函数的最小值时,可以通过梯度下降法来一步步的迭代求解,得到最小化
的损失函数和模型参数值。反过来,如果我们需要求解损失函数的最大值,这时
就需要用梯度上升法来迭代了。
讨论问题模型  minf(x)
步长的确定

算法步骤

 

求解例题
使用最速下降法求函数的最小值
程序代码(python)
import numpy as np
from sympy import *
import math
import matplotlib.pyplot as plt
import mpl_toolkits.axisartist as axisartist
x1, x2, t = symbols('x1, x2, t')
def func():
return pow(x1, 2) + 2 * pow(x2, 2) - 2 * x1 * x2 - 2 * x2
def grad(data):
f = func()
grad_vec = [diff(f, x1), diff(f, x2)]
grad = []
for item in grad_vec:
grad.append(item.subs(x1, data[0]).subs(x2, data[1]))
return grad
def grad_len(grad):
vec_len = math.sqrt(pow(grad[0], 2) + pow(grad[1], 2))
return vec_len
3
def zhudian(f):
t_diff = diff(f)
t_min = solve(t_diff)
return t_min
def main(X0, theta):
f = func()
grad_vec = grad(X0)
grad_length = grad_len(grad_vec)
k = 0
data_x = [0]
data_y = [0]
while grad_length > theta:
k += 1
p = -np.array(grad_vec)
X = np.array(X0) + t*p
t_func = f.subs(x1, X[0]).subs(x2, X[1])
t_min = zhudian(t_func)
X0 = np.array(X0) + t_min*p
grad_vec = grad(X0)
grad_length = grad_len(grad_vec)
print('grad_length', grad_length)
print('坐标', float(X0[0]), float(X0[1]))
data_x.append(X0[0])
data_y.append(X0[1])
print(k)
fig = plt.figure()
ax = axisartist.Subplot(fig, 111)
fig.add_axes(ax)
ax.axis["bottom"].set_axisline_style("-|>", size=1.5)
ax.axis["left"].set_axisline_style("->", size=1.5)
ax.axis["top"].set_visible(False)
ax.axis["right"].set_visible(False)
plt.title(r'$Gradient \ method - steepest \ descent \ method$')
plt.plot(data_x, data_y,color='r',label=r'$f(x_1,x_2)=x_1^2+2 \cdot
4
x_2^2-2 \cdot x_1 \cdot x_2-2 \cdot x_2$')
plt.legend()
plt.scatter(1, 1, marker=(3, 1), c=2, s=100)
plt.grid()
plt.xlabel(r'$x_1$', fontsize=20)
plt.ylabel(r'$x_2$', fontsize=20)
plt.show()
if __name__ == '__main__':
main([0, 0], 0.001)

 运行结果

grad_length 1.0
坐标 0.0 0.5
grad_length 1.0
坐标 0.5 0.5
grad_length 0.5
坐标 0.5 0.75
grad_length 0.5
坐标 0.75 0.75
grad_length 0.25
坐标 0.75 0.875
grad_length 0.25
坐标 0.875 0.875
grad_length 0.125
坐标 0.875 0.9375
grad_length 0.125
坐标 0.9375 0.9375
grad_length 0.0625
坐标 0.9375 0.96875
grad_length 0.0625
坐标 0.96875 0.96875
grad_length 0.03125
坐标 0.96875 0.984375
grad_length 0.03125
坐标 0.984375 0.984375
5 grad_length 0.015625
坐标 0.984375 0.9921875
grad_length 0.015625
坐标 0.9921875 0.9921875
grad_length 0.0078125
坐标 0.9921875 0.99609375
grad_length 0.0078125
坐标 0.99609375 0.99609375
grad_length 0.00390625
坐标 0.99609375 0.998046875
grad_length 0.00390625
坐标 0.998046875 0.998046875
grad_length 0.001953125
坐标 0.998046875 0.9990234375
grad_length 0.001953125
坐标 0.9990234375 0.9990234375
grad_length 0.0009765625
坐标 0.9990234375 0.99951171875
经过结果分析,每次迭代的结果坐标趋向于精确解 (1,1), 可以证明程序无误。
对运行结果绘制过程图

 

 

 


http://chatgpt.dhexx.cn/article/FVRdxY4N.shtml

相关文章

python最速下降法

最速下降法 算法程序总结 算法 程序 代码如下(示例): import numpy as np# 函数表达式fun fun lambda x:100*(x[0]**2-x[1])**2 (x[0]-1)**2# 梯度向量 gfun gfun lambda x:np.array([400*x[0]*(x[0]**2-x[1])2*(x[0]-1), -200*(x[0]**2…

第三章 最速下降法和牛顿法

内容来自马昌凤编著的《最优化方法及其Matlab程序设计》,文章仅为个人的学习笔记,感兴趣的朋友详见原书。 本章讨论无约束优化问题 m i n f ( x ) minf(x) minf(x)的最速下降法和牛顿法及其改进算法,前者简单而古老,虽不再具有实用…

梯度下降法、最速下降法

梯度下降法 最优化问题是求解函数极值的问题,包括极大值和极小值。相信所有的读者对这个问题都不陌生,在初中时我们就学会了求解二次函数的极值(抛物线的顶点),高中时学习了幂函数,指数函数,对…

matlab最速下降法ppt,最速下降法PPT及MATLAB程序.pptx

最速下降法PPT及MATLAB程序.pptx 最速下降法,最速下降法,也称为梯度下降法,是由法国著名数学家Cauchy在1847年提出的。 最速下降法是求解无约束优化问题最简单和最古老的方法之一,虽然现在已经不具有实用性,但是许多有效算法都是…

最速下降法python_算法最优化之最速下降法

适应范围:无约束非线性规划问题 例子: 初始化 , 第一次迭代: 从 出发,沿方向 进行一维搜索,求步长 ,即 在直线的极小点 第二次迭代: 从 出发,沿方向 进行一维搜索,求步长 即 解…

最速梯度下降法及matlab实践,最速下降法以及代码实现

由于最近复习最优化考试,为了防止考完即忘,这里做个笔记用于备忘,本文讲解一下无约束优化问题中的最速下降法。 一、解决的问题 最速梯度下降法解决的问题是无约束优化问题,而所谓的无约束优化问题就是对目标函数的求解,没有任何的约束限制的优化问题,比如求下方最小值:…

运筹学(1)-最速下降法

运筹学(1) 多维无约束优化算法——梯度法之最速下降法 最近学习运筹学开始学习一些优化的算法,之后的一系列博客我会分享一些我学到的运筹学方法。这次我总结了我学习的最速下降法。 1. 原理 最速下降法是一个优化算法,用于求…

SSM 三大框架

文章目录 一、SpringMVC- 1.SpringMVC(Spring Model View Controller) 框架介绍- - 1.概述- - 2.MVC模型- - 3.工作原理 - 2.创建Module- 3.入门案例:展示汽车数据需求创建Maven module创建RunApp.javaCar.javaCarController.java测试 - 4.处理请求参数- - 1.概述- …

SSH三大框架整合

文章目录 一. SSH 简单的回顾1. Hibernate框架2. Struts2框架3. Spring框架 二. ssh整合思想三. 整合struts2和spring框架(把struts2的action交给spring管理)1. 导入相关jar包2. 创建action3. 创建struts2核心配置文件,配置action(1). 位置在…

三大框架的基础知识

三大框架的基础知识 1,hibernate的工作原理及为什么要用? (1)通过Configuration().configure();读取并解析hibernate.cfg.xml配置文件; (2)由 hibernate.cfg.xml读取并解析映射信息&#xff1b…

三大前端框架

互联网发展速度是非常快的,程序员用的前端框架也在不断的迭代和变化,以前大家常用的是JQuery、Bootstrap框架, 现在形成React、Vue、Angular三大主流框架,这三个框架各有各的优势,而且较为成熟 01、React React框架是起…

前端三大主流框架的区别(三)

前面两篇已经做了细致的分析,这一篇就总结总结三大主流框架吧 1.angular 1.1. 简介: angular是最早出现的框架, angularjs是通过directive(指令)去封装组件,react和vue是通过component。 1.2. 优点: 1、…

三大框架-Spring

一 .概述 spring框架是以一个分层架构,有七个定义良好的模块组成,Spring模块构建在核心容器之上,核心容器定义了创建,配置和管理bean方式: 1.Spring Core:核心容器 ,提供Spring的基本功能. 2.SPring Contest:Spring上下文,是一个配置文件 3.Spring AOP : Spring 中面向切面…

JAVA的三大框架是什么?

Java自1995年发布以来,凭借着其跨平台、面向对象、泛型编程的特性发展至今可以说无Java不大厂。目前国内所有的大厂或多或少都在使用Java进行后端服务开发。 一、Java开发的三大框架 在14年以前,行业内用得最多的Java三大框架是Struts、Spring和Hiberna…

SSM三大框架Spring

一、三大框架基本结构 1.为什么需要框架 说明: 如果生产环境下的项目,都是从头(从底层写起)开发,难度太大了,并且开发的效率极其低下. 所以为了让项目快速的上线部署. 将某些特定的功能.进行了高级的封装. 那么我们如果需要使用封装后的API.,则必须按照人家的要求编码 2.框架…

外键的设置

关键词:外键 | 索引 | InNoDB和MyISAM | 引用 | Mysql 设置外键的目的:保证数据的一致性! 一、外键的使用条件: ① 两个表必须是InnoDB表,MyISAM表暂时不支持外键 #查看表类型SHOW TABLE STATUS#查询结果的Engine字…

外键(FOREIGN KEY)

引子:把所有数据都存放于一张表的弊端 1、表的组织结构复杂不清晰 2、浪费空间 3、扩展性极差 为了解决上述的问题,就需要用多张表来存放数据。 表与表的记录之间存在着三种关系:一对多、多对多、一对一的关系。 处理表之间关系问题就会…

什么是外键? 为什么需要外键?怎么使用外键?

首先我们先思考一个问题: 如何将京东"fuliuqingfeng"的用户信息及其多个邮寄商品地址保存到数据库中? 我们第一步会这样操作实现: create table user_info(id char(36) primary key,user_name varchar(30) not null,password varchar(30) …

MySQL外键(详解)

MySQL外键(详解) 什么是外键:    外键是指引用另外一个表中的一列或多列数据,被引用的列应该具有主键约束或者唯一性约束(简单来说外键是另一个表的主键或者唯一约束)。外键可以有重复的, 可以是空值&…

C/C++unlink函数的使用

一、头文件 #include<unistd.h> 二、函数原型 int unlink(const char *pathname); 三、函数介绍 unlink()函数功能即为删除文件。执行unlink()函数会删除所给参数指定的文件。 注意&#xff1a; 执行unlink()函数并不一定会真正的删除文件&#xff0c;它先会检查文件…