optim() 的高维优化替代方案

High dimensional optimization alternatives for optim()

我已经使用非标准(分段线性)成本函数为 optim 实现了包装函数,并针对此成本函数进行了优化。 (考虑 lm,但将成本函数最小二乘替换为自定义函数。)

这个过程对于低维模拟数据非常有效。然而,我的数据(不幸的是我不能分享)是相对高维的(~100 列,没有常量列)。

使用这个高维数据,优化参数与其初始值相差 ~0.001(或多或少取决于所使用的方法),即使使用参数 control = list(maxit = 5000) 并尝试所有已实现的优化 methods:

optim(par = c(mean(b), rep(0, ncol(A) - 1)), fn = costFn, A = A, b = b, method = "CG", control = list(maxit = 5000)) 这里 A 是预测变量矩阵,b 是因变量,costFn 定义为

costFn <- function(A, par, b) {
    sum(
      wPlus * pmax(A %*% par - b, 0)
      + wMinus * pmax(b - A %*% par, 0)
    )
  }

具有常量 wPluswMinus > 0。

我觉得这个过程对于 5000 次迭代(< 2 秒)来说终止得太快了。

被视为函数R->R的成本函数是凸函数,输入是预测变量和因变量的线性组合,因此它也应该是凸函数R^n->R。因此,这些方法应该收敛到全局最小值(而不是因为没有其他方法而陷入局部最小值)。如果我在这里错了,请纠正我。

我的问题是我是否似乎犯了一个明显的错误(我知道这很难说,因为我无法提供 reprex)或者是否有更好的选择 optim.

可能的错误包括:

这是不可微分的,因此您可以预料到基于梯度的本地 NLP 求解器会遇到麻烦。但是,您所拥有的是 L1 范数或 LAD 回归的轻微概括:

 min sum(k, |r[k]|)
 r = Ax - b 
 r, x free variables 

这基本上是您 wPlus=wMinus = 1 的问题。这个 L1 问题可以表示为线性规划 (LP) 模型如下:

min sum(k, rPlus[k] + rMin[k])
rPlus - rMin = Ax - b
rPlus[k],rMin[k]>=0
x free variable

在 R 下使用的 LP 求解器很容易获得。

我们在这里使用的建模技术称为变量拆分 [link]。在最佳解决方案中,每对 (rPlus[k],rMin[k]) 中只有一个是非零的。

我们可以将此公式用于您的问题,只需稍微调整 objective 即可:

min sum(k, wPlus*rPlus[k] + wMin*rMin[k])
rPlus - rMin = Ax - b
rPlus[k],rMin[k]>=0
x free variable

具有许多变量和许多约束的 LP 问题可以使用一个好的 LP 求解器非常有效地解决。