2014-02-27 22 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