6

我需要解决(很多时候,对于大量数据,以及一堆其他事情)我认为归结为二阶锥程序的问题。它可以在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 任务页面中可以看出,SOCP 包选项是CLSCOPDWD,其中包括一个 SOCP 求解器作为其分类器的附件。两者都有相似但相当不透明的界面,并且文档和示例有点薄,这使我们能够:

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

4

3 回答 3

2

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

于 2013-05-31T08:43:06.507 回答
1

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

这方面的 R 资源非常稀少,但他在评论中提到的 Vincent Zoonekynd 的博客文章绝对值得一读。

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

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

(顺便说一句,与 CVX 捆绑的另一个求解器 SeDuMi 在同一个问题上完全失败;当 CVX 作者建议尝试多个求解器时,他们并不是在开玩笑。此外,在很大一部分情况下,SDTP3 必须从 Cholesky 切换到 LU 分解,这使得处理速度变慢了几个数量级,与预 LU 步骤相比,目标只有非常微小的改进。我发现降低要求的精度以避免这种情况是值得的,但是 YMMV。)

于 2013-05-31T11:30:34.580 回答
1

有一个新的替代方案:CVXR,它来自同一个人。有一个网站、一篇论文和一个github 项目

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

于 2018-01-11T14:21:47.723 回答