非线性优化库liblbfgs初探
- liblbfgs简介
- Linux下用gcc 编译
- Windows下用visual studio编译
- main函数分析
- python 封装liblbfgs
liblbfgs简介
liblbfgs是L-BFGS算法的C语言实现,用于求解非线性优化问题。
liblbfgs的主页:http://www.chokkan.org/software/liblbfgs/
下载链接(见上面的主页链接):
- https://github.com/downloads/chokkan/liblbfgs/liblbfgs-1.10.tar.gz 用于Linux平台
- https://github.com/chokkan/liblbfgs
用于Windows平台
Linux下用gcc 编译
解压文件,进入目录,可参照 软件包里面的说明文档,命令依次如下:
./configure
make
make install
编译后的目录文件:
C源码文件在
lib
,include
和sample
三个文件夹里,而主文件在’sample’ 里,其目录如下:其中没有文件后缀名的文件
sample
就是最终的可执行文件,运行:
Windows下用visual studio编译
只需要把几个C/C++源码文件加入到项目即可,其余的文件一律弃之不用,如下图所示的VS项目文件的目录,我们只要
4
个头文件 arithmetic_ansi.h, arithmetic_sse_double.h, arithmetic_sse_float.h, lbfgs.h 和三个源文件
lbfgs.c, sample.c, sample.cpp。主函数文件(包含main函数)是 sample.c(用C语言写的),和 sample.cpp(用C++写成,封装成一个类)。一个VS项目里只能有一个main函数,所以每次运行要禁用二者中的一个。
需要注意的是头文件中的 arithmetic_ansi.h, arithmetic_sse_double.h, arithmetic_sse_float.h,三个头文件只能用一个,选择哪个由’lbfgs.cpp’中一段代码控制,该段代码如下:
默认情况下
USE_SSE
、__SSE2__
、__SSE__
都没有定义,L-BFGS_FLOAT
在 lbfgs.h中定义。由此可知默认情况下采用的是 arithmetic_ansi.h 。若要采用 arithmetic_sse_double.h,经查
L-BFGS_FLOAT
被定义为 64,所以再定义其它两个变量,如下:SSE2到底是什么东西呢?插入一段相关介绍:
SSE2(Streaming SIMD Extensions 2):指令集,扩展了SSE指令集,并可完全取代MMX。SSE2指令集是Intel公司在SSE指令集的基础上发展起来的。相比于SSE,SSE2使用了144个新增指令,扩展了MMX技术和SSE技术,提高了诸如MPEG-2、MP3、3D图形等应用程序的运行性能。在整数处理方面,随MMX技术引进的SIMD整数指令从64位扩展到了128 位,使SIMD整数类型操作的执行效率成倍提高;在浮点数处理方面,双精度浮点SIMD指令允许以 SIMD格式同时执行两个浮点操作,提供双精度操作支持有助于加速内容创建、财务、工程和科学应用。除SSE2指令之外,最初的SSE指令也得到增强,通过支持多种数据类型(例如双字、四字)的算术运算,支持灵活、动态范围更广的计算功能。
可见引入 arithmetic_sse_double.h 或 arithmetic_sse_float.h 是为了提高浮点数的运算速度,改善程序性能。
main函数分析
main函数里给出了一个用L-BFGS算法进行非线性优化的例子,贴出main函数的代码:
#include <stdio.h> #include "lbfgs.h"//注意lbfgsfloatval_t在lbfgs.h里定义,32位机上是float,64位机上是double。//evaluate定义要优化的非线性函数fx及其梯度g static lbfgsfloatval_t evaluate( void *instance,const lbfgsfloatval_t *x,lbfgsfloatval_t *g,const int n,const lbfgsfloatval_t step) {int i;lbfgsfloatval_t fx = 0.0;for (i = 0;i < n;i += 2) {lbfgsfloatval_t t1 = 1.0 - x[i];lbfgsfloatval_t t2 = 10.0 * (x[i+1] - x[i] * x[i]);g[i+1] = 20.0 * t2;g[i] = -2.0 * (x[i] * g[i+1] + t1);fx += t1 * t1 + t2 * t2;}return fx; }//progress函数每次迭代结束就执行一次,打印迭代信息 static int progress(void *instance,const lbfgsfloatval_t *x,const lbfgsfloatval_t *g,const lbfgsfloatval_t fx,const lbfgsfloatval_t xnorm,const lbfgsfloatval_t gnorm,const lbfgsfloatval_t step,int n,int k,int ls) {printf("Iteration %d:\n", k);printf(" fx = %f,", fx);printf(" xnorm = %f, gnorm = %f, step = %f\n", xnorm, gnorm, step);return 0; }#define N 100 //参数个数int main(int argc, char *argv[]) {int i, ret = 0;lbfgsfloatval_t fx;lbfgsfloatval_t *x = lbfgs_malloc(N); //x是长度为N的数组lbfgs_parameter_t param;if (x == NULL) {printf("ERROR: Failed to allocate a memory block for variables.\n");return 1;}/* Initialize the variables. */for (i = 0;i < N;i += 2) {x[i] = -1.2;x[i+1] = 1.0;}/* Initialize the parameters for the L-BFGS optimization. */lbfgs_parameter_init(¶m);/*param.linesearch = LBFGS_LINESEARCH_BACKTRACKING;*//*Start the L-BFGS optimization; this will invoke the callback functionsevaluate() and progress() when necessary.*/ret = lbfgs(N, x, &fx, evaluate, progress, NULL, ¶m);printf("算法收敛后的函数取值 fx = %f\n", fx, x[0], x[1]);printf("最终的解(长度为100个浮点数的数组):");for(i=0;i<N;i++) {if (i%10 == 0) {printf("\n");}printf("%2.2lf ",x[i]);}lbfgs_free(x); //释放参数数组所占的内存return 0; }
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
非线性函数f(x)f(x) 的定义如下:
for (i = 0;i < n;i += 2) {lbfgsfloatval_t t1 = 1.0 - x[i];lbfgsfloatval_t t2 = 10.0 * (x[i+1] - x[i] * x[i]);g[i+1] = 20.0 * t2;g[i] = -2.0 * (x[i] * g[i+1] + t1);fx += t1 * t1 + t2 * t2; }
- 1
- 2
- 3
- 4
- 5
- 6
- 7
可知输入参数 有100个,即数组 xx定义如下
f(x)=∑i=0,2,4,...,N−2(1−xi)2+(10(xi+1−x2i))2f(x)=∑i=0,2,4,...,N−2(1−xi)2+(10(xi+1−xi2))2python 封装liblbfgs
- pylbfgs 用Python封装的 liblbfgs
https://github.com/larsmans/pylbfgs - PyLBFGS
https://github.com/sseemayer/PyLBFGS/blob/master/test.py
转载自:https://blog.csdn.net/golden1314521/article/details/46772569?utm_source=blogxgwz2
非线性优化库liblbfgs初探相关推荐
- Ceres Solver 非线性优化库
Ceres Solver 非线性优化库 1. Ceres Solver 2. 下载安装 3. 简易例程 4. 环境运行 5. 非线性拟合 1. Ceres Solver Ceres solver 是谷 ...
- Ceres Solver: 高效的非线性优化库(二)实战篇
Ceres Solver: 高效的非线性优化库(二)实战篇 接上篇: Ceres Solver: 高效的非线性优化库(一) 如何求导 Ceres Solver提供了一种自动求导的方案,上一篇我们已经看 ...
- 非线性优化库Ceres问题记录
项目场景: 非线性优化库Ceres中的log_severity.h文件中提示: #error : ERROR macro is defined. Define GLOG_NO_ABBREVIATED_ ...
- eigen库安装_四足机器人优化方法:Webots下Eigen与qpOASES非线性优化库环境搭建
在最小二乘法一章节中我给出了基于matlab仿真下的手推最小二乘解方法,最终采用广义法能将任意多组数据求最小二乘解转换为求取固定矩阵元素平均值的形式从而避免数据增长带来的计算量增大: https:// ...
- MySQL-数据库监控初探
文章目录 生猛干货 官方文档 监控指标 数据库可用性监控 如何确认数据库是否可以通过网络连接? 如何确认数据库是否可读写 如何监控数据库的连接数 max_connections | Threads_c ...
- php gd 坐标,【PHP】GD库笔记 初探GD库的坐标
昨天在用GD库的imagettftext在图片上写字的时候,发现写字的坐标并不是很精确的按照指定的参数的位置插入字体的,一直觉得很诡异.由于GD库中很多画图操作都是以坐标为基础的,因而就花了点时间了解 ...
- 在windows系统中使用Ceres非线性优化库:(一)安装Ceres库
(一)安装Ceres库 1.用vcpkg安装Ceres库 1.1.安装vcpkg 1.2.安装Ceres 1.3.配置C ...
- java puppeteer生成pdf_puppeteer库入门初探
puppeteer 是一个Chrome官方出品的headless Chrome node库.它提供了一系列的API, 可以在无UI的情况下调用Chrome的功能, 适用于爬虫.自动化处理等各种场景 根 ...
- ceres非线性优化库-安装
官方安装教程:http://www.ceres-solver.org/installation.html 安装包:http://ceres-solver.org/ceres-solver-2.0.0. ...
最新文章
- 2021年大数据常用语言Scala(二十八):scala面向对象 MAVEN依赖和类
- 技术图文:如何利用C# 实现 Prim 最小生成树算法?
- 在Eclipse的DDMS中查找genymotion模拟器的sdcard中的文件---开发中遇到的问题(一)
- ASP.NET Core 查看应用状态和统计
- matlab零相移滤波,零相移数字滤波器边界效应讨论(附程序与参考文献)
- ubuntu下修改mysql编码,使能支持中文
- Could not install packages due to an EnvironmentError: [WinError 5] 拒绝访问
- 来自山西机器人乐队_冰山上的机器人X三十禁放映 | 庞宽、李霄云对谈预告
- SCRF的简介及防护手段
- Spring : @Value注解
- 概率论与数理统计(一)—— 联合概率、条件概率与边缘概率
- 疯狂工作流讲义(第2版)基于Activiti6.x电子书
- Gstreamer插件编译安装的Makefile
- 计算机vb题库程序代码编写,计算机二级考试.题库-vb程序题
- 关于Shine-hale
- 纯css实现简单的页面视差滚动
- 仪表框架 3500/05-01-01-00/HONEYWELL51403776-100
- 全网最全的qt连接mysql的应用,学生信息管理系统(展示全部代码)
- 设某种二叉树有如下特点:每个结点要么是叶子结点,要么有2棵子树。假如一棵这样的二叉树中有m(m0)个叶子结点,那么该二叉树上的结点总数为( )。
- Flutter——Flutter初探与Dart基础
热门文章
- 容器编排技术 -- Kubernetes 给容器和Pod分配内存资源
- BlockChain:区块链入门课程 -- 区块链应用于能源 POWER LEDGER案例
- Use Visual Studio Code to create and run Transact-SQL scripts for SQL Server
- android 存储方式简书,Android的多种数据存储方式
- centos7搭建easy-mock服务
- 高性能异步批量ping的golang实现
- 04737 c++ 自学考试2019版 第二章课后程序设计题 2
- 无痕模式_无痕网络导航
- mysql 与oracle 批量插入的 sql 总结
- Spark 入门系列-简介以及生态