如何正确使用scipy.optimize.minimize函数返回整数

时间:2013-12-16 01:44:56

标签: python machine-learning scikit-learn mathematical-optimization

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有更好的运气,但是尽管它的整数值返回我已经在三维中绘制了函数的一些区域,它实际上非常平滑。因此,我希望当衍生感知最小化器能够更好地工作时。

我已经恢复了手动绘图以探索空间,但我想介绍一些更多的参数,这样如果我能让它工作就会很棒。

我试图最小化的函数不能返回浮点数。它计算了交叉验证中成功命中的数量,并且我正在让优化器更改模型上的参数。

有什么想法吗?

更新

发现了一个类似的问题:How to force larger steps on scipy.optimize functions?

1 个答案:

答案 0 :(得分:0)

通常,整数空间的最小化是一个完全不同的字段,称为整数编程(或离散优化)。添加整数约束实际上会产生相当多的算法难度,导致连续方法不适合。查看scipy.optimize.anneal