zoukankan      html  css  js  c++  java
  • 无约束优化问题

    线性搜索下降算法

    • Step 0:给定初始点(x^0)(k=0)
    • Step 1:判断(x^k)是否满足终止条件,满足则终止;
    • Step 2:寻找(x^k)处的下降方向(d^k)
    • Step 3:选择合适的步长(alpha^k>0),使得(f(x^k+alpha_k d^k)<f(x^k))
    • Step 4:令(x^{k+1}=x^k+alpha_kd^k)(k=k+1),转向Step 1.
    1. 常用的终止准则:(left| abla fleft(x^{k} ight) ight| leq epsilon)
    2. 选择步长:基于区间的直接搜索法、非精确搜索准则;
    3. 下降方向:不同的下降方向选取方式就有了不同的算法
    4. 收敛性、收敛速度

    1 坐标轴交替下降法

    基本思想:给定初始点(x^0),依次沿着坐标轴(e_1,dots e_n)进行搜索

    1. 给定初始点(x^0)(k=0)
    2. 判断是否满足(left| abla fleft(x^{k} ight) ight| leq epsilon),满足则终止;
    3. (y_0=x^k),令(y_i=y_{i-1}+alpha_ie_i),其中(alpha_{i}=arg min fleft(y_{i-1}+alpha e_{i} ight), i=1, cdots, n)
    4. (x^{k+1}=y_n)(k=k+1),转到第2步

    当变量之间的交叉程度较小时非常有效,比如:

    [min f(x)=f_1(x_1)+f_2(x_2)+dots+f_n(x_n) ]

    2 最速下降法(梯度下降法)

    基本思想:选择(x^k)处负梯度作为搜索方向,即(d^{k}=- abla fleft(x^{k} ight))

    若迭代步长(alpha_k)(phi(alpha)=f(x^k+alpha_k d^k))的精确最小点,则(phi^{'}(alpha_k)=0),即:

    [phi^{'}(alpha_k)=- abla fleft(x^{k+1} ight)^{T} abla fleft(x^{k} ight)=0 ]

    例:(min f(x)=0.5x_1^2+2x_2^2),设初始点(x^0=(2,1)^T)

    缺点:

    • 收敛速度慢(线性收敛)
    • 不具备二次终止性,即在有限步内求得凸二次函数最优解

    3 牛顿法

    基本思想:对(x^k)处的二次逼近函数进行最小化:

    [min fleft(x^{k} ight)+ abla fleft(x^{k} ight)^{T}left(x-x^{k} ight)+1 / 2left(x-x^{k} ight)^{T} abla^{2} fleft(x^{k} ight)left(x-x_{k} ight) ]

    对二次近似函数进行求导:

    [ abla fleft(x^{k} ight)+ abla^2 fleft(x^{k} ight)left(x-x^{k} ight)=0 ]

    进行移项可得:

    [x^{k+1}=x^k-[ abla^2 fleft(x^{k} ight)]^{-1} abla fleft(x^{k} ight) ]

    牛顿法步骤:

    1. 给定初始点(x^0)(k=0)
    2. 判断是否满足(left| abla fleft(x^{k} ight) ight| leq epsilon),满足则终止;
    3. 计算(d^k=-[ abla^2 fleft(x^{k} ight)]^{-1} abla fleft(x^{k} ight)),步长(alpha_k=1)
    4. (x^{k+1}=x^k+d^k)

    优缺点:

    • 牛顿方向(d^k=-[ abla^2 fleft(x^{k} ight)]^{-1} abla fleft(x^{k} ight))只有在( abla^2 fleft(x^{k} ight))正定时才是下降方向
    • 当初始点(x^0)取得比较接近于收敛点(x^*)时,且( abla^2 fleft(x^{k} ight))具有较好的性质,二阶收敛
    • 计算量大,需要计算Hesse矩阵

    4 修正牛顿法

    • 对步长(alpha_k)的修正:首先判断(alpha_k=1)是否让目标函数充分下降,否则采用线搜索方法重新确定(alpha_k)

    • 对于方向(Hesse矩阵)的修正:选取(d^k=-B_k^{-1} abla fleft(x^{k} ight))

      • ( abla^2 fleft(x^{k} ight)succ 0),则选取(B_k= abla^2 fleft(x^{k} ight))

      • 否则修正方法有多种:

        1. (B_k= abla^2 fleft(x^{k} ight)+lambda I)(lambda)为适当正数保证(B_k)正定

        2. 考虑特征值分解( abla^{2} fleft(x^{k} ight)=Q^{T} Sigma Q) ,其中$ Sigma=dia g(lambda_1,cdots,lambda_n)$ ,每一个对角线元素就是一个特征值。令(B_k=Q^{T} diag( au_i) Q)

          [ au_{i}=left{egin{array}{ll} lambda_{i}, & ext { if } lambda_{i} geq delta ; \ delta, & ext { otherwise } end{array}, delta ight. ext { 为一适当的正数 } ]

    5 拟牛顿法

    考虑(f(x))在当前点(x^k)处的二次近似函数

    [m_k(x)=fleft(x^{k} ight)+ abla fleft(x^{k} ight)^{T}left(x-x^{k} ight)+1 / 2left(x-x^{k} ight)^{T} B_kleft(x-x_{k} ight) ]

    其中(B_ksucc 0),这个(B_k)就是为了代替( abla^2 fleft(x^{k} ight))的,因为Hesse矩阵不好求

    利用(min m_k(x))得到搜索方向(d^k=-B_k^{-1} abla fleft(x^{k} ight))

    拟牛顿法步骤:

    1. 给定初始点(x^0)(B_0succ 0)(k=0)
    2. 判断是否满足(left| abla fleft(x^{k} ight) ight| leq epsilon),满足则终止;
    3. 计算方向(d^k=-B_k^{-1} abla fleft(x^{k} ight))
    4. 确定步长(alpha_k)
    5. (x^{k+1}=x^k+d^k),确定(B_{k+1})(k=k+1),转到第2步

    (x^{k+1})这个点确定(B_{k+1})有多种方法,如何简便获取矩阵(B_{k+1})

    (x^{k})点处已知( abla fleft(x^{k} ight))(B_k),此时刚得到(x^{k+1})点,可以计算出该点的梯度( abla fleft(x^{k+1} ight)),待求的为(B_{k+1})。根据中值定理可知:

    [ abla fleft(x^{k+1} ight)- abla fleft(x^{k} ight)= abla^2 fleft(xi ight)(x^{k+1}-x^k), quad xi=lambda x^{k}+(1-lambda)x^{k+1},lambdain(0,1) ]

    这个Hesse矩阵( abla^2 fleft(xi ight))不好算,所以用(B_{k+1})来代替,所以基本要求是:

    [ abla fleft(x^{k+1} ight)- abla fleft(x^{k} ight)=B_{k+1}(x^{k+1}-x^k) ]

    这个就是拟牛顿方程,满足拟牛顿方程的矩阵有很多。

    • (y_k= abla fleft(x^{k+1} ight)- abla fleft(x^{k} ight))(s_k=x^{k+1}-x^{k}),则上式简写为:(y_k=B_{k+1}s_k)

    • (H_k=B_k^{-1}),拟牛顿方程也可以表示成(s_k=H_{k+1}y_k)

    基于已有信息(y_k,s_k,B_k)获取(B_{k+1})有几种方法:

    • 第一类方法:选择满足拟牛顿方程且与(B_k)近似的矩阵

      [min | B-B_{k} |, ext { s.t. } B s_{k}=y_{k}, B=B^{T} ]

    • 第二类方法:对(B_k)(或者(H_k))进行校正,如:(B_{k+1}=B_k+Delta B)

      • rank-2校正,要求(Delta B)的秩为2,有DFP方法,BFGS方法
      • rank-1校正,要求(Delta B)的秩为1

    6 共轭方向法

    共轭方向:考虑正定矩阵(Q)及非零向量(d^i,d^j)。若((d^i)^TQd^j=0),则称(d^i,d^j)关于矩阵(Q)共轭。

    对于问题:

    [min f(x)=1 / 2 x^{T} Q x+c^{T} x, quad Q succ 0 ]

    给定初始点(x^0)及一组关于(Q)共轭方向(d^0,d^1,cdots,d^{n-1}),令(x^{k+1}=x^k+alpha_kd^k, quad k=0,cdots ,n-1)

    其中

    [alpha_{k}=arg min phi(alpha)=fleft(x^{k}+alpha d^{k} ight) ]

    (phi(alpha))求导可得到

    [alpha_{k}=-frac{left(Q x^{k}+c ight)^{T} d^{k}}{left(d^{k} ight)^{T} Q d^{k}}=-frac{ abla fleft(x^{k} ight)^{T} d^{k}}{left(d^{k} ight)^{T} Q d^{k}} ]

    共轭方向法为一类方法,共轭梯度法是其中一种。

    几何解释:

    对于问题

    [min f(x)=1 / 2 x^{T} Q x+c^{T} x, quad Q succ 0 ]

    • (Q)是一个对角阵时,(f(x)=1 / 2 x^{T} m diag(q_{11},cdots q_{nn}) x+c^{T}),可以发现(f(x))没有交叉的项(即(x_{ij},i ot=j)),所以这时沿着每个维度去正交搜索就行了(作一次精确线搜索就可以得到这个维度上最小值的精确解),比如下图(n=2)时:

    • (Q)不是对角阵时

      (S=(d^0,d^1,cdots,d^{n-1}))(S)可逆,可以发现此时

      [hat Q = S^TQS= left(egin{array}{c} left(d^{0} ight)^{ op} \ cdots \ left(d^{n-1} ight)^{T} end{array} ight) Qleft(d^{0} cdot cdot cdot d^{n-1} ight) ]

      根据共轭的性质可以知道,(hat Q)一个对角阵。因此令(x=Shat{x}),上面的问题中(f(x))可以写为:

      [egin{aligned} f(hat x)& =1 / 2hat x^{T}S^T Q S hat x+(S^Tc)^{T} hat x \ & = 1 / 2hat x^{T} hat Q hat x+(S^Tc)^{T} hat x end{aligned} ]

      此时变成了在(hat x)坐标域上进行搜索。

    7 共轭梯度法

    在迭代下降过程中,借助当前点(x^k)的梯度信息构造共轭方向(d^k)

    共轭梯度法步骤:

    1. 给定初始点(x^0),记(d^0=-Delta f(x^0))(k=0)

    2. 判断是否满足(left| abla fleft(x^{k} ight) ight| leq epsilon),满足则终止;

    3. 利用线性搜索计算步长(alpha_k)(上面有计算公式);

    4. (x^{k+1}=x^k + alpha_k d^k),并计算方向

      [d^{k+1}=-Delta f(x^{k+1})+eta_kd^k ]

      其中

      [eta_{k}=frac{ abla fleft(x^{k+1} ight)^{T} abla fleft(x^{k+1} ight)}{ abla fleft(x^{k} ight)^{T} abla fleft(x^{k} ight)} ]

      (k=k+1),转第2步

  • 相关阅读:
    Jquery EasyUI选项卡-Tabs的使用方法
    JS—正则表达式
    Visiual Studio2012 CLR20r3问题
    JSON.stringify 语法实例讲解
    JS中对数组的操作方法
    easyUI之datagrid
    (转帖)关于easyui中的datagrid在加载数据时候报错:无法获取属性"Length"的值,对象为null或未定义
    [转载]JQ 选择器大全[<font color=red>强记忆</font>]
    thinkphp函数学习(1)——header, get_magic_quotes_gpc, array_map, stripslashes, stripslashes_deep
    thinkphp函数学习(0)——开篇
  • 原文地址:https://www.cnblogs.com/MayeZhang/p/14343104.html
Copyright © 2011-2022 走看看