我需要解决(很多时候,对于大量数据,以及一堆其他事情)我认为归结为二阶锥程序的问题。它可以在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 包选项是CLSCOP和DWD,其中包括一个 SOCP 求解器作为其分类器的附件。两者都有相似但相当不透明的界面,并且文档和示例有点薄,这使我们能够:
2)在这些包使用的约束块格式中表示上述问题的最佳方式是什么?上面的 CVX 语法隐藏了很多繁琐的额外变量等问题,我可以看到自己花了数周时间试图做到这一点,所以任何提示或指示将我推向正确的方向都会非常受欢迎......