当前位置: 首页 > news >正文

什么是贝叶斯优化(Bayesian Optimization)?

贝叶斯最优化(Bayesian Optimization)是一种用于函数全局最优化的策略,特别适用于那些计算代价昂贵的黑箱函数(如机器学习模型的超参数调优)。其核心思想是通过构建一个代理模型(通常是高斯过程或随机森林),逐步选择最优的参数,从而有效地找到全局最优解。贝叶斯最优化能够在不需要大量计算资源的情况下,有效探索参数空间,具有更高效、更严密的特点。

贝叶斯最优化的原理

  1. 初始采样

    • 随机选择一些参数点,并计算对应的目标函数值。
    • 这些点和目标函数值将用于初始化代理模型。
  2. 构建代理模型

    • 使用高斯过程(Gaussian Process, GP)或随机森林(Random Forest)等方法,构建目标函数的代理模型。高斯过程常用,因为它不仅能预测函数值,还能提供预测不确定性。
  3. 代理模型优化

    • 使用代理模型预测新的参数点的目标函数值和不确定性。
    • 基于这些预测,计算一个采集函数(Acquisition Function),如期望改进(Expected Improvement, EI),上置信界(Upper Confidence Bound, UCB)等。采集函数用来平衡探索(exploration)和开发(exploitation)之间的权衡。
      • 探索:选择那些不确定性较大的点,希望发现新的好点。
      • 开发:选择那些预计目标函数值较好的点,利用已有信息改进最优解。
  4. 更新代理模型

    • 在采集函数的指导下选择下一个参数点,计算其目标函数值。
    • 将新的数据点加入已有的数据集中,更新代理模型。
  5. 重复迭代

    • 重复步骤3和4,逐步缩小参数空间,找到最优参数。
    • 迭代过程在达到预设的迭代次数或收敛条件时结束。

贝叶斯最优化的优势

  1. 高效性

    • 贝叶斯最优化通过代理模型有效地探索参数空间,减少了直接计算目标函数的次数,适合计算昂贵的优化问题。
  2. 平衡探索与开发

    • 通过采集函数,贝叶斯最优化能很好地平衡探索未知区域和利用已知好区域,避免陷入局部最优。
  3. 不确定性量化

    • 高斯过程能提供预测不确定性,这有助于更好地指导采样过程。

应用领域

贝叶斯最优化广泛应用于机器学习中的超参数调优,如:

  • 深度学习模型中的超参数调优(学习率、批量大小、网络结构等)。
  • 机器学习算法(如支持向量机、随机森林等)的参数设置。
  • 强化学习中的策略优化。

总之,贝叶斯最优化在处理高维、非凸、计算代价昂贵的优化问题时,提供了一种高效且严密的方法。

示例

# -*- coding: utf-8 -*-
import numpy as np
import matplotlib.pyplot as plt
from sklearn.gaussian_process import GaussianProcessRegressor
from sklearn.gaussian_process.kernels import Matern
from scipy.optimize import minimize
from scipy.stats import norm# 目标函数:f(x, y) = \sin(x) + \cos(y)
def objective_function(x):return np.sin(x[0]) + np.cos(x[1])# 采集函数:期望改进
def acquisition_function(x, gp, y_max):mean, std = gp.predict(np.array([x]), return_std=True)z = (mean - y_max - 0.01) / stdreturn (mean - y_max - 0.01) * norm.cdf(z) + std * norm.pdf(z)# 绘制目标函数热力图
x = np.linspace(-5, 5, 100)
y = np.linspace(-5, 5, 100)
X, Y = np.meshgrid(x, y)
Z = np.sin(X) + np.cos(Y)plt.figure(figsize=(10, 7))
plt.contourf(X, Y, Z, levels=50, cmap='viridis')
plt.colorbar(label='Objective Function Value')
plt.title('Objective Function Heatmap')
plt.xlabel('x')
plt.ylabel('y')# 初始化随机采样点
initial_points = np.random.uniform(-5, 5, (5, 2))
initial_values = np.array([objective_function(x) for x in initial_points])# 高斯过程模型
kernel = Matern(nu=2.5)
gp = GaussianProcessRegressor(kernel=kernel, n_restarts_optimizer=10)
gp.fit(initial_points, initial_values)# 贝叶斯优化过程
n_iter = 15
for i in range(n_iter):y_max = max(initial_values)res = minimize(lambda x: -acquisition_function(x, gp, y_max), x0=np.random.uniform(-5, 5, 2), bounds=[(-5, 5), (-5, 5)])next_sample = res.xnext_value = objective_function(next_sample)initial_points = np.vstack((initial_points, next_sample))initial_values = np.append(initial_values, next_value)gp.fit(initial_points, initial_values)plt.scatter(next_sample[0], next_sample[1], c='red')plt.scatter(initial_points[:, 0], initial_points[:, 1], c='black', label='Samples')
plt.legend()
plt.show()

