2

我正在尝试做一些物理实验,以找到优化某些参数的公式。通过物理实验,我的意思是我有一个化学工作台,我将材料混合在一起,然后测量该配方的特性。从历史上看,我使用过传统的 DOE,但我需要加快时间来获得理想的配方。我知道单纯形优化,但我有兴趣尝试贝叶斯优化。我发现 GPyOpt 声称(甚至在 SO Tag 描述中)支持物理实验。但是,尚不清楚如何启用这种行为。

我尝试过的一件事是通过 收集用户输入input,我想我可以挑选优化器和函数,但这感觉很笨拙。在下面的示例代码中,我使用了 GPyOpt 示例中的函数,但我必须输入实际值。

from GPyOpt.methods import BayesianOptimization
import numpy as np


# --- Define your problem
def f(x):
    return (6*x-2)**2*np.sin(12*x-4)


def g(x):
    print(f(x))
    return float(input("Result?"))


domain = [{'name': 'var_1', 'type': 'continuous', 'domain': (0, 1)}]

myBopt = BayesianOptimization(f=g,
                              domain=domain,
                              X=np.array([[0.745], [0.766], [0], [1], [0.5]]),
                              Y=np.array([[f(0.745)], [f(0.766)], [f(0)], [f(1)], [f(0.5)]]),
                              acquisition_type='LCB')
myBopt.run_optimization(max_iter=15, eps=0.001)

所以,我的问题是,使用 GPyOpt 进行物理实验的预期方式是什么?

4

1 回答 1

4

一些东西。

首先,设置f=None. 请注意maximize=True,如果您碰巧使用它,这会导致 BO 对象忽略 。

其次,与其使用run_optimization,不如使用suggest_next_locations。前者运行整个优化,而后者只运行一次迭代。此方法返回一个带有参数组合(“位置”)的向量,以便在实验室中进行测试。

第三,您需要对批量大小做出一些决定。您获得的组合/位置的数量由batch_size您用于初始化 BayesianOptimization 对象的参数控制。采集函数的选择在这里很重要,因为有些函数与 1 的 batch_size 密切相关。如果您需要更大的批次,那么您需要阅读文档以了解适合您情况的组合(例如acquisition_type=EIevaluator_type=local_penalization.

第四,您需要明确管理迭代之间的数据。至少有两种方法可以解决这个问题。一种是腌制 BO 对象并向其添加更多数据。我认为更优雅的另一种方法是每次都创建一个全新的 BO 对象。实例化它时,您将新数据连接到旧数据,然后在整个集合上运行一次迭代(同样,使用suggest_next_locations)。如果您使用 BO 优化计算机中的功能,这可能有点疯狂,但考虑到化学步骤可能有多慢,这可能是最干净的(并且更容易进行中途修正。)

希望这可以帮助!

于 2019-11-28T04:23:04.217 回答