前言
-
bayesian-optimization是一个基于贝叶斯推理和高斯过程的约束全局优化包,它试图在尽可能少的迭代中找到未知函数的最值。该技术特别适合优化高成本函数。Github项目地址 -
贝叶斯优化的工作原理是构建函数的后验分布(高斯过程),以最好地描述要优化的函数。随着观察次数的增加,后验分布得到改善,算法可以更确定参数空间中的哪些区域值得探索,哪些区域不值得探索。随着不断迭代,算法会根据对目标函数的了解来平衡探索和利用的需求。在每个
step中,高斯过程都会拟合已知样本(探索过的点),后验分布与探索策略(如UCB(置信上限)或EI(预期改进))相结合,用于确定下一个应该探索的点。 -
关于贝叶斯优化参数的完整体系,大家可以参考通俗科普文:贝叶斯优化与SMBO、高斯过程回归、TPE
-
在进行解析之前,大家需要先从
github将bayesian-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变量是x和y的定义域,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

&spm=1001.2101.3001.5002&articleId=140637562&d=1&t=3&u=801c816ed9544b54b3cc2ab03bac882a)
8491

被折叠的 条评论
为什么被折叠?