这段代码实现了贝叶斯优化算法,用于优化一个二维目标函数 f ( x , y ) = sin ⁡ ( x ) + cos ⁡ ( y ) f(x, y) = \sin(x) + \cos(y) f(x,y)=sin(x)+cos(y)。下面是代码的具体实现步骤及其功能:

代码实现步骤及功能

  1. 导入必要的库

    import numpy as np
    import matplotlib.pyplot as plt
    from sklearn.gaussian_process import GaussianProcessRegressor
    from sklearn.gaussian_process.kernels import Matern
    from scipy.optimize import minimize
    from scipy.stats import norm
    
    • 导入用于数值计算、绘图、构建高斯过程模型和优化的库。
  2. 定义目标函数

    def objective_function(x):return np.sin(x[0]) + np.cos(x[1])
    
    • 目标函数 f ( x , y ) = sin ⁡ ( x ) + cos ⁡ ( y ) f(x, y) = \sin(x) + \cos(y) f(x,y)=sin(x)+cos(y)
  3. 定义采集函数

    def acquisition_function(x, gp, y_max):mean, std = gp.predict(np.array([x]), return_std=True)z = (mean - y_max - 0.01) / stdreturn (mean - y_max - 0.01) * norm.cdf(z) + std * norm.pdf(z)
    
    • 采集函数(期望改进):用于选择下一个采样点,平衡探索和开发。
  4. 绘制目标函数热力图

    x = np.linspace(-5, 5, 100)
    y = np.linspace(-5, 5, 100)
    X, Y = np.meshgrid(x, y)
    Z = np.sin(X) + np.cos(Y)plt.figure(figsize=(10, 7))
    plt.contourf(X, Y, Z, levels=50, cmap='viridis')
    plt.colorbar(label='Objective Function Value')
    plt.title('Objective Function Heatmap')
    plt.xlabel('x')
    plt.ylabel('y')
    
    • 绘制目标函数在二维参数空间中的热力图。
  5. 初始化随机采样点

    initial_points = np.random.uniform(-5, 5, (5, 2))
    initial_values = np.array([objective_function(x) for x in initial_points])
    
    • 随机选择一些初始采样点,并计算其目标函数值。
  6. 构建高斯过程模型

    kernel = Matern(nu=2.5)
    gp = GaussianProcessRegressor(kernel=kernel, n_restarts_optimizer=10)
    gp.fit(initial_points, initial_values)
    
    • 使用高斯过程回归模型拟合初始采样点及其目标函数值。
  7. 贝叶斯优化过程

    n_iter = 15
    for i in range(n_iter):y_max = max(initial_values)res = minimize(lambda x: -acquisition_function(x, gp, y_max), x0=np.random.uniform(-5, 5, 2), bounds=[(-5, 5), (-5, 5)])next_sample = res.xnext_value = objective_function(next_sample)initial_points = np.vstack((initial_points, next_sample))initial_values = np.append(initial_values, next_value)gp.fit(initial_points, initial_values)plt.scatter(next_sample[0], next_sample[1], c='red')plt.scatter(initial_points[:, 0], initial_points[:, 1], c='black', label='Samples')
    plt.legend()
    plt.show()
    
    • 迭代优化过程
      • 每次迭代中,基于当前模型选择下一个采样点。
      • 计算新采样点的目标函数值。
      • 更新采样点和对应的目标函数值。
      • 重新拟合高斯过程模型。
      • 将新采样点绘制在热力图上(红色点表示新的采样点,黑色点表示所有采样点)。
    • 采集函数最小化:选择最大期望改进的点作为下一个采样点。

结果

在这里插入图片描述
这个热力图展示了目标函数 ( f(x, y) = \sin(x) + \cos(y) ) 在二维空间中的值分布。以下是图中的一些要点及其与代码的关系:

热力图的解释

  1. 颜色表示目标函数值

    • 颜色从紫色到黄色,表示目标函数值从低到高。紫色区域表示目标函数值较低的区域,而黄色区域表示目标函数值较高的区域。
    • 图右侧的颜色条显示了目标函数值的范围,从大约 -1.92 到 1.92。
  2. 坐标轴

    • x 轴和 y 轴分别表示参数 ( x ) 和 ( y ) 的取值范围,从 -5 到 5。
    • 这个范围内的每个点都有一个对应的目标函数值 ( f(x, y) ),其大小由图中的颜色表示。
  3. 采样点

    • 图中的黑色点表示采样点,即在优化过程中实际计算了目标函数值的点。
    • 初始的几个采样点是随机选择的,而后续的采样点是通过贝叶斯优化过程选择的。

代码的解释与图结合

