SnapVX:基于网络的优化求解器

快照VX是一个基于python的凸优化求解器,用于解决图上定义的问题。对于这种形式的问题,SnapVX提供了一个快速、可扩展的解决方案,并保证了全局收敛。它结合了快照.py使用凸解算器CVXPY公司,并在BSD开放源许可证。

关于SnapVX

SnapVX是一种针对图上定义的问题的凸优化求解器。给定顶点集$\mathcal{V}$和边集$\mathcal{E}$,我们解决了以下优化问题:

$$\mbox{minimize}\sum\limits_{i\in\mathcal{V}}f_i(x_i)+\sum\limits_{(j,k)\in\mathcal{E}}g_{jk}(x_j,x_k)$$

变量为$x_1、x_2、\ldots、x_m$。这里,$x_i\in\mathbb{R}^p$是变量,$f_i$是节点$i$的成本函数$g{jk}$是与无向边$(j,k)$相关联的成本函数。当成本函数为凸函数时,SnapVX提供:

下载和安装

SnapVX的最新版本是0.5(2016年10月)。

下载链接:
单击此处下载。Github源代码在这里.

前提条件:
快照.py
CVXPY公司

说明:
请参阅自述文件有关如何安装和测试SnapVX的说明

在线文档和资源

文档

Github知识库

以下开发存储库可用于SnapVX

邮件列表

注册SnapVX邮件列表,了解最新功能和版本!

其他资源

动机

凸优化已经成为许多不同领域中越来越流行的建模方法。然而,随着数据集变得越来越大、越来越复杂,通常依赖于内点方法的经典凸分析方法由于缺乏可扩展性而开始失败。大规模优化的挑战在于开发足够通用的方法,使其能够独立于输入很好地工作,同时能够扩展到当今应用程序所需的巨大数据集。因此,有必要制定凸优化求解器的一般类,这些类可以应用于各种有趣的相关问题,并开发可靠有效的解决方案的算法。

通过关注$\mbox{minimize}\sum\limits_{i\in\mathcal{V}}f_i(x_i)+\sum\limits_{(j,k)\in\mathcal{E}}g_{jk}(x_j,x_k)$形式的示例,我们可以解决各种常见的优化问题。将大量问题置于统一的框架下有很多好处。这是一个通用的求解器,利用ADMM解决无法使用集中方法计算的太大问题。我们在应用第节。

我们选择构建一个在单个大内存机器上而不是在分布式计算环境中运行的解算器。这有几个原因。首先,它提供了简单性和“现成的”功能,包括能够在标准笔记本电脑上运行以解决较小的问题。其次,在执行大规模数据处理时,大内存机器越来越成为一种可行且价格合理的替代方案。大多数现实世界中的问题都可以轻松地放在单个“大内存”服务器中。即使原始数据不适合,数据清理和操作通常会导致空间的显著减少,从而使相关数据能够适应内存。最后,我们基于ADMM的解决方案是一种消息传递算法,它依赖于许多快速发送的小消息,因此它并不特别适合于大型分布式计算集群(即使完全可以在分布式环境中实现该算法)。

语法

我们展示了三个基本示例来演示如何设置和解决SnapVX问题。另请参阅快照.pyCVXPY公司参考页面,因为SnapVX依赖于它们的语法。第一个设置了一个只有2个节点的基本问题。第二个示例构建了一个具有随机目标的随机图,最后一个示例演示了如何从CSV文件批量加载数据。

示例1。我们首先看一个简单的示例,其中有两个节点,两个节点之间有一条边。这两个节点有不同的目标,都在$\mathbb{R}^1$中,边缘目标惩罚变量差的平方。


进口snapvx公司进口cvxpy公司#注意:没有必要导入cvxpy,因为所有cvxpy功能
#已集成到SnapVX中。这里显示的是详细信息

#创建新图形耶夫勒=snapvx。TGraphVX型()

#使用CVXPY语法定义问题x1个=cvxpy公司。变量(1,名称=“x1”)对象=cvxpy.方形(x1个)
#添加具有给定目标的节点1,约束条件为x1<=10耶夫勒.添加节点(1,目标=对象,约束条件=[x1个<= 10])

