【发布时间】: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