优化算法——拟牛顿法之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版源代码)
其实一直以来也没有准备在园子里发这样的文章,相对来说,算法改进放在园子里还是会稍稍显得格格不入.但是最近邮箱收到的几封邮件让我觉得有必要通过我的博客把过去做过的东西分享出去更给更多需要的人.从论文刊登 ...
随机推荐
- Java学习2
final在修饰类时,并不限制用户修改对象包含的变量值,只是限制了对象的主转移,只能针对某一个对象进行操作,中途不可更改对象. 重写父类的方法 重写(Override)和重载(Overload)都是针 ...
- leetcode NO.349 两个数组的交集 (python实现)
来源 https://leetcode-cn.com/problems/intersection-of-two-arrays/ 题目描述 给定两个数组,写一个函数来计算它们的交集. 例子: 给定 nu ...
- PAT1021
给定一个k位整数N = dk-1*10k-1 + ... + d1*101 + d0 (0<=di<=9, i=0,...,k-1, dk-1>0),请编写程序统计每种不同的个位数字 ...
- BZOJ 3990: [SDOI2015]排序(搜索+剪枝)
[SDOI2015]排序 Description 小A有一个1-2^N的排列A[1..2^N],他希望将A数组从小到大排序,小A可以执行的操作有N种,每种操作最多可以执行一次,对于所有的i(1< ...
- 求中位数为K的区间的数目
给定一个长为 $n$ 的序列和常数 $k$,求此序列的中位数为 $k$ 的区间的数量.一个长为 $m$ 的序列的中位数定义为将此序列从小到大排序后第 $\lceil m / 2 \rceil$ 个数. ...
- 【CCF】 Markdown 模拟
#include<iostream> #include<cstdio> #include<string> #include<cstring> #incl ...
- 上传图片获取base64位编码
function loadImg(){ //获取文件 ].files[]; //创建读取文件的对象 var reader = new FileReader(); //创建文件读取相关的变量 var i ...
- 《挑战程序设计竞赛》P196 铺砖问题
题意:给定n*m格子,每个格子被染成了黑色或者白色,现在要用1*2的砖块覆盖这些格子,块与块不得重叠,且覆盖所有的白色格子,但不覆盖任意一个黑色格子,求一共有多少种覆盖方法. 思路:书上给的思路太巧妙 ...
- Mysql EXISTS NOT EXISTS
SELECT c.CustomerId, CompanyName FROM Customers c WHERE EXISTS( SELECT OrderID FROM Orders o WHERE o ...
- Nim积
假如把Nim游戏的取胜规则改为谁取走最后一个石子谁输的话 先手必胜当且仅当: 1.所有堆的石子数都为1且游戏的SG值为0 2.有些堆的石子数大于1且游戏的SG值不为0