#同样,添加目标为|x2+3的节点2|2个=cvxpy公司。变量(1,名称=“x2”)对象2= cvxpy.abs公司(2个+ )耶夫勒.添加节点(2,对象2, [])

#在两个节点之间添加边,
#使用CVXPY语法定义目标和约束耶夫勒.添加边缘(1, 2,目的=cvxpy.方形(cvxpy.norm公司(x1个-2个)),约束条件=[])耶夫勒.解决() #解决问题耶夫勒.打印解决方案() #逐节点打印整个解决方案
打印 “x1=”,x1个.价值, “;x2=”,2个.价值#打印单个变量的解决方案

例2:随机图。接下来,我们看一个稍微大一点的例子。我们构建一个随机图(使用GenRndGnm),将每个节点目标设置为$\mathbb{R}^{10}$中随机点的平方损失,并在边上使用拉普拉斯正则化。


snapvx公司进口 *
进口numpy公司#定义边缘目标的辅助功能
#接受两个节点,返回用这些节点的变量定义的问题
定义拉普拉斯寄存器(型钢混凝土,数据传输系统,数据):
  返回 (平方和(_S)(型钢混凝土[“x”] -数据传输系统[“x”]), [])

#使用SNAP语法生成随机图numpy公司.随机的,随机的.种子(1)num个节点= 10边数(_E)= 30n个= 10快照图形=发电机发电机(PUNG图形,num个节点,边数(_E))耶夫勒=TGraphVX型(快照图形)

#为每个节点添加一个目标(使用随机数据)
对于在里面 范围(num个节点):x个=变量(n个,名称=“x”) #每个节点都有自己的名为“x”的变量=numpy公司.随机的,随机的.兰登(n个)耶夫勒.设置节点目标(,广场(规范(x个-)))

#一次设置所有边缘目标(拉普拉斯正则化)耶夫勒.AddEdge目标(拉普拉斯寄存器)

#在详细模式下求解(使用ADMM)耶夫勒.解决(详细=真的)耶夫勒.打印解决方案()耶夫勒.解决(使用ADMM=False(错误)) #串行求解(无ADMM)耶夫勒.打印解决方案()

#仅打印节点1上“x”的解决方案
打印 “节点1的解决方案是”,耶夫勒.获取节点值(1,“x”)

例3:散装。最后,我们看看如何从文本文件批量加载相关数据


snapvx公司进口 *

#节点目标的助手功能
#从CSV文件中获取一行,返回优化问题
定义节点对象(数据):x个=变量(1,名称=“x”)
  返回规范(x个- 浮动(数据[0]))

#边缘物镜的辅助功能
定义火山灰_reg(型钢混凝土,数据传输系统,数据):
  返回平方和(_S)(型钢混凝土[“x”] -数据传输系统[“x”])

#在边缘列表中加载以构建具有默认节点/边缘目标的图形耶夫勒=加载边缘列表(“BulkLoadEdges.edges”)

#批量加载节点目标:
#获取CSV的一行,将其用作node_obj的输入
#还有一个(可选)输入,用于指定CSV的每一行引用的节点耶夫勒.添加节点目标(“BulkLoadData.csv”,节点对象)

#批量加载所有边缘的边缘目标耶夫勒.AddEdge目标(火山灰_reg)耶夫勒.解决()耶夫勒.打印解决方案()

潜在应用

共识-共识问题通常写成

