基于matlab的通过解方程来动态调整学习率的想法和固定学习率的梯度下降法【开源/可直接复制粘贴】

通过解方程来动态调整学习率的想法,在实际应用中可能并不实用,因为它涉及到解符号方程,这可能会非常复杂或无法解析地求解,同时会增加计算复杂度和时间,固定学习率或基于某种规则(如线搜索)调整学习率更为常见。建议探索更高级的梯度下降变体(如Adam、RMSprop等),这些算法自动调整学习率以提高收敛速度和稳定性。 


function Steepest_Descent(f, x1, x2, max_iterations, alpha) %alpha:如果学习率太小,算法会收敛得非常慢;如果学习率太大,算法可能会发散或跳过最小值。 
% 项目名称:最速下降法(梯度下降法)  
% 更新时间:2024/09/07  
% 背景:最速下降法又称梯度法,是19世纪中叶由Cauchy提出来的求多元函数极值的最早的数值方法。法国的奥古斯丁·路易斯·柯西的全集有27卷,论著有800多篇,在数学史上是仅次于欧拉的多产数学家。  
% 作者:月白风清江有声
% f2 = @(x1,x2) 10 * (x2 - x1.^2).^2 + 2 * (1 - x1).^2;Steepest_Descent(f1,0,0,2,0.1)

    % 梯度计算函数  
    grad_x = @(x, y) (f(x + eps, y) - f(x, y)) / eps;  
    grad_y = @(x, y) (f(x, y + eps) - f(x, y)) / eps;  
  
    % 迭代过程  
    for iteration = 1:max_iterations  
        grad = [-grad_x(x1, x2), -grad_y(x1, x2)]; % 注意梯度的负方向  
        x1 = x1 + alpha * grad(1); % 更新x1  
        x2 = x2 + alpha * grad(2); % 更新x2  
        fprintf('Iteration %d: x1 = %.4f, x2 = %.4f, f(x1, x2) = %.4f\n', iteration, x1, x2, f(x1, x2));  
    end  
end




%{
function Steepest_Descent(f, x1, x2, iteration)  
% 项目名称:最速下降法(梯度下降法) 
% 更新时间:2024/09/07 
% 背景:...(此处省略背景描述)
% 作者:月白风清江有声

    n=0;                                                             %用来显示初始点,无意义
   fprintf('Iteration %d: x1 = %.4f, x2 = %.4f, f(x1, x2) = %.4f\n', n, x1, x2, f(x1, x2)); 

          %nabla(f(a,b))=[diff(f(a,b),a,1);diff(f(a,b),b,1)]; 这样计算diff返回值不能再次处理
    grad_x = @(x, y) (f(x + eps, y) - f(x, y)) / eps;                  % 数值计算x的偏导数  
    grad_y = @(x, y) (f(x, y + eps) - f(x, y)) / eps;                  % 数值计算y的偏导数 

    for i=1:iteration             %这里只能用i,iteration参数在函数内部被用作循环变量并被覆盖
        syms a;                          %设置变量,不能设成alpha,会与diff函数内的alpha重复
        grad = [grad_x(x1, x2), grad_y(x1, x2)];                        % 计算当前点的梯度  
              g=@(a)f(x1 - a * grad(1),x2 - a * grad(2));
              df=diff(g,a,1);                                                     %对a求导
               sol = solve(df == 0);    %符号计算返回的 sol 可能不是一个数值解,而是一个符号解
               x1 = x1 - double(sol)* grad(1);                                   % 更新x1  
               x2 = x2 - double(sol)* grad(2);                                   % 更新x2 
        fprintf('Iteration %d: x1 = %.4f, x2 = %.4f, f(x1, x2) = %.4f\n', iteration, x1, x2, f(x1, x2));  
    end  

end 

%}


%题目要求:
% f1=@(x1,x2)x1.^2-2*x1*x2+2*x2.^2+x1-3*x2
% f2 = @(x1,x2) 10 * (x2 - x1.^2).^2 + 2 * (1 - x1).^2;(无法解决,要设置固定学习率替换a)
% x1=0;x2=0;d2=(1,0)'
%手算结果:
% nabla1=[2*x1-2*x2+1;-2*x1+4*x2-3] 
% nabla2=[-40*x1*(x2-x1.^2)+4*x1-4;20*(x2-x1.^2)]

%  Steepest_Descent(f1,0,0,2) 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值