优化算法——拟牛顿法之L-BFGS算法
一、BFGS算法
在“优化算法——拟牛顿法之BFGS算法”中,我们得到了BFGS算法的校正公式:
利用Sherman-Morrison公式可对上式进行变换,得到
令,则得到:
二、BGFS算法存在的问题
在BFGS算法中,每次都要存储近似Hesse矩阵,在高维数据时,存储浪费很多的存储空间,而在实际的运算过程中,我们需要的是搜索方向,因此出现了L-BFGS算法,是对BFGS算法的一种改进算法。在L-BFGS算法中,只保存最近的次迭代信息,以降低数据的存储空间。
三、L-BFGS算法思路
令,,则BFGS算法中的可以表示为:
若在初始时,假定初始的矩阵,则我们可以得到:
若此时,只保留最近的步:
这样在L-BFGS算法中,不再保存完整的,而是存储向量序列和,需要矩阵时,使用向量序列和计算就可以得到,而向量序列和也不是所有都要保存,只要保存最新的步向量即可。
四、L-BFGS算法中的方向的计算方法
五、实验仿真
lbfgs.py
#coding:UTF-8from numpy import *
from function import *def lbfgs(fun, gfun, x0):result = []#保留最终的结果maxk = 500#最大的迭代次数rho = 0.55sigma = 0.4H0 = eye(shape(x0)[0])#s和y用于保存最近m个,这里m取6s = []y = []m = 6k = 1gk = mat(gfun(x0))#计算梯度dk = -H0 * gkwhile (k < maxk): n = 0mk = 0gk = mat(gfun(x0))#计算梯度while (n < 20):newf = fun(x0 + rho ** n * dk)oldf = fun(x0)if (newf < oldf + sigma * (rho ** n) * (gk.T * dk)[0, 0]):mk = nbreakn = n + 1#LBFGS校正x = x0 + rho ** mk * dk#print x#保留m个if k > m:s.pop(0)y.pop(0)#计算最新的sk = x - x0yk = gfun(x) - gks.append(sk)y.append(yk)#two-loop的过程t = len(s)qk = gfun(x)a = []for i in xrange(t):alpha = (s[t - i - 1].T * qk) / (y[t - i - 1].T * s[t - i - 1])qk = qk - alpha[0, 0] * y[t - i - 1]a.append(alpha[0, 0])r = H0 * qkfor i in xrange(t):beta = (y[i].T * r) / (y[i].T * s[i])r = r + s[i] * (a[t - i - 1] - beta[0, 0])if (yk.T * sk > 0):dk = -r k = k + 1x0 = xresult.append(fun(x0))return result
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
testLBFGS.py
#coding:UTF-8
'''
Created on 2015年6月6日@author: zhaozhiyong
'''from lbfgs import *import matplotlib.pyplot as plt x0 = mat([[-1.2], [1]])
result = lbfgs(fun, gfun, x0)
print resultn = len(result)
ax = plt.figure().add_subplot(111)
x = arange(0, n, 1)
y = result
ax.plot(x,y)plt.show()
实验结果
参考文献
- libLBFGS: a library of Limited-memory Broyden-Fletcher-Goldfarb-Shanno (L-BFGS)
优化算法——拟牛顿法之L-BFGS算法相关推荐
- l bfgs算法java代码_优化算法——拟牛顿法之L-BFGS算法
一.BFGS算法 BFGS算法的校正公式: 利用Sherman-Morrison公式可对上式进行变换,得到 令 ,则得到: 二.BGFS算法存在的问题 在BFGS算法中.每次都要存储近似Hesse矩阵 ...
- 拟牛顿法/Quasi-Newton,DFP算法/Davidon-Fletcher-Powell,及BFGS算法/Broyden-Fletcher-Goldfarb-Shanno...
拟牛顿法/Quasi-Newton,DFP算法/Davidon-Fletcher-Powell,及BFGS算法/Broyden-Fletcher-Goldfarb-Shanno 转载须注明出处:htt ...
- l bfgs算法java代码_数值优化:理解L-BFGS算法
译自<Numerical Optimization: Understanding L-BFGS>,本来只想作为学习CRF的补充材料,读完后发现收获很多,把许多以前零散的知识点都串起来了.对 ...
- l bfgs算法java代码_L-BFGS算法介绍
本文由作者林洋港授权网易云社区发布. 一. L-BFGS是什么 L-BFGS是解无约束非线性规划问题最常用的方法,具有收敛速度快.内存开销少等优点,在机器学习各类算法中常有它的身影.简单的说,L-BF ...
- l bfgs算法java代码_理解L-BFGS算法
理解L-BFGS算法 Mar 30, 2015 #数值优化 #无约束最优化 L-BFGS(Limited-Memory BFGS)是BFGS算法在受限内存时的一种近似算法,而BFGS是数学优化中 ...
- L-BFGS算法/Broyden族/BFGS算法/阻尼牛顿法的Python实现代码
下面定义了三个Python语言编写的函数:函数表达式fun,梯度向量gfun,和海森矩阵hess.这三个表达式在后面各个算法的实现中会用到. # 函数表达式fun fun = lambda x:100 ...
- bfgs算法 matlab,BFGS算法的最优化问题及在MATLAB中的实现
BFGS算法的最优化问题及在MATLAB中的实现 对拟牛顿方法中的BFGS算法进行阐述,基于matlab软件对非线性无约束优化问题进行了仿真研究,结果表明利用matlab软件解答非线性无约束优化问题获 ...
- BFGS算法及其matlab实现
目录 一.前沿 二.基本思想 三.秩2校正公式 四.算法步骤 五.matlab程序实现 一.前沿 上一篇文章介绍了基于秩1的拟牛顿算法,紧接上文,这次我们介绍关于秩2的拟牛顿算法,即BFGS算法.为啥 ...
- 优化算法——拟牛顿法之BFGS算法
一.BFGS算法简介 BFGS算法是使用较多的一种拟牛顿方法,是由Broyden,Fletcher,Goldfarb,Shanno四个人分别提出的,故称为BFGS校正. 同DFP校正的推导公式一样,D ...
最新文章
- EntityFramework Core解决并发详解
- sort,uniq,wc,history命令简介
- java http的get,post请求
- C/C++编译器教程之如何安装vs,看了的人应该都会装,只要不手残
- 字符串统计,一个中文算2个字符,一个英文算一个字符
- python 批量下载视频_python实现抖音视频批量下载
- 企业云计算运营模式,主要分为哪3种运营模式?
- 一个app项目如何从想法一步一步落地?有哪些必要的流程?
- Go语言之error
- 蔡氏电路matlab仿真实代码验,基于蔡氏电路的MATLAB仿真
- vue-cli脚手架卡在 ‘98%’ after emitting CopyPlugin 报错,无法运行
- 华为MateBook E二合一笔记本发布:首次采用OLED原色屏
- 一个div分上下两部分,上部分高度不固定,下面部分自动填满剩余高度
- 力扣解法汇总2013-检测正方形
- linux 系统迁移到固态硬盘,在Linux系统中将SSD当块设备缓存的方法
- 索引数组与关联数组的定义及区别
- tensorflow基本知识
- lol服务器维护还在对局中,英雄联盟提示对局仍在进行中进不去游戏怎么办
- JavaScript第五天
- 软件测试简历怎么投?这样准备,面试机会直接翻倍!