TL;DR:如何最小化一个返回整数值(而不是浮点值)的相当平滑的函数
>>> import scipy.optimize as opt
>>> opt.fmin(lambda (x,y): (0.1*x**2+0.1*(y**2)), (-10, 9))
Optimization terminated successfully.
Current function value: 0.000000
Iterations: 49
Function evaluations: 92
array([ -3.23188819e-05, -1.45087583e-06])
>>> opt.fmin(lambda (x,y): int(0.1*x**2+0.1*(y**2)), (-10, 9))
Optimization terminated successfully.
Current function value: 17.000000
Iterations: 17
Function evaluations: 60
array([-9.5 , 9.45])
试图最小化一个接受浮点参数但返回整数的函数,我遇到了一个问题,即求解器立即终止。这种效果在上面的例子中得到了证明——请注意,当返回的值四舍五入为int时,计算会提前终止。
我认为发生这种情况是因为它没有检测到导数的变化,即第一次改变参数时,它所做的改变太小,第一个结果和第二个结果之间的差是0.00000000000,错误地表明已经找到了最小值。
我在optimize.anneal方面运气更好,但尽管它有整数值的返回,我还是在三维中绘制了函数的一些区域,实际上它非常平滑。因此,我希望当一个导数意识最小化会更好地工作。
我已经恢复了手动绘图来探索空间,但我想引入更多的参数,所以如果我能做到这一点,那就太好了。
我试图最小化的函数不能返回浮点值。它计算交叉验证成功命中的次数,我让优化器更改模型上的参数。
有什么想法吗?
更新
发现了一个类似的问题:如何在scipy.optimize函数上强制执行更大的步骤?
通常,整数空间上的最小化是一个完全不同的领域,称为整数规划(或离散优化)。整数约束的添加实际上造成了相当多的算法困难,使连续方法变得不合适。查看scipy.optimize.anneal