1. 实验说明:

牛顿法的基本思想是在迭代点xk初对目标函数f(x)进行二次函数近似,然后把二次模型的极小点作为新的迭代点,并不断重复这一过程,直至求得满足精度的近似极小点。
而拟牛顿法可以在保证收敛速度的同时,不用满足Hesse矩阵处处正定的条件并且可以避免每次都进行Hesse计算,通过构造可以近似Hesse矩阵(或Hesse矩阵的逆)的正定对称阵。

2. 实验内容:

牛顿法:

算法步骤:

牛顿法求解 Logistic 回归代码 牛顿法实例_牛顿法

举例分析;利用牛顿法求解一下无约束优化问题
目标函数 f(x)=100*(2x1x1+2)(2x1x1+2)+x2x2

实现源代码:
这里取不同的x0[]进行测试,精度阈值ess为1*e^(-5)

function [xk,fk,k]=newton_method2(x0,ess) 
%目标函数f,有确定最优解x*=[0 0],f(x*)=400.0
syms x1 x2; 
f=100*(2*x1^2+2)^2+x2^2;
%构造目标函数f的梯度函数 
fx=diff(f,x1); 
fy=diff(f,x2);
gf=[fx fy]';
%求Hesse阵
fxx=diff(fx,x1); 
fxy=diff(fx,x2);
fyx=diff(fy,x1); 
fyy=diff(fy,x2);
Hess=[fxx,fxy;
      fyx,fyy];
%初始点的梯度和函数值,,赋值
xk=x0'; 
fk=subs(f,[x1 x2],x0);
gk=subs(gf,[x1 x2],x0);
Hk=subs(Hess,[x1 x2],x0);
k=0;  
%进入迭代循环
while((norm(gk)>ess)&&(k<10))%迭代终止条件--满足精度条件
%确定搜索方向dk,步长为1
        dk=-Hk\gk;   
        xk=xk+dk;     
%计算下一点的函数值和梯度
        fk=subs(f,[x1 x2],xk');
        gk=subs(gf,[x1 x2],xk');
        Hk=subs(Hess,[x1 x2],xk');
%迭代次数自增
        k=k+1
end

调用方式:

clear all;
x0=[5 5];
ess=1e-5;
[xk,fk,k]=newton_method2(x0,ess);
xk=vpa(xk,10)
fk=vpa(fk,5)
k

运行结果:

牛顿法求解 Logistic 回归代码 牛顿法实例_迭代_02

拟牛顿法(DFP算法):

算法步骤:

牛顿法求解 Logistic 回归代码 牛顿法实例_matlab_03

其中DFP校正公式为:

牛顿法求解 Logistic 回归代码 牛顿法实例_牛顿法求解 Logistic 回归代码_04


牛顿法求解 Logistic 回归代码 牛顿法实例_算法_05

举例分析;利用拟牛顿法求解一下无约束优化问题
目标函数 f(x)=100*(2x1x1+2)(2x1x1+2)+x2x2

实现源代码:
这里取不同的x0[]进行测试,精度阈值ess 为1*e^(-5)。

function [xk,fk,k]=cauthy_newton_method1(x0,ess) 
%目标函数f,有确定最优解x*=[0 0],f(x*)=400.0
syms x1 x2 t;  
f=100*(2*x1^2+2)^2+x2^2;
%构造目标函数f的梯度函数 
fx=diff(f,x1); 
fy=diff(f,x2);
gf=[fx fy];
%初始点的梯度和函数值,,赋值
xk=x0;
fk=subs(f,[x1 x2],x0); 
gk=subs(gf,[x1 x2],x0);
Hk=eye(2);
k=0;
%进入迭代循环
while((norm(gk)>ess)&&(k<15))%迭代终止条件
%确定搜索方向   
        dk=-Hk*gk'  ;
%下一点x(k+1)    
        xk=xk+t*dk' ;   
        f_t=subs(f,[x1 x2],xk); %构造一元搜索的一元函数φ(t) 
        df_t=diff(f_t,t);    
        res=solve(df_t)  ;%由一维搜索找到最优步长  
        tk=res(1)    ;    
if (tk~=0 )        
    tk=double(tk);
else
    break; 
end
%计算下一点的函数值和梯度
        xk = subs(xk,t,tk)    ;
        fk = subs(f,[x1 x2],xk);
        gk0=gk;     
        gk=subs(gf,[x1 x2],xk);
%DPF校正公式,找到修正矩阵
        yk=gk-gk0;   
        sk=tk*dk';
        Hk=Hk-(Hk*yk'*yk*Hk)/(yk*Hk*yk')+sk'*sk/(yk*sk');  
        k=k+1
end

调用方式:

clear all;
x0=[10.8 11.8];
ess=1e-5;
[xk,fk,k]=cauthy_newton_method1(x0,ess);
xk=vpa(xk,5)
fk=vpa(fk,5)
k

运行结果:

牛顿法求解 Logistic 回归代码 牛顿法实例_迭代_06

3. 结果分析

本实验采取牛顿法和拟牛顿法对同一个目标函数进行多组最优化测试,并且每一组都有同样的起始点,故两个方法的运行结果之间具有很大的可比性。
从两次运行结果容易分析出,对于不同的起始点,拟牛顿法收敛速度比牛顿法更快,满足相同精度阈值条件需要的迭代次数更少,可以更快的得到最优化值。
在程序运行时发现,牛顿法随着迭代次数的提高,每一次迭代的速度明显变慢,中断程序可发现程序经常卡在Hesse矩阵的计算步骤上。根据该现象可推测Hesse矩阵的计算量很大,即便对于计算机来说也是艰巨的任务。

4. 总结

牛顿法是二阶收敛,收敛速度很快,对于正定二次函数一次迭代就可以达到最优解,但由于对二阶信息有严苛的要求,并且计算量要求更大,常常采用拟牛顿法。拟牛顿法是对牛顿法和最速下降法的改进,采用近似矩阵近似Hesse矩阵,不需要涉及对二阶信息的解析。在实验中也看到,对于该目标函数,拟牛顿法可以在更少迭代次数内完成最优化求解,并且由于不涉及Hesse矩阵而计算消耗时间更少。