首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GpyOpt忽略约束。指定它们的正确方法是什么?

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

Stack Overflow用户
提问于 2018-03-20 17:06:51
回答 1查看 880关注 0票数 2

我想在GpyOpt中运行一个受限的优化。比如说,我想把

哪里

s.t.至少有一个

是非零的,并且不超过3可以等于1。所以我指定约束:

基于参考手册这里,我们似乎可以使用numpy函数指定约束。并建议这里在调用BayesianOptimization时指定约束。因此,我使用以下代码在GpyOpt中表达了这一点

代码语言:javascript
复制
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忽略了这些约束,因为我在控制台中获得了以下输出:

代码语言:javascript
复制
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[:])不能解决这个问题。

我使用Python3.6.3和numpy 1.14.2以及通过pip安装的GPyOpt 1.2.1。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-03-22 11:55:17

我不确定你是不是在总结x的正确性。约束表达式应该在整个X上工作,并输出每个数据点的值数组,然后每个值都根据约束进行检查。

当我将两个表达式中的求和改为:

代码语言:javascript
复制
np.sum(x, axis=1)

如果您的代码完全完好无损,则输出如下:

代码语言:javascript
复制
1.0 2.0 1.0 2.0 2.0 2 2 2 2 1 2 2 1 2 1

没有违规行为。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49390243

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档