问题描述
我已经使用非标准(分段线性)成本函数并针对此成本函数进行了优化,为optim
实现了包装函数。 (请考虑lm
,但用cost函数将最小二乘替换为自定义函数。)
此过程对于低维模拟数据非常有效。但是,我的数据(不幸的是我无法共享)是相对较高的维度(〜100列,没有固定的列)。
使用此高维数据,即使使用参数control = list(maxit = 5000)
并尝试所有已实现的优化{{1},优化参数与初始值相差〜0.001(或多或少取决于所使用的方法)。 }} s:
method
这里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
> 0。
我觉得此过程终止的速度太快,无法进行5000次迭代(
被视为函数R-> R的成本函数是凸的,而输入是预测变量和因变量的线性组合,因此它也应被凸为函数R ^ n-> R。因此,这些方法应收敛到全局最小值(并且不会陷入局部最小值,因为没有其他最小值)。如果我错了,请纠正我。
我的问题是,我是否似乎犯了一个明显的错误(由于我无法提供代表,所以我很难知道这个错误),或者是否有wMinus
以外的替代方法。
解决方法
这是不可微的,因此您可以期望基于梯度的局部NLP求解器会遇到麻烦。但是,您对L1-norm或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])
中只有一个为非零。
我们可以通过稍微调整目标来使用此公式来解决您的问题:
min sum(k,wPlus*rPlus[k] + wMin*rMin[k])
rPlus - rMin = Ax - b
rPlus[k],rMin[k]>=0
x free variable
使用好的LP解算器可以非常有效地解决具有很多变量和许多约束的LP问题。