最佳化演算法——擬牛頓法之BFGS演算法

來源:互聯網
上載者:User

標籤:最佳化演算法   擬牛頓法   bfgs   

一、BFGS演算法簡介    BFGS演算法是使用較多的一種擬牛頓方法,是由Broyden,Fletcher,Goldfarb,Shanno四個人分別提出的,故稱為BFGS校正。    同DFP校正的推導公式一樣,DFP校正見博文“最佳化演算法——擬牛頓法之DFP演算法”。對於擬牛頓方程:


可以化簡為:


令,則可得:


在BFGS校正方法中,假設:


二、BFGS校正公式的推導    令,其中均為的向量。,。    則對於擬牛頓方程可以化簡為:


將代入上式:


將代入上式:




    已知:為實數,為的向量。上式中,參數和解的可能性有很多,我們取特殊的情況,假設,。則


代入上式:




令,,則:




則最終的BFGS校正公式為:


三、BFGS校正的演算法流程    設對稱正定,由上述的BFGS校正公式確定,那麼對稱正定的充要條件是。    在博文“最佳化演算法——牛頓法(Newton Method)”中介紹了非精確的線搜尋準則:Armijo搜尋準則,搜尋準則的目的是為了協助我們確定學習率,還有其他的一些準則,如Wolfe準則以及精確線搜尋等。在利用Armijo搜尋準則時並不是都滿足上述的充要條件,此時可以對BFGS校正公式做些許改變:


BFGS擬牛頓法的演算法流程:
四、求解具體最佳化問題   求解無約束最佳化問題


其中,。python程式實現:
  1. function.py
    #coding:UTF-8'''Created on 2015年5月19日@author: zhaozhiyong'''from numpy import *#fundef fun(x):    return 100 * (x[0,0] ** 2 - x[1,0]) ** 2 + (x[0,0] - 1) ** 2#gfundef gfun(x):    result = zeros((2, 1))    result[0, 0] = 400 * x[0,0] * (x[0,0] ** 2 - x[1,0]) + 2 * (x[0,0] - 1)    result[1, 0] = -200 * (x[0,0] ** 2 - x[1,0])    return result

  2. bfgs.py
    #coding:UTF-8from numpy import *from function import *def bfgs(fun, gfun, x0):    result = []    maxk = 500    rho = 0.55    sigma = 0.4    m = shape(x0)[0]    Bk = eye(m)    k = 0    while (k < maxk):        gk = mat(gfun(x0))#計算梯度        dk = mat(-linalg.solve(Bk, gk))        m = 0        mk = 0        while (m < 20):            newf = fun(x0 + rho ** m * dk)            oldf = fun(x0)            if (newf < oldf + sigma * (rho ** m) * (gk.T * dk)[0,0]):                mk = m                break            m = m + 1                #BFGS校正        x = x0 + rho ** mk * dk        sk = x - x0        yk = gfun(x) - gk        if (yk.T * sk > 0):            Bk = Bk - (Bk * sk * sk.T * Bk) / (sk.T * Bk * sk) + (yk * yk.T) / (yk.T * sk)                k = k + 1        x0 = x        result.append(fun(x0))        return result

  3. testBFGS.py
    #coding:UTF-8'''Created on 2015年5月19日@author: zhaozhiyong'''from bfgs import *import matplotlib.pyplot as plt  x0 = mat([[-1.2], [1]])result = bfgs(fun, gfun, x0)n = len(result)ax = plt.figure().add_subplot(111)x = arange(0, n, 1)y = resultax.plot(x,y)plt.show()


五、實驗結果



最佳化演算法——擬牛頓法之BFGS演算法

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.