梯度下降法及matlab实现

来源:互联网 发布:js array removeall 编辑:程序博客网 时间:2024/06/12 12:02

梯度下降法又称为最速下降法,是求解无约束优化问题最简单和最古老的方法之一。对无约束最优化问题:

minxRnf(x)
梯度下降法是负梯度方向dk=f(xk)
取负梯度的原因:设f(x)xk附近连续可微,dk为搜索方
向向量,gk=f(xk). 由泰勒展开式得
f(xk+αdk)=f(xk)+αgTkdk+o(α),α>0.
目标函数f(x)xk处沿方向dk下降的变化率:
limα0f(xk+αdk)f(xk)α=limα0αgTkdk+o(α)α=gTkdk=gkdkcos(θ¯k)

其中θ¯kgkdk的夹角。显然, 对于不同的方向dk, 函数变化率取决于它与gk夹角的余弦值.要使变化率最小,只cos(θ¯k)=1, 即θ¯k=π 时才能达到。
梯度下降法:
step1: 选取初始点x0Rn, 容许误差0<ϵ1. 令k:=1.
step2: 计算gk=f(xk). 若gkϵ, 停算, 输出xk作为近似最优解.
step3: 取方向dk=gk.
step4: 由线搜索技术确定步长因子αk.
step5: 令xx+1=xk+αkdk, k=k+1, 转step1.

matalb代码如下:

function [x,val,k]=grad(fun,gfun,x0)% 功能: 用最速下降法求解无约束问题:  min f(x)%输入:  x0是初始点, fun, gfun分别是目标函数和梯度%输出:  x, val分别是近似最优点和最优值,  k是迭代次数.maxk=5000;   %最大迭代次数rho=0.5;sigma=0.4;k=0;  epsilon=1e-5;while(k<maxk)    g=feval(gfun,x0);  %计算梯度    d=-g;    %计算搜索方向    if(norm(d)<epsilon), break; end    m=0; mk=0;    while(m<20)   %Armijo搜索        if(feval(fun,x0+rho^m*d)<feval(fun,x0)+sigma*rho^m*g'*d)            mk=m; break;        end        m=m+1;    end    x0=x0+rho^mk*d;    k=k+1;endx=x0;val=feval(fun,x0); 
原创粉丝点击