optim() 的高维优化替代方案
High dimensional optimization alternatives for optim()
我已经使用非标准(分段线性)成本函数为 optim
实现了包装函数,并针对此成本函数进行了优化。 (考虑 lm
,但将成本函数最小二乘替换为自定义函数。)
这个过程对于低维模拟数据非常有效。然而,我的数据(不幸的是我不能分享)是相对高维的(~100 列,没有常量列)。
使用这个高维数据,优化参数与其初始值相差 ~0.001(或多或少取决于所使用的方法),即使使用参数 control = list(maxit = 5000)
并尝试所有已实现的优化 method
s:
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)
)
}
具有常量 wPlus
、wMinus
> 0。
我觉得这个过程对于 5000 次迭代(< 2 秒)来说终止得太快了。
被视为函数R->R的成本函数是凸函数,输入是预测变量和因变量的线性组合,因此它也应该是凸函数R^n->R。因此,这些方法应该收敛到全局最小值(而不是因为没有其他方法而陷入局部最小值)。如果我在这里错了,请纠正我。
我的问题是我是否似乎犯了一个明显的错误(我知道这很难说,因为我无法提供 reprex)或者是否有更好的选择 optim
.
可能的错误包括:
- 成本函数实际上不是凸函数,因此算法不会收敛到全局最小值。
- 由于数据是高维的,可能需要多次迭代。也许我没有正确使用
maxit
参数。
- 实现的方法不适用于高维数据。
这是不可微分的,因此您可以预料到基于梯度的本地 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 求解器非常有效地解决。
我已经使用非标准(分段线性)成本函数为 optim
实现了包装函数,并针对此成本函数进行了优化。 (考虑 lm
,但将成本函数最小二乘替换为自定义函数。)
这个过程对于低维模拟数据非常有效。然而,我的数据(不幸的是我不能分享)是相对高维的(~100 列,没有常量列)。
使用这个高维数据,优化参数与其初始值相差 ~0.001(或多或少取决于所使用的方法),即使使用参数 control = list(maxit = 5000)
并尝试所有已实现的优化 method
s:
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)
)
}
具有常量 wPlus
、wMinus
> 0。
我觉得这个过程对于 5000 次迭代(< 2 秒)来说终止得太快了。
被视为函数R->R的成本函数是凸函数,输入是预测变量和因变量的线性组合,因此它也应该是凸函数R^n->R。因此,这些方法应该收敛到全局最小值(而不是因为没有其他方法而陷入局部最小值)。如果我在这里错了,请纠正我。
我的问题是我是否似乎犯了一个明显的错误(我知道这很难说,因为我无法提供 reprex)或者是否有更好的选择 optim
.
可能的错误包括:
- 成本函数实际上不是凸函数,因此算法不会收敛到全局最小值。
- 由于数据是高维的,可能需要多次迭代。也许我没有正确使用
maxit
参数。 - 实现的方法不适用于高维数据。
这是不可微分的,因此您可以预料到基于梯度的本地 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 求解器非常有效地解决。