Bayesian Optimization贝叶斯优化(代码详解)

前言

  • bayesian-optimization是一个基于贝叶斯推理和高斯过程的约束全局优化包,它试图在尽可能少的迭代中找到未知函数的最值。该技术特别适合优化高成本函数。Github项目地址

  • 贝叶斯优化的工作原理是构建函数的后验分布(高斯过程),以最好地描述要优化的函数。随着观察次数的增加,后验分布得到改善,算法可以更确定参数空间中的哪些区域值得探索,哪些区域不值得探索。随着不断迭代,算法会根据对目标函数的了解来平衡探索和利用的需求。在每个step中,高斯过程都会拟合已知样本(探索过的点),后验分布与探索策略(如UCB(置信上限)或EI(预期改进))相结合,用于确定下一个应该探索的点。

  • 关于贝叶斯优化参数的完整体系,大家可以参考通俗科普文:贝叶斯优化与SMBO、高斯过程回归、TPE

  • 在进行解析之前,大家需要先从githubbayesian-optimization包的代码下载,然后将项目文件夹中的bayes_opt文件夹单独拿出来,放入一个新的文件夹下,比如我的新文件夹名bayes,则项目文件树为:

-bayes
	-bayes_opt
    	-__init__.py
        -acquisition.py
        -bayesian_optimization.py
        -...
  • 然后我们在项目文件夹下新建一个示例代码demo_bayes.py,则项目文件树为:
-bayes
	-bayes_opt
    	-__init__.py
        -acquisition.py
        -bayesian_optimization.py
        -...
    -demo_bayes.py
  • pycharm中打开demo_bayes.py文件,填入下面内容:
from bayes_opt import BayesianOptimization


def black_box_function(x, y):
    return -(x**2) - (y - 1) ** 2 + 1


pbounds = {
   
   "x": (2, 4), "y": (-3, 3)}

optimizer = BayesianOptimization(
    f=black_box_function,
    pbounds=pbounds,
    random_state=1,
)

optimizer.maximize(
    init_points=2,
    n_iter=3,
)

  • 上面的代码中,函数black_box_function()是我们要优化的目标函数,pbounds变量是xy的定义域,optimizer变量实例化了一个BayesianOptimization类,传入了目标函数,变量定义域和随机数种子,optimizer调用maximize方法,表示我们现在希望最大化该目标函数,init_points参数为用于构建后验分布的初始点个数,n_iter表示执行贝叶斯优化的次数。
  • 运行一下demo_bayes.py文件,看看控制台是否输出如下过程:
|   iter    |  target   |     x     |     y     |
-------------------------------------------------
| 1         | -7.135    | 2.834     | 1.322     |
| 2         | -7.78     | 2.0       | -1.186    |
| 3         | -7.11     | 2.218     | -0.7867   |
| 4         | -12.4     | 3.66      | 0.9608    |
| 5         | -6.999    | 2.23      | -0.7392   |
=================================================

关键代码解析

  • 确认demo_bayes.py文件运行没有问题以后,我们先进入BayesianOptimization类,按住Ctrl,点击BayesianOptimization类,跳转到bayes_opt/bayesian_optimization.py文件,我们主要关注初始化函数:
class BayesianOptimization(Observable):
    def __init__(self,
                 f,
                 pbounds,
                 acquisition_function=None,
                 constraint=None,
                 random_state=None,
                 verbose=2,
                 bounds_transformer=None,
                 allow_duplicate_points=False):
        self._random_state = ensure_rng(random_state)
        self._allow_duplicate_points = allow_duplicate_points
        self._queue = Queue()

        if acquisition_function is None:
            if constraint is None:
                # 默认探索策略为UCB(置信上限)
                self._acquisition_function = acquisition.UpperConfidenceBound(kappa=2.576, random_state
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

羽星_s

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值