numpy 多维向量的贝叶斯优化

gj3fmq9x  于 12个月前  发布在  其他
关注(0)|答案(2)|浏览(102)

我在尝试使用贝叶斯优化包(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,).


我不知道如何解决这个问题,非常感谢你的帮助。

y3bcpkx1

y3bcpkx11#

这里的贝叶斯优化适用于多个标量参数和这个包,不支持你的向量实现。同样,边界是在每个参数上定义的,而不是在向量上定义的。你可以这样做:

labels = ["x0", "x1", "x2", ...]
pbounds = {"x0": (-2, 2), "x1": (-2, 2), ... "x9": (-2, 2)}

字符串
此外,您需要修改函数以接受关键字参数而不是 vector 参数。

def black_box_func(x0, x1, x2, ...)


为了让这个过程不那么冗长,你可以在你的函数中使用 * kwargs* 和一些dict来将标签Map到它们的索引。

7xzttuei

7xzttuei2#

random.uniform可以使用数组(或列表)作为范围值,以及大小。它试图使用广播来合并它们的效果。
对于1个随机值的简单情况:

In [24]: np.random.uniform(0,1,size=1)
Out[24]: array([0.28895633])

字符串
但如果我给予一个列表作为范围,但只要求一个数字,我会遇到你这样的错误:

In [25]: np.random.uniform(0,[1,2,3],size=1)
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
Cell In[25], line 1
----> 1 np.random.uniform(0,[1,2,3],size=1)

File mtrand.pyx:1154, in numpy.random.mtrand.RandomState.uniform()

File _common.pyx:600, in numpy.random._common.cont()

File _common.pyx:518, in numpy.random._common.cont_broadcast_2()

File _common.pyx:245, in numpy.random._common.validate_output_shape()

ValueError: Output size (1,) is not compatible with broadcast dimensions of inputs (3,).


我必须要求3,以匹配范围(或省略大小):

In [26]: np.random.uniform(0,[1,2,3],size=3)
Out[26]: array([0.3200877 , 1.24087871, 2.57545154])


你的错误发生在导入包的深处,所以我不能很容易地跟踪问题uniform参数回到你的输入。我相信你正在设置一些参数形状,如(1,10)或(10,10)。

In [27]: pbounds = {'vector': (-2*np.ones(10), 2*np.ones(10))}

In [28]: pbounds
Out[28]: 
{'vector': (array([-2., -2., -2., -2., -2., -2., -2., -2., -2., -2.]),
  array([2., 2., 2., 2., 2., 2., 2., 2., 2., 2.]))}

相关问题