当前位置: 首页 > news >正文

利用梯度下降求一个凸函数的最小值

一、流程

  1. 求函数的导数
  2. 更新x,x_new = x - learning_rate * gradient
  3. 检查收敛性: |gradient| < tolerance

二、为什么沿着梯度方向就一定能达到最值?

需要用泰勒展开式进行推导。过程省略

 

import numpy as np
import matplotlib.pyplot as pltdef f(x):"""目标函数: f(x) = (x+3)^2 + 1"""return (x + 3) ** 2 + 1def grad_f(x):"""梯度(导数): f'(x) = 2(x+3)"""return 2 * (x + 3)def gradient_descent(learning_rate=0.1, max_iters=100, tolerance=1e-6, x0=0):"""梯度下降算法参数:learning_rate: 学习率max_iters: 最大迭代次数tolerance: 收敛容差x0: 初始点返回:x_history: x的历史值f_history: 函数值的历史"""x = x0x_history = [x]f_history = [f(x)]print(f"初始值: x0 = {x0:.4f}, f(x0) = {f(x0):.4f}")print("-" * 50)for i in range(max_iters):# 计算梯度gradient = grad_f(x)# 更新xx_new = x - learning_rate * gradient# 记录历史
        x_history.append(x_new)f_history.append(f(x_new))# 打印迭代信息if i < 10 or i % 10 == 9 or i == max_iters - 1:print(f"迭代 {i + 1:3d}: x = {x_new:8.6f}, f(x) = {f(x_new):8.6f}, 梯度 = {gradient:8.6f}")# 检查收敛if abs(gradient) < tolerance:print(f"\n在 {i + 1} 次迭代后收敛!")breakx = x_newreturn x_history, f_historydef plot_results(x_history, f_history):"""绘制优化过程"""fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 5))# 绘制函数曲线和优化路径x_vals = np.linspace(-5, 1, 100)y_vals = f(x_vals)ax1.plot(x_vals, y_vals, 'b-', label='f(x) = (x+3)² + 1', linewidth=2)ax1.plot(x_history, f_history, 'ro-', label='优化路径', markersize=4)ax1.set_xlabel('x')ax1.set_ylabel('f(x)')ax1.set_title('梯度下降优化过程')ax1.legend()ax1.grid(True)# 绘制函数值收敛情况ax2.semilogy(range(len(f_history)), f_history, 'g-o', markersize=4)ax2.set_xlabel('迭代次数')ax2.set_ylabel('f(x) (对数坐标)')ax2.set_title('函数值收敛情况')ax2.grid(True)plt.tight_layout()plt.show()# 运行梯度下降
print("梯度下降法求解 f(x) = (x+3)² + 1 的最小值")
print("=" * 50)# 不同学习率的比较
learning_rates = [0.01, 0.1, 0.3]
results = {}for lr in learning_rates:print(f"\n学习率 α = {lr}:")x_hist, f_hist = gradient_descent(learning_rate=lr, x0=0)results[lr] = (x_hist, f_hist)print(f"最终结果: x = {x_hist[-1]:.6f}, f(x) = {f_hist[-1]:.6f}")# 绘制最后一个学习率的结果
plot_results(results[0.1][0], results[0.1][1])# 比较不同学习率的收敛速度
print("\n" + "=" * 50)
print("不同学习率的收敛情况比较:")
print("=" * 50)for lr in learning_rates:x_hist, f_hist = results[lr]iterations = len(x_hist) - 1final_x = x_hist[-1]final_f = f_hist[-1]print(f"α = {lr:.2f}: {iterations:2d} 次迭代, x = {final_x:7.4f}, f(x) = {final_f:7.4f}")# 理论最小值
print(f"\n理论最小值: x = -3.0000, f(x) = 1.0000")

 

http://www.jsqmd.com/news/58362/

相关文章:

  • 2025年12月深圳AI搜索优化排名公司推荐:技术领航与性价比之选
  • 防脱洗发水哪个好用?实测这几款防脱洗发水,针对不同脱发类型有效防脱
  • 2025国内企业如何选择国际短信平台?国际物流通知短信平台,全球覆盖、成本控制与高并发能力十强全解析
  • 荷球青少年联赛开赛,河南 50 支队伍同场竞技
  • 商标转让平台有哪些?买商标最值得推荐的商标交易平台大盘点!
  • 2025年狗狗止痒短期方案十大品牌排行榜,快速止痒应急办法精
  • 万乐天摘得全运会女子 50 米仰泳金牌,汪雪儿获银
  • 江苏女足压哨绝杀,斩获全运会女足冠军
  • 王楚钦 4-2 林高远,晋级全运会乒乓球男单四强
  • 《独立开发者精选工具》第 023 期
  • [转]Java使用Milo实现OPC UA客户端及服务端,操作uaexpert工具测试(史上最详细讲解)
  • 允许mysql数据其他pc访问
  • 2025年实木椅源头厂家权威推荐榜单:实木家具‌/书柜‌/电视柜‌源头厂家精选
  • 上海、天津、南京、北京、杭州家具定制公司TOP4推荐,上海拉迷领先!
  • 2025年木门十大品牌权威解析 | 国内一线品牌综合实力排行榜
  • 2025 年聚四氟乙烯厂家最新推荐榜,技术实力与市场口碑深度解析,筛选靠谱优质企业聚四氟乙烯膜/聚四氟乙烯板/聚四氟乙烯一体槽/聚四氟乙烯加工件公司推荐
  • 2025年建筑设备一体化监控系统工厂权威推荐榜单:建筑设备监控系统‌/建筑设备管理系统‌/万盟智控‌源头工厂精选
  • [转]Java实现OPC UA客户端
  • 2025 年蛋液厂家最新推荐榜,聚焦企业技术实力与市场口碑深度解析冷冻全蛋液/炸蛋专用蛋液/蛋饺专用蛋液/餐饮专用蛋液/巴氏杀菌全蛋液/蛋白液/蛋黄液公司推荐
  • 面对遗留系统的一团“祖传代码”,该如何下手重构?
  • P5445 [APIO2019] 路灯
  • 宽度设置width:100%时 margin不生效问题处理
  • 点阵式LCD驱动段码屏显示驱动IC液晶显示驱动芯片-VK0256
  • 2025iPaaS平台权威测评:连趣云凭价格优势易用安全稳定体系及差异步骤稳居榜首
  • 计算机图形中的法线矩阵:深入理解与应用 - 教程
  • springboot jdk17 vue3 建行龙支付 二维码扫码支付 回调 及退费
  • 2025中国管理咨询服务商实力榜:正睿咨询集团领衔,七大领域高潜力本土品牌深度解析
  • 2025 年最新推荐制氮机源头厂家榜单:含水过滤生化棉、椰棕配件及分子筛企业权威测评制氮机椰棕圆片/制氮机椰棕片/制氮机水油分离/制氮机分子筛公司推荐
  • 2025年臭氧发生器行业优质企业排行榜单,台车烘箱/脱硝臭氧发生器/大型烘房/V型混合机/固化烘箱/臭氧灭菌烘箱臭氧发生器企业哪个好
  • 2025年12月的闲谈