GpyOpt 忽略约束。指定它们的正确方法是什么?
GpyOpt ignores constraints. What is the correct way to specify them?
我想 运行 在 GpyOpt
中进行约束优化。说,我想最小化
其中
s.t。至少有一个 是 non-zero 并且,不超过 3 个可以等于 1。所以我指定约束:
根据参考手册here, it looks like we can specify constraints using numpy
function. And here建议我们可以在对BayesianOptimization
的调用中指定约束条件。所以我用下面的代码
在 GpyOpt
中表达了这一点
import numpy as np
import GPyOpt
from GPyOpt.methods import BayesianOptimization
seed = 6830
np.random.seed(seed)
def f(x):
print(np.sum(x[:]), end=" ") # check if constraints are satisfied
z = np.sum(x)
return z**2
bounds = [{"name": "x", "type" : "discrete",
"domain" : (0, 1), "dimensionality": 10}]
constraints = [{'name' : 'more_than_0','constraint' : '-np.sum(x[:]) + 0.1'},
{'name' : 'less_than_3','constraint' : 'np.sum(x[:]) - 3'}]
bopt = BayesianOptimization(f, domain=bounds, constraints=constraints)
bopt.run_optimization(max_iter=10)
但是,看起来 GpyOpt
忽略了这些限制,因为我在控制台中得到以下输出:
6.0 1.0 5.0 7.0 3.0 2.0 2.0 0.0 1.0 3.0 1.0 1.0 1.0 0.0 2.0
其中包含大于 3 的值和 0。
如果我将 np.sum(x[:])
明确写为 x[:, 0] + x[:, 1] + ...
,行为不会改变。
如果我指定连续域,仍然违反约束。
传递约束以使其不被忽略的正确方法是什么?
我正在使用 GpyOpt
版本 1.2.1。
更新:
np.sum(x, 1)
而不是 np.sum(x[:])
不能解决问题。
我正在使用 Python 3.6.3 以及通过 pip 安装的 numpy 1.14.2 和 GPyOpt 1.2.1。
我不确定你总结的 x 是否正确。约束表达式应该在整个 X 上工作,并为每个数据点输出一个值数组,然后每个数据点都根据约束进行检查。
当我将两个表达式中的求和更改为:
np.sum(x, axis=1)
并保持您的代码完整无缺,输出为:
1.0 2.0 1.0 2.0 2.0 2 2 2 2 1 2 2 1 2 1
没有违规。
我想 运行 在 GpyOpt
中进行约束优化。说,我想最小化
其中
s.t。至少有一个 是 non-zero 并且,不超过 3 个可以等于 1。所以我指定约束:
根据参考手册here, it looks like we can specify constraints using numpy
function. And here建议我们可以在对BayesianOptimization
的调用中指定约束条件。所以我用下面的代码
GpyOpt
中表达了这一点
import numpy as np
import GPyOpt
from GPyOpt.methods import BayesianOptimization
seed = 6830
np.random.seed(seed)
def f(x):
print(np.sum(x[:]), end=" ") # check if constraints are satisfied
z = np.sum(x)
return z**2
bounds = [{"name": "x", "type" : "discrete",
"domain" : (0, 1), "dimensionality": 10}]
constraints = [{'name' : 'more_than_0','constraint' : '-np.sum(x[:]) + 0.1'},
{'name' : 'less_than_3','constraint' : 'np.sum(x[:]) - 3'}]
bopt = BayesianOptimization(f, domain=bounds, constraints=constraints)
bopt.run_optimization(max_iter=10)
但是,看起来 GpyOpt
忽略了这些限制,因为我在控制台中得到以下输出:
6.0 1.0 5.0 7.0 3.0 2.0 2.0 0.0 1.0 3.0 1.0 1.0 1.0 0.0 2.0
其中包含大于 3 的值和 0。
如果我将 np.sum(x[:])
明确写为 x[:, 0] + x[:, 1] + ...
,行为不会改变。
如果我指定连续域,仍然违反约束。
传递约束以使其不被忽略的正确方法是什么?
我正在使用 GpyOpt
版本 1.2.1。
更新:
np.sum(x, 1)
而不是 np.sum(x[:])
不能解决问题。
我正在使用 Python 3.6.3 以及通过 pip 安装的 numpy 1.14.2 和 GPyOpt 1.2.1。
我不确定你总结的 x 是否正确。约束表达式应该在整个 X 上工作,并为每个数据点输出一个值数组,然后每个数据点都根据约束进行检查。
当我将两个表达式中的求和更改为:
np.sum(x, axis=1)
并保持您的代码完整无缺,输出为:
1.0 2.0 1.0 2.0 2.0 2 2 2 2 1 2 2 1 2 1
没有违规。