2016-04-28 30 views
1

我用Matlab的fminsearch方法來最小化功能:如何讓fminsearch只搜索整數?

c = cvpartition(200,'KFold',10); 
minfn = @(z)kfoldLoss(fitcsvm(cdata,grp,'CVPartition',c,... 
    'KernelFunction','rbf','BoxConstraint',exp(z(2)),... 
    'KernelScale',exp(z(1)))); 
opts = optimset('TolX',5e-4,'TolFun',5e-4); 
[searchmin fval] = fminsearch(minfn,randn(2,1),opts) 

的最小化是在兩個參數。

現在我想以最小化第三個參數,但此參數只能取正整數,即1,2,3,...

我怎麼能告訴fminsearch只考慮正整數?第二,如果我的第三個參數初始化爲10,但它的實際最佳值爲100,那麼fminsearch在這種情況下會快速收斂嗎?

回答

2

你不能告訴fminsearch只考慮整數。它使用的算法不適合離散優化,通常比連續優化困難得多。

如果您的整數參數只有相對較少的合理值,您可以將它們全部循環,但這可能太昂貴。或者你可以製作你自己的一維離散優化函數,並讓它調用fminsearch爲它嘗試的整數參數的每個值。 (例如,你可以模仿一些標準的一維連續優化算法,只要返回一個參數值,比如說它的兩個鄰居都比它好),你就可以適應這個函數的特殊問題你正在努力解決。

+0

從連續優化問題中分離整數看起來不錯。你知道其他1D或nD離散優化程序嗎? – machinery

+0

有很多。是否有任何適合您的特殊需求,我不知道。您可以從離散優化的[Wikipedia頁面](https://en.wikipedia.org/wiki/Discrete_optimization)開始。 –

1

正如@Gareth McCaughan所說,你不能告訴fminsearch將搜索空間限制爲整數。如果您想搜索可解決此類問題的求解器,則需要搜索「混合整數編程」。混合整數用於連續部分整數編程。而「編程」是優化的行話(可怕的名稱混淆,但像QWERTY鍵盤,我們堅持它)。

請注意,整數編程通常是NP-hard!更大的問題可能是完全難以解決的。

0

在我處理的案例中,我查找了一個滿足 條件的向量索引。 vector-Index是正整數。 我做過的fminsearch的解決方法是錯誤函數的插值。假設fminsearch提出5.1267作爲新索引。我計算了索引5和6的誤差函數,並給出了插值。這導致了穩定和令人滿意的結果。

[email protected]