优化算法——拟牛顿法之L-BFGS算法
一、BFGS算法
在“优化算法——拟牛顿法之BFGS算法”中,我们得到了BFGS算法的校正公式:
利用Sherman-Morrison公式可对上式进行变换,得到
令,则得到:
二、BGFS算法存在的问题
在BFGS算法中。每次都要存储近似Hesse矩阵
B_k^{-1}" title="B_k^{-1}" alt="" />,在高维数据时,存储浪费非常多的存储空间,而在实际的运算过程中。我们须要的是搜索方向。因此出现了L-BFGS算法。是对BFGS算法的一种改进算法。
在L-BFGS算法中。仅仅保存近期的次迭代信息。以减少数据的存储空间。
三、L-BFGS算法思路
令
\rho&space;_k=\frac{1}{y_k^Ts_k}" title="\rho _k=\frac{1}{y_k^Ts_k}" alt="" />。
V_k=I-\frac{y_ks_k^T}{y_k^Ts_k}" title="V_k=I-\frac{y_ks_k^T}{y_k^Ts_k}" alt="" />,则BFGS算法中的
H_{k+1}" title="H_{k+1}" alt="" />能够表示为:
若在初始时,假定初始的矩阵
H_0=I" title="H_0=I" alt="" />,则我们能够得到:
H_{1}=V_0^TH_0V_0+\rho&space;_0s_0s_0^T" title="H_{1}=V_0^TH_0V_0+\rho _0s_0s_0^T" alt="" />
\begin{align*}&space;H_2&space;&=&space;V_1^TH_1V_1+\rho&space;_1s_1s_1^T\\&space;&=&space;V_1^T\left&space;(&space;V_0^TH_0V_0+\rho&space;_0s_0s_0^T&space;\right&space;)V_1+\rho&space;_1s_1s_1^T\\&space;&=&space;V_1^TV_0^TH_0V_0V_1+V_1^T\rho&space;_0s_0s_0^TV_1+\rho&space;_1s_1s_1^T&space;\end{align*}" title="\begin{align*} H_2 &= V_1^TH_1V_1+\rho _1s_1s_1^T\\ &= V_1^T\left ( V_0^TH_0V_0+\rho _0s_0s_0^T \right )V_1+\rho _1s_1s_1^T\\ &= V_1^TV_0^TH_0V_0V_1+V_1^T\rho _0s_0s_0^TV_1+\rho _1s_1s_1^T \end{align*}" alt="" />
若此时。仅仅保留近期的步:
\begin{align*}&space;H_{k+1}&space;&=&space;\left&space;(&space;V_k^TV_{k-1}^T\cdots&space;V_{k-m}^T&space;\right&space;)H_0\left&space;(&space;V_{k-m}\cdots&space;V_{k-1}V_k&space;\right&space;)\\&space;&+&space;\left&space;(&space;V_k^TV_{k-1}^T\cdots&space;V_{k-m}^T&space;\right&space;)\rho&space;_1s_1s_1^T\left&space;(&space;V_{k-m}\cdots&space;V_{k-1}V_k&space;\right&space;)\\&space;&+&space;\cdots&space;\\&space;&+&space;V_k^T\rho&space;_{k-1}s_{k-1}s_{k-1}^TV_k\\&space;&+&space;\rho&space;_ks_ks_k^T&space;\end{align*}" title="\begin{align*} H_{k+1} &= \left ( V_k^TV_{k-1}^T\cdots V_{k-m}^T \right )H_0\left ( V_{k-m}\cdots V_{k-1}V_k \right )\\ &+ \left ( V_k^TV_{k-1}^T\cdots V_{k-m}^T \right )\rho _1s_1s_1^T\left ( V_{k-m}\cdots V_{k-1}V_k \right )\\ &+ \cdots \\ &+ V_k^T\rho _{k-1}s_{k-1}s_{k-1}^TV_k\\ &+ \rho _ks_ks_k^T \end{align*}" alt="" />
这样在L-BFGS算法中。不再保存完整的
H_k" title="H_k" alt="" />。而是存储向量序列和
。须要矩阵
时,使用向量序列
\left&space;\{&space;s_k&space;\right&space;\}" title="\left \{ s_k \right \}" alt="" style="font-family:KaiTi_GB2312; font-size:18px" />和计算就能够得到。而向量序列
和
也不是全部都要保存,仅仅要保存最新的
步向量就可以。
四、L-BFGS算法中的方向的计算方法
五、实验仿真
lbfgs.py
#coding:UTF-8 from numpy import *
from function import * def lbfgs(fun, gfun, x0):
result = []#保留终于的结果
maxk = 500#最大的迭代次数
rho = 0.55
sigma = 0.4 H0 = eye(shape(x0)[0]) #s和y用于保存近期m个,这里m取6
s = []
y = []
m = 6 k = 1
gk = mat(gfun(x0))#计算梯度
dk = -H0 * gk
while (k < maxk):
n = 0
mk = 0
gk = 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 = n
break
n = n + 1 #LBFGS校正
x = x0 + rho ** mk * dk
#print x #保留m个
if k > m:
s.pop(0)
y.pop(0) #计算最新的
sk = x - x0
yk = gfun(x) - gk s.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 * qk for 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 + 1
x0 = x
result.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 result n = len(result)
ax = plt.figure().add_subplot(111)
x = arange(0, n, 1)
y = result
ax.plot(x,y) plt.show()
实验结果
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZ29vZ2xlMTk4OTAxMDI=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="" />
參考文献
优化算法——拟牛顿法之L-BFGS算法的更多相关文章
- 拟牛顿法/Quasi-Newton,DFP算法/Davidon-Fletcher-Powell,及BFGS算法/Broyden-Fletcher-Goldfarb-Shanno
拟牛顿法/Quasi-Newton,DFP算法/Davidon-Fletcher-Powell,及BFGS算法/Broyden-Fletcher-Goldfarb-Shanno 转载须注明出处:htt ...
- 最优化算法【牛顿法、拟牛顿法、BFGS算法】
一.牛顿法 对于优化函数\(f(x)\),在\(x_0\)处泰勒展开, \[f(x)=f(x_0)+f^{'}(x_0)(x-x_0)+o(\Delta x) \] 去其线性部分,忽略高阶无穷小,令\ ...
- 牛顿法与拟牛顿法学习笔记(四)BFGS 算法
机器学习算法中经常碰到非线性优化问题,如 Sparse Filtering 算法,其主要工作在于求解一个非线性极小化问题.在具体实现中,大多调用的是成熟的软件包做支撑,其中最常用的一个算法是 L-BF ...
- 模拟退火算法SA原理及python、java、php、c++语言代码实现TSP旅行商问题,智能优化算法,随机寻优算法,全局最短路径
模拟退火算法SA原理及python.java.php.c++语言代码实现TSP旅行商问题,智能优化算法,随机寻优算法,全局最短路径 模拟退火算法(Simulated Annealing,SA)最早的思 ...
- Fundebug 微信小程 BUG 监控插件更新至 1.2.1,优化错误上报次数的限制算法,新增 silentHttpHeader 配置选项
摘要: 1.2.1优化错误上报次数的限制算法,新增silentHttpHeader配置选项,请大家及时更新哈! Fundebug提供专业的微信小程序 BUG 监控服务,可以第一时间为您捕获生存环境中小 ...
- Machine Learning 算法可视化实现2 - Apriori算法实现
目录 关联分析 Apriori原理 Apriori算法实现 - 频繁项集 Apriori算法实现 - 从频繁项集挖掘关联规则 一.关联分析 关联分析是一种在大规模数据集中寻找有趣关系的任务. 这些关系 ...
- 数据结构和算法(Golang实现)(23)排序算法-归并排序
归并排序 归并排序是一种分治策略的排序算法.它是一种比较特殊的排序算法,通过递归地先使每个子序列有序,再将两个有序的序列进行合并成一个有序的序列. 归并排序首先由著名的现代计算机之父John_von_ ...
- Linux系统编程【3.2】——ls命令优化版和ls -l实现
前情提要 在笔者的上一篇博客Linux系统编程[3.1]--编写ls命令中,实现了初级版的ls命令,但是与原版ls命令相比,还存在着显示格式和无颜色标记的不同.经过笔者近两天的学习,基本解决了这两个问 ...
- 基于改进人工蜂群算法的K均值聚类算法(附MATLAB版源代码)
其实一直以来也没有准备在园子里发这样的文章,相对来说,算法改进放在园子里还是会稍稍显得格格不入.但是最近邮箱收到的几封邮件让我觉得有必要通过我的博客把过去做过的东西分享出去更给更多需要的人.从论文刊登 ...
随机推荐
- python-生成器迭代器及递归调用
生成器是一个可迭代的对象,它的执行会记住上一次返回时在函数体中的位置.对生成器第二次(或第 n 次)调用跳转至该函数上次执行位置继续往下执行,而上次调用的所有局部变量都保持不变. 生成器的特点:1.生 ...
- 带线表格据gt生成无线表格
json解析练习,python图像处理练习,表格包围框毛刺问题待解决. # -*- coding: utf-8 -*- # coding: utf-8 from PIL import Image, I ...
- 双网卡只有一个能ping通的解决办法
来源:http://blog.csdn.net/centerpoint/article/details/38542719 Linux默认启用了反向路由检查 如果2个网卡在一个Lan里面,那么服务器可能 ...
- [oldboy-django][5python基础][内置函数]zip
python3中,把两个或两个以上的迭代器封装成生成器,在循环遍历生成器中,不断产生元组. 如果提供的迭代器长度不对等,生成器的长度为最短迭代器的长度. # coding= utf-8 # zip 多 ...
- 利用js生成二维码
$('#barcode').qrcode({ width: 300, height: 300, render: !!document.createElement('canvas').getContex ...
- Linux主机系统目录误操作权限修改为777修复方法
ECS Linux中,如果意外误操作将/目录权限批量设置,比如chmod -R 777 / ,系统中的大部分服务以及命令将无法使用,这时候可以通过系统自带的getfacl命令来拷贝和还原系统权限,修复 ...
- CDOJ 1256 二维前缀和处理
昊昊喜欢运动 他NN 天内会参加MM 种运动(每种运动用一个[1,m][1,m] 的整数表示) 舍友有QQ 个问题 问昊昊第ll 天到第rr 天参加了多少种不同的运动 Input 输入两个数NN , ...
- chrome浏览器警告:Failed to decode downloaded font:
使用iconfont字体时chrome报错 Failed to decode downloaded font: 在服务器设置一下自己定义MIME类型. 扩展名: .woff Mime类型:applic ...
- 股票交易(bzoj 1855)
Description 最近lxhgww又迷上了投资股票,通过一段时间的观察和学习,他总结出了股票行情的一些规律. 通过一段时间的观察,lxhgww预测到了未来T天内某只股票的走势,第i天的股票买入价 ...
- sql2008百万级数据排除重复信息
--高性能排除重复select userid from table where userid in ( select userid from ( select userid, row_number() ...