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

基于MATLAB的梯度下降法实现

基于MATLAB的梯度下降法实现,包含精确线搜索和回溯线搜索两种策略,并针对二次函数优化进行优化:


一、核心代码实现

1. 精确线搜索(黄金分割法)
function t = exact_line_search(f, grad_f, x, d, a=0, b=1, tol=1e-5)"""黄金分割法实现精确线搜索"""rho = (3 - sqrt(5))/2;  % 黄金分割比例t1 = a + rho*(b - a);t2 = b - rho*(b - a);f1 = f(x - t1*grad_f(x));f2 = f(x - t2*grad_f(x));while abs(b - a) > tolif f1 < f2b = t2;t2 = t1;f2 = f1;t1 = a + rho*(b - a);f1 = f(x - t1*grad_f(x));elsea = t1;t1 = t2;f1 = f2;t2 = b - rho*(b - a);f2 = f(x - t2*grad_f(x));endendt = (a + b)/2;
end
2. 回溯线搜索(Armijo条件)
function t = backtracking_line_search(f, grad_f, x, d, alpha=0.3, beta=0.8, t_init=1.0)"""Armijo条件回溯线搜索"""t = t_init;while f(x - t*grad_f(x)) > f(x) - alpha * t * norm(grad_f(x))^2t = beta * t;if t < 1e-10break;endend
end
3. 梯度下降主函数
function [x_opt, fval, iter] = gradient_descent(f, grad_f, x0, method, max_iter=1000, tol=1e-6)x = x0;iter = 0;fval = f(x);while iter < max_iterg = grad_f(x);if norm(g) < tolbreak;end% 选择线搜索方法if strcmp(method, 'exact')t = exact_line_search(f, grad_f, x, g);elseif strcmp(method, 'backtrack')t = backtracking_line_search(f, grad_f, x, g);elseerror('Unknown method');endx = x - t * g;fval = f(x);iter = iter + 1;end
end

二、二次函数优化示例

1. 目标函数定义
% 二次函数 f(x) = 0.5*x'*G*x + b'*x
G = [4 1; 1 2];  % 正定矩阵
b = [1; -1];
f = @(x) 0.5*x'*G*x + b'*x;
grad_f = @(x) G*x + b;
2. 精确线搜索测试
x0 = [10; 10];  % 初始点
[x_opt, fval, iter] = gradient_descent(f, grad_f, x0, 'exact');
disp('精确线搜索结果:');
disp(['最优解: ', num2str(x_opt')]);
disp(['迭代次数: ', num2str(iter)]);
3. 回溯线搜索测试
[x_opt, fval, iter] = gradient_descent(f, grad_f, x0, 'backtrack');
disp('回溯线搜索结果:');
disp(['最优解: ', num2str(x_opt')]);
disp(['迭代次数: ', num2str(iter)]);

三、高维问题扩展

1. 随机梯度下降(SGD)
function [x_opt, fval, iter] = sgd(f, grad_f, x0, batch_size=32, ...)n = length(x0);for iter = 1:max_iteridx = randperm(n, batch_size);g = grad_f(x0(idx));x0 = x0 - t*g;end
end
2. 分布式计算实现
% 使用parfor进行并行梯度计算
parfor i = 1:num_workersgrad_part = compute_gradient_partial(data(i));grad_total = grad_total + grad_part;
end

四、可视化工具

1. 收敛曲线绘制
figure;
semilogy(1:iter, fval_hist, '-o');
xlabel('迭代次数');
ylabel('目标函数值');
title('梯度下降收敛曲线');
2. 梯度方向可视化
quiver(x(1), x(2), -grad_f(x)(1), -grad_f(x)(2));
hold on;
plot(x_opt(1), x_opt(2), 'rx');

参考代码 梯度下降法优化函数 www.youwenfan.com/contentcsk/64952.html

五、工程应用建议

  1. 初始步长选择

    t_init = 2 / (norm(G)*2 + norm(b));  % 基于问题规模调整
    
  2. 终止条件优化

    if norm(g) < 1e-6 && abs(fval - f_prev) < 1e-9break;
    end
    
  3. GPU加速

    grad_f = @(x) gpuArray(G)*gpuArray(x) + gpuArray(b);
    

六、完整测试案例

%% 二次函数优化测试
G = [4 1; 1 2];
b = [1; -1];
f = @(x) 0.5*x'*G*x + b'*x;
grad_f = @(x) G*x + b;x0 = [10; 10];
methods = {'exact', 'backtrack'};
results = struct();for m = 1:numel(methods)tic;[x_opt, fval, iter] = gradient_descent(f, grad_f, x0, methods{m});results(m).time = toc;results(m).x = x_opt;results(m).fval = fval;
end% 结果对比
disp('性能对比:');
for m = 1:numel(methods)fprintf('%s方法: 迭代次数=%d, 耗时=%.4f秒, 最终值=%.6f\n',...methods{m}, results(m).iter, results(m).time, results(m).fval);
end
http://www.dtcms.com/a/577311.html

相关文章:

  • dw制作简单网站模板下载网站建设工作会议讲话
  • 如何优化多表查询sql?
  • 64QAM信号的数字预失真处理(MATLAB实现)
  • 网站模板下载之后如何修改公司官网怎么设计
  • 崇信县门户网站留言首页杭州做商务网站
  • 只出现一次的数字 II(二)
  • Linux系统编程:(六)深入理解 Linux 软件包管理器——从原理到 yum 实战全攻略
  • NoSql数据库概念
  • OCR 新范式!DeepSeek 以「视觉压缩」替代传统字符识别;Bald Classification数据集助力高精度人像分类
  • jQuery 入门学习教程,从入门到精通,AJAX在jQuery中的应用 —— 详细知识点与实战案例(14)
  • seo优化标签北京seo百度推广
  • joomla 网站模板.net 手机网站源码下载
  • PL27A1旺玖5Gbps USB 3.0主机到主机桥接控制芯片,超高速USB3.0数据对拷线双机跨屏共享文件和数据的USB对拷芯片
  • 理解预处理器(Sass/Less)
  • Java_LinkedHashSet源码分析
  • 基于大数据的信贷风险评估的数据可视化分析与预测系统
  • 《算法通关指南:数据结构和算法篇 --- 栈相关算法题》--- 1.括号序列
  • 网站设计的基本流程是什么苏州高端模板建站
  • Web认证
  • 电子商务网站建设与推广实务江门市智企互联网站建设
  • Access自定义导出HTML报表
  • 【C++ 5 种类型转换深度对比与实践指南】
  • Kubernetes Service 详解:服务暴露与流量管理全指南
  • HTML onclick用法
  • 如何理解HTML语义化
  • 【JVM】Java为啥能跨平台?JDK/JRE/JVM的关系?
  • 数据存储新势力:Doris如何挑战ClickHouse的霸主地位?
  • Vmware中主机ip a没有ip地址
  • 在 VSCode 中:如何主动生成c_cpp_properties.json文件
  • 南京网站设计外包做图片视频的网站有哪些问题