一、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算法的更多相关文章

  1. 拟牛顿法/Quasi-Newton,DFP算法/Davidon-Fletcher-Powell,及BFGS算法/Broyden-Fletcher-Goldfarb-Shanno

    拟牛顿法/Quasi-Newton,DFP算法/Davidon-Fletcher-Powell,及BFGS算法/Broyden-Fletcher-Goldfarb-Shanno 转载须注明出处:htt ...

  2. 最优化算法【牛顿法、拟牛顿法、BFGS算法】

    一.牛顿法 对于优化函数\(f(x)\),在\(x_0\)处泰勒展开, \[f(x)=f(x_0)+f^{'}(x_0)(x-x_0)+o(\Delta x) \] 去其线性部分,忽略高阶无穷小,令\ ...

  3. 牛顿法与拟牛顿法学习笔记(四)BFGS 算法

    机器学习算法中经常碰到非线性优化问题,如 Sparse Filtering 算法,其主要工作在于求解一个非线性极小化问题.在具体实现中,大多调用的是成熟的软件包做支撑,其中最常用的一个算法是 L-BF ...

  4. 模拟退火算法SA原理及python、java、php、c++语言代码实现TSP旅行商问题,智能优化算法,随机寻优算法,全局最短路径

    模拟退火算法SA原理及python.java.php.c++语言代码实现TSP旅行商问题,智能优化算法,随机寻优算法,全局最短路径 模拟退火算法(Simulated Annealing,SA)最早的思 ...

  5. Fundebug 微信小程 BUG 监控插件更新至 1.2.1,优化错误上报次数的限制算法,新增 silentHttpHeader 配置选项

    摘要: 1.2.1优化错误上报次数的限制算法,新增silentHttpHeader配置选项,请大家及时更新哈! Fundebug提供专业的微信小程序 BUG 监控服务,可以第一时间为您捕获生存环境中小 ...

  6. Machine Learning 算法可视化实现2 - Apriori算法实现

    目录 关联分析 Apriori原理 Apriori算法实现 - 频繁项集 Apriori算法实现 - 从频繁项集挖掘关联规则 一.关联分析 关联分析是一种在大规模数据集中寻找有趣关系的任务. 这些关系 ...

  7. 数据结构和算法(Golang实现)(23)排序算法-归并排序

    归并排序 归并排序是一种分治策略的排序算法.它是一种比较特殊的排序算法,通过递归地先使每个子序列有序,再将两个有序的序列进行合并成一个有序的序列. 归并排序首先由著名的现代计算机之父John_von_ ...

  8. Linux系统编程【3.2】——ls命令优化版和ls -l实现

    前情提要 在笔者的上一篇博客Linux系统编程[3.1]--编写ls命令中,实现了初级版的ls命令,但是与原版ls命令相比,还存在着显示格式和无颜色标记的不同.经过笔者近两天的学习,基本解决了这两个问 ...

  9. 基于改进人工蜂群算法的K均值聚类算法(附MATLAB版源代码)

    其实一直以来也没有准备在园子里发这样的文章,相对来说,算法改进放在园子里还是会稍稍显得格格不入.但是最近邮箱收到的几封邮件让我觉得有必要通过我的博客把过去做过的东西分享出去更给更多需要的人.从论文刊登 ...

随机推荐

  1. git+jenkins持续集成一:git上传代码

    先注册一个账号,注册地址:https://github.com/ 记住地址 下载git本地客户端,下载地址:https://git-scm.com/download/win 一路next傻瓜安装,加入 ...

  2. 使用anaconda

    Please run $ source /opt/anaconda/bin/activate root    $ source /opt/anaconda/bin/deactivate root to ...

  3. Spring Cloud Feign 简单入门

    Feign是一个生命是的web service 客户端,使用方式非常简单:接口+注解,spring cloud feign 对feign惊醒了增强使它支持了spring mcv注解. 示例(以下示例结 ...

  4. REDIS基础笔记

    Redis基础笔记 资源链接 简介 简介 安装 五种数据类型及相应命令 1. 字符串类型 2. 散列类型 3. 列表类型 4. 集合类型 5. 有序集合 其他 事务 SORT 生存时间 任务队列 发布 ...

  5. POJ 3368:Frequent values(线段树区间合并)

    题目大意,给出一段非降序列,求一些区间中出现频率最高的数的出现次数. 分析: 显然,区间中一个数多次出现必然是连续的,也就是最长的连续相等的一段. 用线段树解决,维护三个信息:一个区间最长连续的区间的 ...

  6. 习题:过路费(kruskal+并查集+LCA)

    过路费  [问题描述]在某个遥远的国家里,有 n 个城市.编号为 1,2,3,…,n.这个国家的政府修 建了 m 条双向道路,每条道路连接着两个城市.政府规定从城市 S 到城市 T 需 要收取的过路费 ...

  7. 抓取js动态生成数据

    最近在抓数据,一般的网页数据抓取相对容易一些,今天在抓电视猫的节目单,发现有些数据时抓取不到的,Java端得到的HTML文件里面没有某一段代码,查了很多资料,发现说是js动态生成的数据,无法直接抓取, ...

  8. 节点流——FileInputStream&FileOutputStream

    import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import ja ...

  9. vue中scoped vs css modules

    注意:此文是默认你已经具备scoped和css modules的相关基础知识,所以不做用法上的讲解. 在vue中,我们有两种方式可以定义css作用域,一种是scoped,另一种就是css module ...

  10. cxGrid让指定的某行自动呈选选中的状态

    cxView.ViewData.Rows[cxView.DataController.DataSource.DataSet.RecNo-1].Selected := True;//将当前的行呈选中的状 ...