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

Python 如何正确使用scipy.optimize.minimize函数返回整数,python,machine-learning,scikit-learn,mathematical-optimization,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

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

我已经恢复到手动绘图来探索空间,但是我想引入更多的参数,所以如果我能让这个工作正常,那就太好了

我试图最小化的函数不能返回浮点。它计算交叉验证的成功点击数,我让优化器更改模型上的参数

有什么想法吗

更新


发现了一个类似的问题:

一般来说,整数空间上的最小化是一个完全不同的领域,称为整数规划(或离散优化)。整数约束的添加实际上造成了相当多的算法困难,使得连续方法不适合。查看

随机网格搜索,或者是的,这就是我目前正在做的事情。。。我希望有更好的!该函数相当平滑,只需整数值就可以了。请阅读您发布的链接@behzad.nouri-也许我可以为此创建一个递归网格搜索…听起来您的函数对不同区域具有钳制值。也许你可以索引这些区域,因为它们很容易识别,然后对索引进行整数规划?@Mai不太清楚你的意思。函数有一个整数返回值,但是参数可以接受任何浮点值,所以这不是一个整数问题。不,这不是一个整数问题。这是一个返回int的函数,但是参数是浮点型的。好吧,很公平。我误解了这个问题。尽管如此,大多数传统的优化技术不适用于逐步函数。一个随机的想法:启发式地,你可以应用一些足够广泛的平滑技术来消除非最小平坦区域。是的,我想是这样的。我想我可以通过某种方式来模拟这种效应,迫使它在估计导数时使用非常大的步长。我想知道这是否可能…我在scipy文档中似乎找不到任何参数,你知道是否存在?