代码通过以下步骤生成了这个热力图并选择采样点:

  1. 目标函数的热力图

    • 代码生成了一组 ( x ) 和 ( y ) 值的网格(通过 np.meshgrid),并计算了每个网格点的目标函数值 ( \sin(x) + \cos(y) )。
    • 使用 plt.contourf 绘制目标函数值的等高线图,颜色表示目标函数值的大小。
  2. 初始化随机采样点

    • 初始采样点通过 np.random.uniform 在范围 [-5, 5] 内随机生成,代码中的 initial_pointsinitial_values 保存了这些点及其对应的目标函数值。
    • 图中的一些黑色点表示这些初始采样点。
  3. 高斯过程模型拟合和更新

    • 使用高斯过程回归模型拟合初始采样点及其目标函数值。
    • 在每次迭代中,通过最小化采集函数(期望改进函数)选择下一个采样点,这个采样点是优化过程中认为可能改进最大的点。
  4. 采样点的可视化

    • 在每次新的采样点被选择并计算其目标函数值后,代码通过 plt.scatter 将新的采样点绘制在图上(红色点)。
    • 最后使用黑色点(plt.scatter(initial_points[:, 0], initial_points[:, 1], c='black', label='Samples'))表示所有采样点。

总结

  • 热力图展示了目标函数在二维空间中的值分布。

  • 黑色点表示在贝叶斯优化过程中计算目标函数值的采样点。

  • 贝叶斯优化过程通过代理模型(高斯过程)逐步选择新的采样点,以高效找到目标函数的全局最优解。

  • 通过可视化,可以直观地看到采样点如何逐步分布在目标函数的高值区域。

  • 代码通过贝叶斯优化算法在目标函数的二维参数空间中逐步逼近最优值。

  • 初始随机采样点经过高斯过程模型的拟合和采集函数的引导,逐步找到目标函数的最优解。

  • 可视化部分展示了采样点如何逐步逼近最优区域。

通过这个过程,贝叶斯优化有效地减少了目标函数评估次数,同时能够在计算代价昂贵的情况下找到全局最优解。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 昇思 25 天学习打卡营第 24 天 | MindSpore Pix2Pix 实现图像转换
  • 50、PHP 实现选择排序
  • 分布式锁的三种实现方式:Redis、基于数据库和Zookeeper
  • C#:枚举及位标志周边知识详解(小白入门)
  • Kafka知识总结(选举机制+控制器+幂等性)
  • 在 Elasticsearch 中实现采集自动扩展
  • Python urllib请求https接口报错
  • python异步编程,协程
  • java中的函数式接口介绍
  • python inf是什么意思
  • Centos安装、迁移gitlab
  • 数据透视——判别分析
  • 刷新历史新高后又大跌!剖析黄金现在适合投资吗?
  • 编程的魅力、学习路径、应用领域以及对未来的影响
  • docker笔记5-数据卷
  • CentOS 7 修改主机名
  • css布局,左右固定中间自适应实现
  • Elasticsearch 参考指南(升级前重新索引)
  • ES2017异步函数现已正式可用
  • Median of Two Sorted Arrays
  • mysql 5.6 原生Online DDL解析
  • node 版本过低
  • PHP那些事儿
  • Python_网络编程
  • Python学习笔记 字符串拼接
  • Rancher-k8s加速安装文档
  • spring学习第二天
  • SQLServer之创建显式事务
  • storm drpc实例
  • Vue官网教程学习过程中值得记录的一些事情
  • 不用申请服务号就可以开发微信支付/支付宝/QQ钱包支付!附:直接可用的代码+demo...
  • elasticsearch-head插件安装
  • ionic异常记录
  • linux 淘宝开源监控工具tsar
  • 阿里云重庆大学大数据训练营落地分享
  • ​草莓熊python turtle绘图代码(玫瑰花版)附源代码
  • # 日期待t_最值得等的SUV奥迪Q9:空间比MPV还大,或搭4.0T,香
  • #HarmonyOS:软件安装window和mac预览Hello World
  • (8)STL算法之替换
  • (HAL)STM32F103C6T8——软件模拟I2C驱动0.96寸OLED屏幕
  • (react踩过的坑)antd 如何同时获取一个select 的value和 label值
  • (二)换源+apt-get基础配置+搜狗拼音
  • (翻译)Quartz官方教程——第一课:Quartz入门
  • (附源码)spring boot智能服药提醒app 毕业设计 102151
  • (三)模仿学习-Action数据的模仿
  • (十六)视图变换 正交投影 透视投影
  • (一)u-boot-nand.bin的下载
  • (转)Android学习笔记 --- android任务栈和启动模式
  • (转)shell中括号的特殊用法 linux if多条件判断
  • (转载)hibernate缓存
  • *算法训练(leetcode)第三十九天 | 115. 不同的子序列、583. 两个字符串的删除操作、72. 编辑距离
  • ... fatal error LINK1120:1个无法解析的外部命令 的解决办法
  • .NET : 在VS2008中计算代码度量值
  • .NET/ASP.NETMVC 深入剖析 Model元数据、HtmlHelper、自定义模板、模板的装饰者模式(二)...
  • .NET/C# 在代码中测量代码执行耗时的建议(比较系统性能计数器和系统时间)