R中的CVX-esque凸优化?

时间:2013-04-26 18:54:08

标签: r optimization convex-optimization

我需要解决(很多次,对于大量数据,以及其他一些事情)我认为归结为second order cone program。它可以用CVX这样的东西简洁地表达出来:

cvx_begin
    variable X(2000);
    expression MX(2000);
    MX = M * X;
    minimize( norm(A * X - b) + gamma * norm(MX, 1) )
  subject to
    X >= 0
    MX((1:500) * 4 - 3) == MX((1:500) * 4 - 2)
    MX((1:500) * 4 - 1) == MX((1:500) * 4)
cvx_end

显示的数据长度和等式约束模式只是来自某些测试数据的任意值,但一般形式将大致相同,有两个客观术语 - 一个最小化错误,另一个鼓励稀疏 - 以及大量对优化变量的转换版本的元素的等式约束(本身被约束为非负)。

这看起来效果非常好,比我之前的方法好得多,后者捏造了腐烂的限制。麻烦的是,围绕这一切的所有其他事情都发生在R中,将它移植到Matlab将是非常麻烦的。那么在R中这样做是否可行,如果是这样的话?

这实际上归结为两个不同的问题:

1)这有什么好的R资源吗?据我所知CRAN task page,SOCP包选项为CLSCOPDWD,其中包括SOCP解算器作为其分类器的附件。两者都具有相似但相当不透明的接口,并且在文档和示例上有点薄,这使我们得以:

2)在这些包使用的约束块格式中表示上述问题的最佳方法是什么?上面的CVX语法隐藏了很多关于额外变量等等的繁琐工作,我可以看到自己花费试图做到这一点,所以任何提示或指针都要朝着正确的方向推动我非常欢迎......

3 个答案:

答案 0 :(得分:2)

您可能会发现R包CVXfromR很有用。这允许您将优化问题从R传递给CVX并将解决方案返回到R.

答案 1 :(得分:1)

好的,所以对这个问题的简短回答是:在R中处理这个问题确实没有非常令人满意的方法。我最终在Matlab中做了相关的部分,两个系统之间有一些尴尬的捏造,并且可能会迁移一切最终到了Matlab。 (我目前的方法早于user2439686发布的答案。在实践中,使用CVXfromR我的问题同样尴尬,但它看起来确实看起来像一个有用的包,所以我将接受这个答案。)

R的资源非常薄,但他在评论中提到的blog post by Vincent Zoonekynd绝对值得一读。

R包DWD中包含的SOCP解算器是从Matlab求解器SDPT3(减去SDP部分)移植的,因此编程接口基本相同。但是,至少在我的测试中,它的运行速度要慢很多,并且在几千个变量+约束的问题上几乎都会出现问题,而SDPT3会在几秒钟内解决它们。 (我没有对此做过完全公平的比较,因为CVX对问题进行了一些精彩的转换以使其更有效,而在R中我使用了一个非常天真的定义,但仍然。)

另一种可能的选择,特别是如果您有资格获得学术许可,则使用具有R接口包Mosek的商业Rmosek解算器。我还没试过这个,但可能会在某个时候试一试。

(顺便说一句,与CVX捆绑在一起的另一个求解器SeDuMi完全没有遇到同样的问题;当他们建议尝试多个求解器时,CVX的作者并不是在开玩笑。而且,在很大一部分案例中,SDTP3必须从Cholesky切换到LU分解,这使得处理数量级更慢,与LU前的步骤相比,目标只有非常小的改进。我发现值得降低请求的精度以避免这种情况,但是YMMV。)

答案 2 :(得分:1)

有一个新选择:CVXR,来自同一个人。  有一个website,一个paper和一个github project

训练有素的凸面编程似乎越来越受欢迎,观察cvxpy(Python)和Convex.jl(朱莉娅)再次受到同一个人的支持。