http://www.alglib.net/optimization/lbfgs.php
在这个网址能够下到alglib库,里面包含很多方法,有多个版本的,其中有LBFGS的方法
http://www.alglib.net/translator/man/manual.cpp.html#unit_minlbfgs
这个页面有对minlbfgs subpackage的详细介绍以及给了的两个例子
minlbfgs subpackage包括两个类:minlbfgsreport minlbfgsstate
函数有:minlbfgscreate minlbfgsoptimize minlbfgsrestartfrom minlbfgsresults
minlbfgsresultsbuf minlbfgssetcholeskypreconditioner minlbfgssetcond
minlbfgssetdefaultpreconditioner minlbfgssetstpmax minlbfgssetxrep
函数说明:
minlbgfscreate:
用户使用:
1、初始化算法的状态调用函数MinLBFGSCreate()
2、调整参数调用函数MinLBFGSSetCond() MinLBFGSSetStpMax()及其他参数
3、调用函数MinLBFGSOptimize()计算F/G
4、调用MinLBFGSResults()得到结果
5、选择性调用:MinLBFGSRestartFrom()解决另一个问题,问题同样为N/M,但是以另一个指针和功能函数开始
输入参数:
N-问题规模
M-BFGS算法中要求的海塞矩阵更新数,3<=M<=7 M<=N
x-初始化结果估计值 N维
输出参数:
state-存储算法状态
注意:
1、通过MinLBFGSSetCond()函数调整停止条件
2、如果目标函数包括exp()或者其他快增长的功能函数,优化算法可能导致溢出,使用MinLBFGSSetStpMax()函数限制算法的步长,然而,L-BFGS算法很少需要这样的调整
void alglib::minlbfgscreate()(
ae_int_t m,
real_1d_array x,
minlbfgsstate &state);
void alglib::minlbfgscreate()(
ae_int_t n,
ae_int_t m,
real_1d_array x,
minlbfgsstate &state);
minlbfgsoptimize function:
state-算法状态
grad-调用计算函数计算在点x的函数和梯度值
rep-选择性的调用,每次迭代后调回,可以设置为NULL
ptr-选择性使用的指针,可以为NULL
void minlbfgsoptimize(
minlbfgstate &state,
void (*grad)(const real_1d_array &x, double &func, real_1d_array &grad, void *ptr),
void *ptr = NULL);
minlbfgsrestartfrom function:
state-同上
x-新的开始指针
void alglib::minlbfgsrestartfrom(minlbfgsstate state, real_1d_array x);
minlbfgsresults function:
input:
state-算法状态
output:
x-结果,0~(n-1)
rep-优化反馈--- 结束类型:
*-2有最优解 *-1制定了不正确的参数 *1相关函数的改进只是epsF
*2相关步长只是EpsX *4梯度规范化只是EpsG *5 使用MaxIts步长
*7停止约束太过严格,还有提升的空间
--- 迭代次数
---函数值
void alglib::minlbfgsresults(
minlbfgsstate state,
real_1d_array &x,
minlbfgsreport &rep);
minlbfgsresultsbuf function:
用于为X[]提前申请缓冲区存储,如果buffer的大小过小能够重新设置大小。函数主要是为了用于解决循环算法内部的因为循环导致向量的重定位太过庞大
void alglib::minlbfgsresultsbuf(
minlbfgsstate state,
real_1d_array &x,
minlbfgsreport &rep);
minlbfgssetcholeskypreconditioner function:(设置乔姆斯基运行条件)
条件的修正:海塞矩阵的估计需要用到乔姆斯基的因式分解
input:
state-同上
p-三角的调节器,海塞矩阵的估计的乔姆斯基因式分解向量[0..N-1, 0..N-1]
IsUpper-高级或者低级P是否给定
void alglib::minlbfgssetcholeskypreconditioner(
minlbfgsstate state,
real_2d_array p,
bool isupper);
minlbfgssetcond function:
设置L-BFGS优化算法的停止条件
input:
state-同上
EpsG->=0 如果满足条件||G||<EpsG 则子程序终止返回 G为梯度
EpsF->=0 如果满足条件|F(k+1)-F(k)|<=EpsF*max{|F(k)|,|F(k+1)|,1}
EpsX->=0 如果满足条件在k+1次迭代后,|X(k+1)-X(k)|<=EpsX则子程序终止返回
MaxIts-最大迭代次数,如果为0,则不限制迭代次数
如果EpsG=0, EpsF=0, EpsX=0 且 MaxIts=0 则使用默认设置
void alglib::minlbfgssetcond(
minlbfgsstate state,
double epsg,
double epsf,
double epsx,
ae_int_t maxits);
minlbfgssetdefaultpreconditioner function:
条件调整函数,使用默认条件设置
input:
state-同上
void alglib::minlbfgssetdefaultpreconditioner(minlbfgsstate state);
minlbfgssetstpmax function:
设置最大步长
input:
state-同上
StpMax-最大步长,>=0,设置0.0即为默认不限制步长
当函数包括exp等快速增长的函数时需要设置防止溢出
void alglib::minlbfgssetstpmax(minlbfgsstate state, double stpmax);
minlbfgssetxrep function:
函数调整输出report
input:
state-同上
NeedXRep-report是否需要,true则调用rep()
void alglib::minlbfgssetxrep(minlbfgsstate state, bool needxrep);