python - GpyOpt 忽略约束。指定它们的正确方法是什么?

标签 python optimization constraints bayesian gpyopt

我想在 GpyOpt 中运行约束优化。比如说,我想最小化

哪里

s.t。至少一个是非零,并且不超过 3 可以等于 1。所以我指定约束:

基于引用手册here ,看起来我们可以使用 numpy 函数指定约束。和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

无违规行为。

关于python - GpyOpt 忽略约束。指定它们的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49390243/

相关文章:

iOS:为什么我的 View 需要 x 值约束?

sql-server - 添加检查存储过程是否存在的约束

python - 在 Python 中将嵌套的 JSON 转换为 CSV 文件

python - 对具有字符串和数字的 DataFrame 索引进行排序

validation - 建议更改标记以提高搜索引擎友好性的服务(想想 W3C 验证服务)

mysql - SQL 完整性约束冲突 : 1062 Duplicate entry

python - 将整数转换回 32 位十六进制表示,然后转换为 float ?

python - 从数据湖重命名 Azure Databricks 中的文件时出现问题

python - 高效的字典搜索?

optimization - 使用ElasticSearch Scroll API时,如何现场优化时间参数?