最速下降法与牛顿法的收敛速率

在MIT的公开课[Introduction to Computer Science and Programming Using Python] 6.00.1x 中,Eric Grimson曾提到过迭代算法的思想就在于将当前迭代点向正确的方向移动一定的“步长”,然后检验目标值是否满足一定要求。同时,“方向”和“步长”也是不同优化算法主要关心的两个方面。除此之外,我们还关心不同优化算法的收敛速率(rate of convergence),这表征了算法是否能在尽量少的迭代次数之外逼近最优解。本文以最速下降法(Steep Descent)和牛顿法(Netwon Method)为例,说明不同算法的收敛速率。本文主要参考了Jorge Nocedal 和 Stephen J. Wright 的 Numerical Optimization 一书(第二版)。

最速下降法(Steep Descent)

最速下降法的思路是以当前迭代点的导数方向的相反方向,也就是下降最快的方向(名字由来),为前进方向。步长选取的一种思路是选择相应的步长使得目标函数取在前进方向上取得最小值。

这里我们以一个简单的二次规划命题为例进行说,即

f(x)=12xTQx+cTx
其中 Q 是对称正定阵。对于目标函数 f(x) ,记当前的迭代点为 xk f(x) xk 处的一阶导数为 fk=Qx+c 。于是在 xk 处的前进方向即为 fk 。 要确定前进的步长,即要是的下面这个以 α 为决策变量的优化命题取得最小值:
f(xαfk)=12(xαfk)TQ(xαfk
  • 10
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
最速下降法的matlab代码示例: function [x, fval, exitflag] = GradientDescent(funct, x0, tol, max_iter) % funct - 目标函数 % x0 - 初始点 % tol - 容忍误差 % max_iter - 迭代次数最大值 % x - 最优解 % fval - 目标函数在最优解处的取值 % exitflag - 迭代结束标志 % 初始化 x = x0; fval = funct(x); delta_f = inf; iter = 0; while delta_f > tol && iter < max_iter % 计算梯度 grad = Gradient(funct, x); % 计算步长 alpha = StepSize(funct, x, grad); % 迭代 x_new = x - alpha * grad; fval_new = funct(x_new); % 更新状态 delta_f = abs(fval - fval_new); x = x_new; fval = fval_new; iter = iter + 1; end % 判断迭代结束标志 if delta_f <= tol exitflag = 0; else exitflag = -1; end end function grad = Gradient(funct, x) % 计算目标函数在x处的梯度 eps = 1e-6; n = length(x); grad = zeros(n, 1); for i = 1:n dx = zeros(n, 1); dx(i) = eps; grad(i) = (funct(x + dx) - funct(x - dx)) / (2 * eps); end end function alpha = StepSize(funct, x, grad) % 计算最速下降法的步长 g = -grad; alpha = fminbnd(@(a) funct(x + a * g), 0, 1); end 牛顿法的matlab代码示例: function [x, fval, exitflag] = NewtonMethod(funct, x0, tol, max_iter) % funct - 目标函数 % x0 - 初始点 % tol - 容忍误差 % max_iter - 迭代次数最大值 % x - 最优解 % fval - 目标函数在最优解处的取值 % exitflag - 迭代结束标志 % 初始化 x = x0; fval = funct(x); delta_f = inf; iter = 0; while delta_f > tol && iter < max_iter % 计算梯度和海森矩阵 [grad, hess] = GradientHessian(funct, x); % 计算步长 p = - hess \ grad; alpha = StepSize(funct, x, p); % 迭代 x_new = x + alpha * p; fval_new = funct(x_new); % 更新状态 delta_f = abs(fval - fval_new); x = x_new; fval = fval_new; iter = iter + 1; end % 判断迭代结束标志 if delta_f <= tol exitflag = 0; else exitflag = -1; end end function [grad, hess] = GradientHessian(funct, x) % 计算目标函数在x处的梯度和海森矩阵 eps = 1e-6; n = length(x); grad = zeros(n, 1); hess = zeros(n, n); % 计算梯度 for i = 1:n dx = zeros(n, 1); dx(i) = eps; grad(i) = (funct(x + dx) - funct(x - dx)) / (2 * eps); end % 计算海森矩阵 for i = 1:n for j = 1:n dx = zeros(n, 1); dx(i) = eps; dx(j) = eps; hess(i, j) = (funct(x + dx) - funct(x - dx) - 2 * grad(i) * dx(j)) / (2 * eps^2); end end end function alpha = StepSize(funct, x, p) % 计算牛顿法的步长 g = Gradient(funct, x); h = Hessian(funct, x); alpha = - g' * p / (p' * h * p); end function hess = Hessian(funct, x) % 计算目标函数在x处的海森矩阵 eps = 1e-6; n = length(x); hess = zeros(n, n); for i = 1:n for j = 1:n dx = zeros(n, 1); dx(i) = eps; dx(j) = eps; hess(i, j) = (funct(x + dx) - 2 * funct(x) + funct(x - dx)) / eps^2; end end end 注意:以上代码仅为示例,具体实现方式可能会因函数形式、精度要求等因素而有所不同。如果要使用最速下降法牛顿法求解实际问题,请谨慎选择应用场景、调整超参数,并进行充分的测试和验证。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值