$$\mbox{minimize\sum\limits_{i}f_i(x)$$

这可以在SnapVX中表示为网络上的问题,其中每个节点具有目标函数$fi(xi)$,但我们只能求解x个作为每个节点的解决方案。我们通过构建任意连通图来解决这个问题(因此从每个节点到所有其他节点至少有一条路径),将每个节点的局部优化变量函数设置为$f_i(x_i)$。然后,我们将边缘目标设置为$\mathbf{1}(x_j=x_k)$。因此,问题变得

$$\mbox{minimize}\sum\limits_{i\in\mathcal{V}}f_i(x_i)+\sum\limits_{(j,k)\in\mathcal{E}}\mathbf{1}(x_j=x_k)$$

正规化-许多类型的正则化是原始SnapVX公式的自然扩展。对于拉普拉斯正则化,将边缘目标设置为$\|x_j-x_k\|_2^2$。网络套索(请参见工具书类)非常相似,只是边缘目标是$xj-xk_2$。

交易所-交换问题定义为$$\开始{align}&\mbox{minimum}和\sum\limits_{i=1}^N f_i(x_i)\\&\mbox{subject to}&\sum\limits_{i=1}^N x_i=0。\结束{对齐}$$要解决此问题,请将所有$N$节点(每个节点都具有目标$f_i(x_i)$)连接到单个虚拟节点。此虚拟节点具有变量$z_1、\ldots、z_N$。每条边都是一个共识约束,$x_i=z_i$,虚拟节点的目标是指示函数$\sum\limits_{i=1}^Nz_i=0$。

控制系统-基本控制系统由更新公式定义$$x^{t+1}=Ax^t+Bu^t$$其中$x$是状态,$u$是输入(我们可以选择),$A、B$是常量矩阵。通常,我们希望通过$N$步骤达到某个状态$x^\star$。我们可以将其建模为线性网络,其中每个$N$步骤都是其自己的节点(节点$i$连接到$i+1$和$i-1$)。每个节点的优化参数是$z_i=(x_i,u_i)$。每条边代表一个约束,$x^{t+1}=Ax^t+Bu^t$。第一个节点有一个约束,即$x_0=x_{\mathrm{init}}$,初始状态和最后一个节点节点$N$受$x_N=x^\star$约束。整体问题如下图所示。从这里开始,很容易添加其他目标和约束来表示其他目标,例如最小化总“燃料使用量”($\|u\|$)或不偏离路径上规定的界限太远。

固定路由-考虑图上的一组路径(例如,通信网络中的流量路由)。每条路由都希望在穿越一系列节点和边缘时最大化其吞吐量,但对每个节点的总允许流量有限制(即路由器每秒只能处理一定数量的数据包)。这通常写成$$\开始{align}&\mbox{最大化}&\sum\limits_{i=1}^N u_i(f_i)\\&\mbox{受制于}&R f \leq c,\结束{对齐}$$其中,$u$是实用函数,$R$是路由矩阵(表示流通过哪些节点的布尔矩阵),$c$是约束向量。我们使用二部图来代替构建整个流网络。此图的一侧包含每个原始节点,另一侧包含每个路由。如果$j$通过$i$(或$R_{ij}=1$),则节点$i$和路由$j$之间有一条边。边表示二部图两侧之间的一致约束。表示路由$i$的节点的节点目标是最大化$u_i(f_i)$。二部图的另一侧表示路由网络中的原始节点,仅具有通过它的流量总和小于$c_i$的约束。

页面排名-PageRank问题可以定义为一个在图上分裂的凸优化问题(有关详细信息:http://jmlr.org/proceedings/papers/v32/glechic14.pdf). SnapVX下载的Examples文件夹中包含一个工作实现。

……还有更多!

贡献者

以下人员对SnapVX做出了贡献(按字母顺序):

斯蒂芬·博伊德
史蒂文·戴蒙德
大卫·哈拉克
朱尔·莱斯科维奇
Youngsuk公园
阿比吉特·沙朗
Rok Sosic公司
克里斯托弗·王

参与

我们鼓励您尝试使用SnapVX来满足您的数据科学和凸优化需求。如果您希望为项目做出贡献,请参阅在这里以获取开放问题和潜在新功能的列表。如果发现任何错误,请报告在这里此外,若要给我们任何其他反馈,请随时发送电子邮件大卫·哈拉克联系一下!

工具书类

SnapVX:一种基于网络的凸优化求解器D.Hallac、C.Wong、S.Diamond、A.Sharang、R.Sosic、S.Boyd、J.Leskovec。机器学习研究杂志, 2017.

相关工作
网络套索:大图的聚类与优化D.Hallac、J.Leskovec和S.Boyd。ACM SIGKDD知识发现和数据挖掘国际会议(KDD), 2015.
网络套索论文中的代码可在github.