优化算法——拟牛顿法之BFGS算法

优化算法——拟牛顿法之BFGS算法一 BFGS 算法简介 BFGS 算法是使用较多的一种拟牛顿方法 是由 Broyden Fletcher Goldfarb Shanno 四个人分别提出的 故称为 BFGS 校正

大家好,欢迎来到IT知识分享网。

一、BFGS算法简介

    BFGS算法是使用较多的一种拟牛顿方法,是由Broyden,Fletcher,Goldfarb,Shanno四个人分别提出的,故称为BFGS校正。
    同DFP校正的推导公式一样,DFP校正见博文“ 优化算法——拟牛顿法之DFP算法”。对于拟牛顿方程:
优化算法——拟牛顿法之BFGS算法
可以化简为:
优化算法——拟牛顿法之BFGS算法

优化算法——拟牛顿法之BFGS算法,则可得:
优化算法——拟牛顿法之BFGS算法
在BFGS校正方法中,假设:
优化算法——拟牛顿法之BFGS算法

二、BFGS校正公式的推导

    令
优化算法——拟牛顿法之BFGS算法,其中 优化算法——拟牛顿法之BFGS算法均为 优化算法——拟牛顿法之BFGS算法的向量。 优化算法——拟牛顿法之BFGS算法优化算法——拟牛顿法之BFGS算法
    则对于拟牛顿方程
优化算法——拟牛顿法之BFGS算法可以化简为:
优化算法——拟牛顿法之BFGS算法

优化算法——拟牛顿法之BFGS算法代入上式:
优化算法——拟牛顿法之BFGS算法

优化算法——拟牛顿法之BFGS算法代入上式:
优化算法——拟牛顿法之BFGS算法
优化算法——拟牛顿法之BFGS算法
    已知:
优化算法——拟牛顿法之BFGS算法为实数, 优化算法——拟牛顿法之BFGS算法优化算法——拟牛顿法之BFGS算法的向量。上式中,参数 优化算法——拟牛顿法之BFGS算法优化算法——拟牛顿法之BFGS算法解的可能性有很多,我们取特殊的情况,假设 优化算法——拟牛顿法之BFGS算法优化算法——拟牛顿法之BFGS算法。则
优化算法——拟牛顿法之BFGS算法
代入上式:
优化算法——拟牛顿法之BFGS算法
优化算法——拟牛顿法之BFGS算法

优化算法——拟牛顿法之BFGS算法优化算法——拟牛顿法之BFGS算法,则:
优化算法——拟牛顿法之BFGS算法
优化算法——拟牛顿法之BFGS算法
则最终的BFGS校正公式为:
优化算法——拟牛顿法之BFGS算法

三、BFGS校正的算法流程

    设
优化算法——拟牛顿法之BFGS算法对称正定, 优化算法——拟牛顿法之BFGS算法由上述的BFGS校正公式确定,那么 优化算法——拟牛顿法之BFGS算法对称正定的充要条件是 优化算法——拟牛顿法之BFGS算法
    在博文“ 优化算法——牛顿法(Newton Method)”中介绍了非精确的线搜索准则:Armijo搜索准则,搜索准则的目的是为了帮助我们确定学习率,还有其他的一些准则,如Wolfe准则以及精确线搜索等。在利用Armijo搜索准则时并不是都满足上述的充要条件,此时可以对BFGS校正公式做些许改变:
优化算法——拟牛顿法之BFGS算法
BFGS拟牛顿法的算法流程:
优化算法——拟牛顿法之BFGS算法

四、求解具体优化问题

   求解无约束优化问题
优化算法——拟牛顿法之BFGS算法
其中,
优化算法——拟牛顿法之BFGS算法

python程序实现:

  1. function.py
    #coding:UTF-8 ''' Created on 2015年5月19日 @author: zhaozhiyong ''' from numpy import * #fun def fun(x): return 100 * (x[0,0] 2 - x[1,0]) 2 + (x[0,0] - 1) 2 #gfun def 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-8 from 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 = result ax.plot(x,y) plt.show()

五、实验结果

优化算法——拟牛顿法之BFGS算法

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/112603.html

(0)
上一篇 2026-01-17 11:10
下一篇 2026-01-17 11:20

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信