【问题标题】:How to properly use scipy.optimize.minimize for function returning integer如何正确使用 scipy.optimize.minimize 函数返回整数
【发布时间】:2014-01-03 07:55:20
【问题描述】:

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?

【问题讨论】:

  • 随机网格搜索或brute force
  • 是的,这基本上就是我现在正在做的事情......我希望有更好的东西!该函数相当平滑,只是整数值
  • 只需阅读您发布的链接@behzad.nouri - 也许我可以为此创建一个递归网格搜索...
  • 听起来您的函数对不同区域有钳位值。也许您可以索引这些区域,因为它是可识别的,并在索引上进行整数编程?
  • @Mai 不太清楚你的意思。该函数有一个整数返回值,但参数可以取任意浮点值,所以不是整数问题。

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


【解决方案1】:

一般来说,整数空间的最小化是一个完全不同的领域,称为整数规划(或离散优化)。添加整数约束实际上会产生很多算法困难,导致连续方法不适合。查看scipy.optimize.anneal

【讨论】:

  • 不,这不是整数问题。它是一个返回int的函数,但参数是浮点数。
  • 好的,很公平。我误读了这个问题。尽管如此,大多数传统的优化技术都不适用于逐步函数。
  • 一个随机的想法:启发式地,您可以应用一些足够广泛的平滑技术来消除非最小平坦区域。
  • 是的,我想是的。我想我可以通过在估计导数时以某种方式强制它使用非常大的步骤来模拟这种效果。我想知道这是否可能......
  • 我似乎在 scipy 文档中找不到任何参数,你知道是否存在吗?
猜你喜欢
  • 1970-01-01
  • 2022-01-18
  • 2019-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-18
  • 2018-07-23
相关资源
最近更新 更多