如何让 fminsearch 只搜索整数?

How to let fminsearch only search over integers?

我正在使用 Matlab 的 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 收敛速度是否很快?

你不能告诉 fminsearch 只考虑整数。它使用的算法不适合离散优化,离散优化通常比连续优化难得多。

如果整数参数的合理值相对较少,您可以将它们全部循环,但这可能太昂贵了。或者您可以编写自己的一维离散优化函数,并让它为它尝试的整数参数的每个值调用 fminsearch。 (例如,您可以模仿一些标准的一维连续优化算法,并且只要 return 一旦找到一个参数值比它的两个邻居都好。)您很可能能够调整此功能针对您要解决的特定问题。

正如@Gareth McCaughan 所说,您不能告诉 fminsearch 将搜索 space 限制为整数。如果要搜索可以处理此类问题的求解器,则要搜索 "mixed integer programming." 混合整数用于部分连续、部分整数规划。 "programming" 是优化的行话(非常令人困惑的名称,但就像 QWERTY 键盘一样,我们坚持使用它)。

请注意,整数规划通常是 NP 难的!更大的问题可能完全无法解决。

在我处理的情况下,我寻找一个满足 健康)状况。 矢量索引是正整数。 我为 fminsearch 所做的解决方法是对误差函数进行插值。假设,fminsearch 建议将 5.1267 作为新索引。然后我计算了索引 5 和 6 的误差函数并返回了一个插值。这导致了稳定和令人满意的结果。

Holger.Lindow@plr-magdeburg.de