我在尝试使用贝叶斯优化包(https://github.com/fmfn/BayesianOptimization)进行参数优化时遇到了困难。目标函数是输入向量,这是一个10维向量,每个条目都在(-2,2)之间的约束,如下所示。
def black_box_function(vector):
s = 0
for i in range (0, 10):
s = s + vector[i]/(vector[i+1] + vector[i+2])
return s
from bayes_opt import BayesianOptimization
pbounds = {'vector': (-2*np.ones(10), 2*np.ones(10))}
optimizer = BayesianOptimization(
f=black_box_function,
pbounds=pbounds,
verbose=2,
random_state=1,
)
optimizer.maximize(
init_points=2,
n_iter=3,
)
字符串
但它得到了错误:
| iter | target | vector |
-------------------------------------
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
~\AppData\Local\Temp\ipykernel_4116\2141365244.py in <module>
8 )
9
---> 10 optimizer.maximize(
11 init_points=2,
12 n_iter=3,
D:\Code\bayes_opt\bayesian_optimization.py in maximize(self, init_points, n_iter, acquisition_function, acq, kappa, kappa_decay, kappa_decay_delay, xi, **gp_params)
283 self._prime_subscriptions()
284 self.dispatch(Events.OPTIMIZATION_START)
--> 285 self._prime_queue(init_points)
286
287 old_params_used = any([param is not None for param in [acq, kappa, kappa_decay, kappa_decay_delay, xi]])
D:\Code\bayes_opt\bayesian_optimization.py in _prime_queue(self, init_points)
240
241 for _ in range(init_points):
--> 242 self._queue.add(self._space.random_sample())
243
244 def _prime_subscriptions(self):
D:\Code\bayes_opt\target_space.py in random_sample(self)
261 data = np.empty((1, self.dim))
262 for col, (lower, upper) in enumerate(self._bounds):
--> 263 data.T[col] = self.random_state.uniform(lower, upper, size=1)
264 return data.ravel()
265
mtrand.pyx in numpy.random.mtrand.RandomState.uniform()
_common.pyx in numpy.random._common.cont()
_common.pyx in numpy.random._common.cont_broadcast_2()
_common.pyx in numpy.random._common.validate_output_shape()
ValueError: Output size (1,) is not compatible with broadcast dimensions of inputs (10,).
型
我不知道如何解决这个问题,非常感谢你的帮助。
2条答案
按热度按时间y3bcpkx11#
这里的贝叶斯优化适用于多个标量参数和这个包,不支持你的向量实现。同样,边界是在每个参数上定义的,而不是在向量上定义的。你可以这样做:
字符串
此外,您需要修改函数以接受关键字参数而不是 vector 参数。
型
为了让这个过程不那么冗长,你可以在你的函数中使用 * kwargs* 和一些dict来将标签Map到它们的索引。
7xzttuei2#
random.uniform
可以使用数组(或列表)作为范围值,以及大小。它试图使用广播来合并它们的效果。对于1个随机值的简单情况:
字符串
但如果我给予一个列表作为范围,但只要求一个数字,我会遇到你这样的错误:
型
我必须要求3,以匹配范围(或省略大小):
型
你的错误发生在导入包的深处,所以我不能很容易地跟踪问题
uniform
参数回到你的输入。我相信你正在设置一些参数形状,如(1,10)或(10,10)。型