优化算法笔记01:牛顿法的实现

牛顿法是梯度下降方法的重要成员,其算法流程如下。

对于需要最小化的目标函数f(x)

1. 给定初值x_0

2. 代入递推公式进行迭代:

x_{k+1}=x_k-\alpha_k\nabla^2f(x_k)^{-1}\nabla f(x_k), k=0,1,\dots

3. 判断终止条件,若满足条件则终止迭代,得到最小值点,终止条件我一般选择如下:

\left | f(x_{k-1})-f(x_k) \right |\leqslant \left |10^{-8}f(x_{k-1}) \right |

其中,取步长\alpha_k\equiv 1

以函数f(x)=3x^4+4为例,给出牛顿法的MATLAB代码如下。

function [x,iters]=newton()
% Objective function, first and second Derivatives
f=@(x)3.*x.^4+4;
g=@(x)12.*x.^3;
h=@(x)36.*x.^2;
% Iterative formula
iter=@(x)x-h(x)\g(x);
% set x0
xkd=1000;
% compute x1
xk=iter(xkd);
count=0;
% iterations
while(abs(f(xkd)-f(xk))>abs((1e-8)*f(xkd)))
    count=count+1;
    xkd=xk;
    xk=iter(xkd);
end
x=xk;
iters=count;

输出:

>> [x,iters]=newton()

x =

    0.0052


iters =

    29

如果采用最速下降法,步长不能选择为常量1,否则很可能产生不收敛的状况。一般来说,我会在最速下降法中加入步长收缩的Armijo条件。

将牛顿法的收敛速度与最速下降法做比较,以同一个目标函数为例,下面给出最速下降法的MATLAB代码。

function [x,iters]=sd()
f=@(x)3.*x.^4+4;
g=@(x)12.*x.^3;
% set x0
xkd=1000;
% compute x1
xk=xkd-g(xkd);
count=0;
% iterations
while(abs(f(xkd)-f(xk))>abs((1e-8)*f(xkd)))
    count=count+1;
    alpha=1;
    while(f(xk)-f(xk-alpha*g(xk))<(0.0001*alpha*g(xk)'*g(xk)))
        alpha=alpha*0.8;       
    end
    xkd=xk;
    xk=xk-alpha*g(xk);
end
x=xk;
iters=count;

输出:

>> [x,iters]=sd()

x =

    0.0228


iters =

   106

可见最速下降法的迭代次数远多于牛顿法,得到的最小值点也不如牛顿法准确。

 

总结一下,与最速下降法相比,牛顿法的特点:

  1. 迭代次数少、收敛速度快;
  2. 得到的最小值点比较准确(至少在我的实验中如此);
  3. 没有选取步长的麻烦;
  4. 缺点是需要计算目标函数的二阶梯度,也就是Hessian矩阵,可能计算量较大。

 

下面给出Python实现牛顿法的代码:

def Newton():
    f=lambda x:3*x**4+4
    g=lambda x:12*x**3
    h=lambda x:36*x*x
    iteration=lambda x:x-g(x)/h(x)
    xkd=1000
    xk=iteration(1000)
    c=0
    while abs(f(xkd)-f(xk))>abs(f(xkd)*1e-8):
        c+=1
        xkd=xk
        xk=iteration(xkd)
    return xk,c

x,c=Newton()
print(x,c)

 输出:

0.005215095050846564 29

现在Python代码实现的至少标量函数的牛顿法,出现向量和矩阵运算的情况我之后再研究。

 

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值