2014-02-27 25 views
2

我在R中使用nloptr但是,我想给我的模型更自由,因为最好的解决方案并避免过度拟合。我描述了我的问题早in this question使用nloptr查找N个最佳解决方案

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个最佳解决方案,然后选择我想要的解决方案。

所以现在我想知道有没有找到N个最佳解决方案的方法,其中nloptr在迭代过程中发现。除nloptr之外,还有其他方法吗?

+0

“第二最佳解决方案”的定义是什么?最低的局部最小值不是全局最小值?或者某个点接近全球最低点,但不是当地最低点?还要别的吗?这里需要一些严格的定义。不过,我明白你的意图。 – tonytonov

+0

@tonytonov在我的情况下,它并不重要。它可以是任何一组解决方案,它比起始值提供更优化的解决方案。据我所知,'nloptr'经历了多次迭代找到最优解,因此我想知道是否可以取N个最好的(最接近最终解决方案)。谢谢 – mm441

+1

只是一个选择:随机启动并调整opts:限制迭代次数或收敛容差,你会得到接近但希望不同的解决方案。 – tonytonov

回答

2

这不是一个真正的答案,而是一个长期的评论,我希望这会有所帮助。

我同意@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)从一次迭代更改为另一次,但是我认为您明白了这一点。

更一般地说,当您尝试避免过度拟合时,我会首先考虑在您的eval函数中添加一个惩罚。例如,回归分析中过拟合的一个标志是系数的大小,因此在确定回归估计时,通常尽量减小误差的平方根(典型的OLS方法),而是误差的平方根+系数总和(以某种方式归一化),这些系数创建了对小系数的偏好,从而降低了过拟合的可能性。

我对你的具体问题知之甚少,但也许你可以想出一些“惩罚”函数,当最小化时会减少过度拟合。

如果您的eval_f依赖于数据,另一种方法是使用相同的评估函数,但使用数据的引导子样本。每次你得到一个不同的最小值(因为样本不同)。您可以得到N个这样的解决方案,并且您可以对它们进行平均或做任何想要生成非过度配合解决方案(现在解决方案不会过度配合数据,因为每个解决方案都基于数据的不同部分)。

我希望它有帮助。

+0

好主意,我不得不说! – tonytonov