【发布时间】:2020-01-01 06:57:10
【问题描述】:
考虑以下问题:
import numpy
import scipy.optimize
def f(x):
return (x[0] == 1)*(x[1] + 2)**2 - (x[0] == 0)*(x[1] + 1)**2
kwargs = {
'method': 'trust-constr',
'jac': False,
'bounds': [(0, 1), (0, 1)],
}
m = scipy.optimize.minimize(f, numpy.array([1, 0]), **kwargs).x
print(m)
# [0.91136811 0.19026955] <- wrong result
我想在空间上优化这个功能
x[0] \in {0,1}x[1] \in [0,1]
有什么方法可以指定 x[0] 不应该是一个实际值(即,[0,1] 行上的一个值),而只能是 0 或 1?
我目前的做法是执行 N 次优化,每个 x[0] 选项一个。问题是,如果有多个分类变量,这会迅速爆发。
【问题讨论】:
-
也许你可以看看
hyperopt包。但请检查它是否满足您对精度和性能的需求。我认为它主要是为机器学习中的超参数优化而创建的,其中精度可能不是最大的问题。在 hyperopt 中,您可以将一些值定义为离散的(甚至是分类的),而其他值是连续的。 -
一般方法是混合整数非线性规划(例如 Couenne)。但是这是否可行取决于很多细节。
标签: python scipy scipy-optimize-minimize