我在R中使用nloptr,但是,由于要获得最佳解决方案,我想给我的模型更多的自由,并避免过度拟合。我已经在这个问题的前面描述了我的问题:
nloptr(x0, eval_f, eval_grad_f = NULL, lb = NULL, ub = NULL,
eval_g_ineq = NULL, eval_jac_g_ineq = NULL, eval_g_eq = NULL,
eval_jac_g_eq = NULL, opts = list(), ... )
基本上我要解决一个非线性问题。我有一个最小化函数和一些非线性约束。但我不想使用发现的最佳解决方案,因为它过度适合示例数据并为我提供了极高的价值。因此,我想找到N个最佳解决方案,然后选择我想要的解决方案。
所以现在我想知道是否有一种方法可以找到nloptr在迭代过程中找到的N个最佳解决方案。除了nloptr之外,还有其他方法可以这样做吗?
这实际上不是答案,而是长篇评论,希望对您有所帮助。
我同意@tonytonov的观点,您应该更好地定义“次优”和您的一般需求。无论如何,要获得N个彼此之间不很接近的不同解决方案,我将迭代运行nloptr,每次使用略有不同的目标函数,每次都增加接近先前解决方案的代价。这是一个例子:
sols = list()
evalf= list(eval_f)
for (i in 1:N) {
sols[i] = nloptr(x0,evalf[[i]],...)
# now creating a new evaluation function which adds a log(distance) penalty to the
# last solution
evalf[[i+1]] = function(x) {evalf[[i]](x)-log(sum((x-sols[i]$solution)^2))}
}
您当然可以想到一个不同的惩罚,其想法是对非常接近现有解决方案的地方增加一个很大的惩罚,但是一旦您与之相距较远(您应该知道,足够远意味着什么-这是特定于上下文的),惩罚相对平稳,因此不会影响原始的最低分数。您当然应该检查最后一个解决方案是否存在,并且可能将起点(x0)从一次迭代更改为另一次迭代,但是我认为您已经明白了。
更一般而言,当您尝试避免过度拟合时,我会首先考虑在评估函数中添加一个惩罚。例如,回归分析中过度拟合的标志是系数的大小,因此通常在确定回归估计时尝试不最小化误差的平方根(典型的OLS方法),而是最小化误差的平方根。系数之和(以某种方式进行归一化),这会产生对小系数的偏爱,从而降低了过拟合的可能性。
对于您的特定问题,我知之甚少,但是也许您可以提出一些“惩罚”功能,当最小化该功能时,它将减少过拟合。
如果您的eval_f依赖于数据,另一种方法是使用相同的评估函数,但依赖于数据的引导子样本。每次您获得不同的最小值(由于样本不同)。您将获得N个这样的解决方案,您可以将它们平均化,或者执行任何您想生成非过度拟合解决方案的操作(现在,该解决方案不会过度拟合数据,因为每个解决方案都基于数据的不同部分)。
希望对您有所帮助。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句